Я - TA для вводного класса С++. На прошлой неделе был задан следующий вопрос:
Каков результат следующей программы:
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, но похоже, что оценка функций также должна быть направлена вперед.
Спасибо за вашу помощь!