Возможный дубликат:
Каков правильный ответ для cout << C ++ << с ;?
У меня есть следующий код —
int a= 7;
const int &b = a;
int &c = a;
если я использую
cout << endl << ++c << '\t' << a << '\t' << b << '\t' << c;
это печатает
"8 7 7 8"
Однако, если я использую
cout << endl << a << '\t' << b << '\t' << ++c << '\t' << a << '\t' << b << '\t' << c;
это печатает
"8 8 8 8 8 8"
Как именно это происходит? Это связано с оптимизацией ?? Если да, как я могу выключить его в ideone.com ???
Эффективно оператор<< это вызов функции, c ++ может оценивать аргументы, передаваемые функции в любом порядке, который ей нравится, поэтому ++ c inc сначала выполняется вполне законно вашим компилятором — мой делает что-то другое.
Интересно мой компилятор печатает
8 8 8 7 7
Некоторые компиляторы предоставляют переключатели для порядка оценки параметров функций, но если вам действительно нужно их использовать, я бы спросил себя о причинах этого, так как в коде что-то гораздо более неправильное, и вместо этого напишу его переносимым способом.
a
, b
, а также c
все один и тот же объект. Однако порядок оценки аргументов функций не определен. Таким образом, все, что компилятор выберет для оценки первым — это нормально. Кажется, в вашем втором выражении он оценивает ++c
первый. Способ избежать проблем не состоит в том, чтобы сложить модификацию с остальной частью выражения, то есть увеличить c
либо до, либо после вывода.