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

标签 c++ pass-by-reference

考虑代码:

#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++ 语言规范在“排序”主题上花费了相当多的篇幅,它(非常笼统地说)指定了求值顺序。长话短说,在此示例中,x 未根据 refcube(x) 排序,在生成输出到 std 的表达式中: :cout,这样的编译器可以自由地先编译表达式的任何一部分。

关于c++ - 在 C++ 中使用按引用传递的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493609/

相关文章:

c++ - 在 QMainWindow 中创建 Widget 并加载到 ScrollArea

javascript - Vue - 监听 Prop 变化(对象),观察不触发

c++ - OpenCV 非常慢 - 网络摄像头

c++ - 重载赋值运算符 : if we return (*this),,它是指针/地址处的值,赋值运算符的正确语法是什么?

Java 内存、按值传递、按引用传递

c - 可以使传递的指针为空的函数

c++ - 如何在模板函数中传递文字

c++ - 为什么锁定 std::mutex 不会阻塞线程

c++ - 如何使用 C++ 在 %appdata% 中创建文件

c++ - 将类或函数作为模板参数