оптимизация компилятора — порядок печати в переполнении стека

Возможный дубликат:
Каков правильный ответ для 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 ???

2

Решение

Эффективно оператор<< это вызов функции, c ++ может оценивать аргументы, передаваемые функции в любом порядке, который ей нравится, поэтому ++ c inc сначала выполняется вполне законно вашим компилятором — мой делает что-то другое.

Интересно мой компилятор печатает

8       8       8       7       7

Некоторые компиляторы предоставляют переключатели для порядка оценки параметров функций, но если вам действительно нужно их использовать, я бы спросил себя о причинах этого, так как в коде что-то гораздо более неправильное, и вместо этого напишу его переносимым способом.

3

Другие решения

a, b, а также c все один и тот же объект. Однако порядок оценки аргументов функций не определен. Таким образом, все, что компилятор выберет для оценки первым — это нормально. Кажется, в вашем втором выражении он оценивает ++c первый. Способ избежать проблем не состоит в том, чтобы сложить модификацию с остальной частью выражения, то есть увеличить c либо до, либо после вывода.

2

По вопросам рекламы [email protected]