Есть 2 строчки кода:
int i = 0;
cout << i++ << i++ << i++;
Почему на консоль выводится 210? Я бы понял, если выводилось бы 012 или 222. Объясните почему выводится в обратном порядке
Другие языки программирования и технологии
C++. Как работает постфиксный инкремент?
Потому, что это типичный пример "неопределённого поведения".
Стандарт не определяет последовательность, в которой будут вычислены части выражения. Потому код, генерируемый компилятором, может вычислять части выражения в любом порядке - независимо от того, как выражение записано в исходном коде.
В твоём случае имеется ОДНО выражение, содержащее три операции << и три операции ++.Операции << код, генерируемый компилятором, выполнит строго слева направо. А вот операции ++ будут выполнены в том порядке, который компилятор сочтёт оптимальным.
P.S. Хорошим тоном являет НЕ использовать повторно в том же выражении переменную, к которой применены операции ++ или --.
Стандарт не определяет последовательность, в которой будут вычислены части выражения. Потому код, генерируемый компилятором, может вычислять части выражения в любом порядке - независимо от того, как выражение записано в исходном коде.
В твоём случае имеется ОДНО выражение, содержащее три операции << и три операции ++.Операции << код, генерируемый компилятором, выполнит строго слева направо. А вот операции ++ будут выполнены в том порядке, который компилятор сочтёт оптимальным.
P.S. Хорошим тоном являет НЕ использовать повторно в том же выражении переменную, к которой применены операции ++ или --.
Рахим Сагитов
То есть, на самом деле компилятор начинает выводить i на экран начиная с последнего?
Рахим Сагитов
Спасибо за развернутый ответ и пояснение
Всё зависит от того, как компилируются равнозначные действия - справа налево или слева направо.
И что приоритетней в равнозначных операциях - << или ++
Это равнозначно вопросу "Сколько будет 6/3*2? 4 или 1 ?"
И что приоритетней в равнозначных операциях - << или ++
Это равнозначно вопросу "Сколько будет 6/3*2? 4 или 1 ?"
// Всё, что нужно знать об инкременте (декременте)
#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");
}
#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. В чем компилируешь?
Рахим Сагитов
Visual Studio 2017
Похожие вопросы
- C++ не работает программа посмотрите пожалуйста))
- Почему при вводе маленьких значений коэффициентов программа на c++ не работает
- вопрос по C++ как работать с заголовками? компилятор ругается, непойму как связать 3 файла. исходники внутри.
- C++ не работает часть программы
- А зачем пишут на C# приложения работающие только на Windows, когда можно писать на Java кроссплатформенные?
- [c++] не работает long int переменная объявленная как long int a; занимает всего 4 байта ((( Что может быть не так?
- c++ не работает программа
- Вопрос про математические процессы инкрементов и декрементов с префиксами и постфиксами. C++
- C#. ++x или x++ В чем разница при записи инкремента этими двумя способами?
- Делаю нейронную сеть на C++. Как в C++ работать с микрофоном?