私はイントロC++クラスの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
gccを使用してLinux環境で実行すると、期待どおりの結果が得られます。私のWindowsマシンでMinGWを使用すると、彼らが話していることがわかります。myFuncへの最後の呼び出しを最初に評価し、次に2番目の呼び出し、次に最初の呼び出しを評価しているようです。すべての結果が得られると、最初の呼び出しから通常の順序で出力されます。しかし、呼び出しが順不同で行われたため、番号は反対です。
私はコンパイラの最適化であり、関数呼び出しを逆の順序で評価することを選択しているように見えますが、その理由はよくわかりません。私の質問は:私の仮定は正しいですか?それはバックグラウンドで何が起こっているのですか?それともまったく違うものがありますか?また、関数を逆方向に評価してから出力を順方向に評価することに利点がある理由がよくわかりません。ostreamの動作方法のために出力は順方向である必要がありますが、関数の評価も順方向である必要があるようです。
ご協力いただきありがとうございます!