我有一个代码。代码打印1236(g++ 7.5.0)
输出取决于编译器吗?(例如输出可以是3216)
#include <bits/stdc++.h>
using namespace std;
int foo(int& x) {
std::cout << ++x;
return x;
}
int main() {
int i = 0;
cout << foo(i) + foo(i) + foo(i) << endl; // 1236
}
Run Code Online (Sandbox Code Playgroud)
不,输出不依赖于编译器(对bits/stdc++.h废话取模)。三个调用的求值顺序foo(i)未指定,但这不会影响输出:函数调用不是交错的,因此某些调用将递增i到 1,打印该值并返回它(作为副本),然后是其中之一另外两个将分配、打印并返回 2,然后最后一个将执行 3,并且它们的返回值总和将始终为 6。
请注意,如果foo返回int&,最后的输出可能是任何数字 6\xe2\x80\x939,因为实现可能不会选择i在返回时立即读取加法。不过,该行为仍将被定义,因为这些读取将相对于任何写入进行不确定的排序。
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |