Я TA для вводного класса C++. Следующий вопрос был задан на тест на прошлой неделе:C++ Выходной порядок оценки со встроенными вызовами функций
Какой выход из следующей программы:
int myFunc(int &x) {
int temp = x * x * x;
x += 1;
return temp;
}
int main() {
int x = 2;
cout << myFunc(x) << endl << myFunc(x) << endl << myFunc(x) << endl;
}
Ответ, мне и всем моим коллегам, очевидно:
8
27
64
Но теперь несколько студентов указали, что, когда они запускают это в определенных условиях, они фактически получают противоположное:
64
27
8
Когда я запускаю его в своей Linux-среде, используя gcc, я получаю то, что ожидаю. Используя MinGW на моей машине с Windows, я понимаю, о чем они говорят. Кажется, что сначала оценивается последний вызов myFunc, затем второй вызов, а затем первый, а затем, когда он имеет все результаты, он выводит их в обычном порядке, начиная с первого. Но поскольку вызовы были сделаны не по порядку, цифры противоположны.
Мне кажется, что это оптимизация компилятора, позволяющая оценивать вызовы функций в обратном порядке, но я действительно не знаю почему. Мой вопрос: правильны ли мои предположения? Это то, что происходит в фоновом режиме? Или что-то совершенно другое? Кроме того, я действительно не понимаю, почему было бы полезно оценить функции назад, а затем оценить выход вперед. Результат должен быть перенаправлен из-за того, как работает ostream, но похоже, что оценка функций также должна быть направлена вперед.
Благодарим за помощь!
Спасибо за объяснение, я подумал, что это экземпляр неопределенной спецификации, но теперь я могу быть в этом уверен. И это может стать примером для студентов, почему побочные эффекты и чрезмерно сложное гнездование плохие :) –
+1. И, в частности, обратите внимание, что программа не демонстрирует неопределенного поведения. 'x' все еще изменяется не более одного раза между двумя точками последовательности, поскольку выполнение вызова функции не может чередовать друг друга. Его поведение неуказано, и после выражения выражения cout значение 'x' должно быть 5. –
@onebyone: Очень забавная часть« ненависти »... :) –