Другие языки программирования и технологии

C++. Как работает постфиксный инкремент?

Есть 2 строчки кода:
int i = 0;
cout << i++ << i++ << i++;
Почему на консоль выводится 210? Я бы понял, если выводилось бы 012 или 222. Объясните почему выводится в обратном порядке
Рахим Сагитов
Рахим Сагитов
1 141
Потому, что это типичный пример "неопределённого поведения".

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

В твоём случае имеется ОДНО выражение, содержащее три операции << и три операции ++.Операции << код, генерируемый компилятором, выполнит строго слева направо. А вот операции ++ будут выполнены в том порядке, который компилятор сочтёт оптимальным.

P.S. Хорошим тоном являет НЕ использовать повторно в том же выражении переменную, к которой применены операции ++ или --.
Антон Василюк
Антон Василюк
89 706
Лучший ответ
Рахим Сагитов То есть, на самом деле компилятор начинает выводить i на экран начиная с последнего?
Рахим Сагитов Спасибо за развернутый ответ и пояснение
Всё зависит от того, как компилируются равнозначные действия - справа налево или слева направо.
И что приоритетней в равнозначных операциях - << или ++
Это равнозначно вопросу "Сколько будет 6/3*2? 4 или 1 ?"
Павел Газнюк
Павел Газнюк
53 584
Александр Шалудкин В принципе, компилятор может выдать что угодно:
000
333
012
210
201
102
и т. д.
// Всё, что нужно знать об инкременте (декременте)
#include <iostream>
using namespace std;
int main() {
int a, b, c, d;
a = b = c = d = 0;
cout
<< a++ << ' ' << a++ << ' ' << a++ << '\n'
<< ++b << ' ' << ++b << ' ' << ++b << '\n';
auto cc = c++ + c++ + c++;
auto dd = ++d + ++d + ++d;
cout << cc << ' ' << dd << endl;
system("pause");
}
Потому что << - это еще и сдвиг.
Рахим Сагитов Если последняя цифра 2,а за ней нету оператора сдвига, то почему на консоли выводится 0? Можете, пожалуйста, описать порядок действия. Сначала инкремент потом свдиг?
Александр Шалудкин Не в этом дело, здесь cout возвращает ostream &, так что oerator<< перегружен.
А у меня выводит 012. В чем компилируешь?
СМ
Сергей Мех
15 408