cout变量和通过引用改变变量的函数

时间:2017-12-10 22:14:00

标签: c++

假设我们有下一个代码:

#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 ++下编译它。

2 个答案:

答案 0 :(得分:5)

不,评估顺序是实施定义。

在C ++ 17之前,评估的顺序是未指定的。 (请参阅评论和M.M&#39的答案。)

http://en.cppreference.com/w/cpp/language/eval_order

答案 1 :(得分:4)

从C ++ 17开始,operator<<具有左右排序(即左操作数在右操作数之前排序)。因此,如果您使用符合最新标准的编译器,您应该看到10 4。 (参考:N4659 [over.match.oper] / 2,  [expr.shift] / 4)

在C ++ 17之前,它未被指定。