在 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
的表达式中,这样的编译器可以自由编译首先是表达式的任何一部分。
考虑代码:
#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
的表达式中,这样的编译器可以自由编译首先是表达式的任何一部分。