假设我们有下一个代码:
#include<iostream>
using namespace std;
int change(int &temp){
temp += 2;
return 10;
}
int main(){
int nmb = 2;
cout << change(nmb) << " " << nmb << endl;
}
我认为它应该像cout一样打印出nmb的新值,但它打印旧版本的nmb。
而不是想要的结果10 4,我得到结果10 2。 为什么cout打印出旧的nmb值,因为cout首先打印出更改然后打印nmb?
我使用标准的c ++ 11在g ++下编译它。
答案 0 :(得分:5)
不,评估顺序是实施定义。
在C ++ 17之前,评估的顺序是未指定的。 (请参阅评论和M.M&#39的答案。)
答案 1 :(得分:4)
从C ++ 17开始,operator<<
具有左右排序(即左操作数在右操作数之前排序)。因此,如果您使用符合最新标准的编译器,您应该看到10 4
。 (参考:N4659 [over.match.oper] / 2,
[expr.shift] / 4)
在C ++ 17之前,它未被指定。