Изменения в ссылочных переменных в С++

#include <iostream>
using namespace std;

int main()
{
    int x=80;
    int &y=x;
    cout<<"x"<<x<<" "<<"y"<<y++; 
    return 0;
}

Приведенный выше код дал мне следующий результат:

81 80

Может ли кто-нибудь объяснить мне, как значение x изменяется на 81? Значение y равно 80, а позже оно увеличивается до 81, но как это отразилось в x?

Означает ли это, потому что y является ссылочной переменной? Затем значение должно было быть изменено как в x, так и y?

Ответ 1

У вас есть поведение undefined, потому что ваши операции находятся между двумя последовательными точками последовательности (нет точек последовательности между оценкой аргументов функции). Вы можете свободно воспринимать точки последовательности как "временные" маркеры и между двумя последовательными, вам не разрешается изменять одну и ту же переменную более одного раза.

В основном ваш код эквивалентен

std::cout << x << x++; // undefined behaviour

поскольку y является просто ссылкой (псевдоним) для x.

1.9 Выполнение программы [intro.execution] (подчеркните мое)

14) Каждое вычисление значения и , связанное с полное выражение секвенируется перед каждым вычислением значения и стороной эффект, связанный со следующим полным выражением, которое должно быть оценено.

15) За исключением тех случаев, когда отмечено, оценки операндов отдельных операторы и подвыражения отдельных выражений unsequenced. [Примечание: в выражении, которое оценивается более одного раза во время выполнения программы, без последствий и неопределенно необязательные оценки его подвыражений не должны выполняться последовательно в разных оценках. - конечная нота] Значение вычисления операндов оператора секвенированы до вычисление значения результата оператора. Если побочный эффект на скалярный объект не зависит от другого побочного эффекта один и тот же скалярный объект или вычисление значения, используя значение один и тот же скалярный объект, и они не являются потенциально параллельными (1.10), поведение undefined. [Примечание. В следующем разделе применяются аналогичные, но более сложные ограничения на потенциально параллельные вычисления. -endnote]

При вызове функции (независимо от того, является ли функция встроенной), каждый вычисление значения и побочный эффект, связанный с любым аргументом выражение или выражение postfix, обозначающее вызываемый функция, секвенируется перед выполнением каждого выражения или утверждение в теле вызываемой функции. [Примечание: значение вычисления и побочные эффекты, связанные с различными аргументами выражения не подвержены влиянию. - конечная нота] Каждая оценка в вызывающая функция (включая другие вызовы функций), которая не является в противном случае, в определенной последовательности, до или после выполнения тело вызываемой функции неопределенно упорядочено с учетом к выполнению вызываемой функции .9 Несколько контекстов в С++ вызывают оценку вызова функции, даже если соответствующая синтаксис вызова функции появляется в блоке перевода. [ Пример: Оценка нового выражения вызывает одно или несколько распределений и конструкторские функции; см. 5.3.4. В другом примере, вызов функция преобразования (12.3.2) может возникать в контекстах, в которых нет синтаксис вызова функции.

Связанный: fooobar.com/info/59242/...