Это вопрос для начинающих.
Ниже приведен код C ++, с которым я работал
int main() {
int x=5, y=5;
cout<<x--;
cout<<",";
cout<<--x;
cout<<",";
cout<<y--<<","<<--y;
return 0;
}
При запуске в Turbo C ++ 3.0 следующий код выводится кодом:
5,3,4,4
При компиляции с Code :: Blocks в Windows (использует MinGW с GCC / G ++) выводится следующее:
5,3,4,3
Ранее я слышал, что иногда разные компиляторы ведут себя по-разному в зависимости от определенных проблем, но я не понимаю, почему этот результат отображается. Поскольку по логике, как мне кажется, вывод должен быть:
5,3,5,3
Подскажите, пожалуйста, причину такого вывода логически.
Спасибо!
Нет правильного или неправильного вывода. Ваш код имеет неопределенное поведение, и все возможно.
Причина кроется в пункте 1.9.15 (n3337) стандарта C ++ (выделено мной):
Если не указано иное, оценки операндов отдельных операторов и подвыражений отдельных
выражения не упорядочены. [Примечание: в выражении, которое оценивается более одного раза во время выполнения
программы непоследовательные и неопределенно последовательные оценки ее подвыражений не должны быть
выполняется последовательно в разных оценках. — конец примечания] Вычисления значения операндов
Оператор секвенируется перед вычислением значения результата оператора. Если побочный эффект на скаляр
объект не секвенирован относительно другого побочного эффекта на тот же скалярный объект или вычисления значения
используя значение того же скалярного объекта, поведение не определено.
В этой строке
cout << y-- << "," << --y;
Вы ввели два побочных эффекта (увеличение на postfix и prefix соответственно) и два вычисления значения (результаты y--
а также --y
) на скалярном объекте (y
) где они не упорядочены. Таким образом, ваша программа плохо сформирована и практически все является возможным выходом.
Подробнее об этом Вот.
cout<<y--<<","<<--y;
это выражение с двумя непоследовательными побочными эффектами на y
и, следовательно, имеет неопределенное поведение.