在 C++ 中使用按引用传递的意外输出

Unexpected output on using pass by reference in C++

考虑代码:

#include<iostream>
using namespace std;

int refcube(double &ra)
{
ra*=ra*ra;
return ra;
}

int main()
{
auto x=2.0;
cout<<"cube of "<<x<<" is "<<refcube(x)<<endl;
return 0;
}

输出为:

cube of 8 is 8

为什么第一个x的值显示为8而不是2

因为未指定评估顺序。

编译器可能会生成调用refcube(x)的代码,并在生成代码前后计算其值,得到x的值,输出到std::cout.

您的编译器选择编译此 C++ 代码作为先调用 refcube(x),然后通过评估 x

C++ 语言规范在 "sequencing" 的主题上花费了相当多的篇幅,其中(非常松散地说)指定了求值顺序。长话短说,在这个例子中,x 没有相对于 refcube(x) 排序,在生成输出到 std::cout 的表达式中,这样的编译器可以自由编译首先是表达式的任何一部分。