"="运算符返回什么?

gig*_*igi 7 c++

据我所知,C++从左到右工作.例如,如果我这样做:

std::cout << "output" << "stream";
Run Code Online (Sandbox Code Playgroud)

C++首先从最左边的东西(std :: cout)开始,然后是<<运算符,它取右边的字符串文字("输出")并将它放到运算符左边的对象(std :: COUT).然后C++返回运算符左侧的对象(std :: cout),然后继续代码,另一个<<运算符.

"="运算符返回什么?

如果我做

double wage = 5;
double salary = wage = 9999.99;
Run Code Online (Sandbox Code Playgroud)

我认为"="运算符只返回"="的左或右操作数.因此,根据我的逻辑,在工资初始化的行中,工资用工资值初始化,然后"="运算符返回工资或工资(比如工资),然后它将9999.99分配给工资,但工资是走了,应该保持5的价值.

但是当我在"工资"初始化之后检查"薪水"和"工资"的值时,两者的值都是9999.99.如果我应用与上面使用std :: cout相同的逻辑,那么应该只有一个变量,"salary"或"wage",值为9999.99

Nir*_*man 18

赋值运算符是从右到左的关联,一般来说通过引用返回其左操作数.一般而言,这适用于所有内置类型,我能想到的库类型,以及您希望如何编写赋值运算符.

这意味着

double salary = wage = 9999.99;
Run Code Online (Sandbox Code Playgroud)

完全一样

wage = 9999.99;
double salary = wage;
Run Code Online (Sandbox Code Playgroud)

请注意,在这里的第二行,salary设置为wage,而不是9999.99.区别在这里并不重要,但在某些情况下可能会有所不同.例如(感谢贾斯汀时间):

double salary = --(wage = 9999.99);
Run Code Online (Sandbox Code Playgroud)

salary无论如何,显然得到的值为9998.99,但重要的是要注意这wage一点; 如果赋值返回了正确的参数,那么wage最终仍将是9999.99,因为临时将在工资分配发生后减少.

正如Ben Voigt在下面的评论中指出的那样,虽然我的答案是正确的,但我使用的问题的例子有点误导.这是因为尽管=令牌在相关代码中出现double salary = wage = 9999.99两次,但实际上并未调用赋值两次,而是调用赋值然后构造一个新的double.这个例子会更好地继续如下:

double salary = 0.0;
salary = wage = 9999.99;
Run Code Online (Sandbox Code Playgroud)

现在我们真正链接赋值运算符,我之前关于优先级和返回的所有注释都适用于此处的第二行代码.