首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"=“操作符返回什么?

"=“操作符返回什么?
EN

Stack Overflow用户
提问于 2017-01-02 18:24:38
回答 4查看 4.3K关注 0票数 9

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

代码语言:javascript
复制
std::cout << "output" << "stream";

C++首先从最左边开始(std::cout),然后是<<操作符,它在右边接受字符串文本("output"),并将其放在操作符左侧的对象(std::cout)。然后,C++返回操作符左侧的对象(std::cout),然后继续代码,这是另一个<<操作符。

"=“操作符返回什么?

如果我做了

代码语言:javascript
复制
double wage = 5;
double salary = wage = 9999.99;

我以为"=“操作符只返回"=”的左或右操作数。因此,按照我的逻辑,在工资初始化的行中,工资是用工资的值初始化的,然后"=“操作符返回工资或工资(比如说工资),然后将9999.99分配给工资,但是工资没有了,它应该保持它的值5。

但是当我在“工资”初始化后检查“工资”和“工资”的值时,两者的值都是9999.99。如果我应用上面对std::cout使用的相同逻辑,应该只有一个变量,即“工资”或“工资”,其值为9999.99。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-02 18:36:01

赋值运算符是从右到左结合的,一般来说,它通过引用返回它的左操作数。一般来说,对于所有内置的类型,我可以想到的库类型,这都是正确的,这就是您应该如何编写赋值操作符。

这意味着

代码语言:javascript
复制
double salary = wage = 9999.99;

完全相同

代码语言:javascript
复制
wage = 9999.99;
double salary = wage;

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

代码语言:javascript
复制
double salary = --(wage = 9999.99);

salary显然得到9998.99的值,但重要的是要注意,wage也是这样;如果赋值返回正确的参数,那么wage最终仍然是9999.99,因为临时值在工资分配发生后会减少。

正如Ben在下面的评论中所指出的,虽然我的回答是正确的,但我使用的问题中的例子有点误导。这是因为尽管=令牌在所讨论的代码中出现了两次,double salary = wage = 9999.99实际上并不是调用两次赋值,而是调用赋值,然后构造一个新的双重。这个例子最好继续下去如下:

代码语言:javascript
复制
double salary = 0.0;
salary = wage = 9999.99;

现在我们真正地将赋值操作符链接起来,我以前关于优先级和返回的所有评论都适用于这里的第二行代码。

票数 20
EN

Stack Overflow用户

发布于 2017-01-02 18:26:20

咨询运算符优先表。赋值运算符=是“从右到左”的结合性。因此,表达式被有效地计算为:

代码语言:javascript
复制
double salary = (wage = 9999.99);

首先发生wage = 9999.99

票数 3
EN

Stack Overflow用户

发布于 2017-01-02 23:07:18

表达式有一个值和一个副作用.值(您所称的“返回”)是这个表达式的一个操作数将用于另一个运算符的值。(即使没有这样的运算符,它仍然是计算出来的)。寻找表达式值的过程称为值计算。

该值可能具有任何价值范畴。副作用是发生的任何其他事情,例如更新内存位置或调用函数。

通常,副作用可能发生或不可能发生,在更大的子表达式中使用该值之前。著名的是,后缀-++运算符在数值和副作用之间的时间上可能有很大的不同。

对于赋值表达式,值是左操作数(具有值类别"lvalue"),其副作用是更新由左操作数指定的对象以保存右操作数的值;并在值计算之前对副作用进行排序,这保证了如果较大的表达式使用该值,则它指定一个已经存储在其中的新值的内存位置。

如果守则是:

代码语言:javascript
复制
salary = wage = 9999.0;

那么运算符结合规则就意味着它是salary = (wage = 9999.0);。内部表达式有值wage和值类别lvalue,内部表达式的副作用是名为wage的变量获得存储在其中的9999.0,而赋值运算符的排序确保结果在我们进入下一个最外层表达式之前已经存储在那里。

然后是salary = X,其中X是上一段中描述的值,即它等价于salary = wage;

注意,您的实际代码是一个声明,声明中的第一个=符号不是赋值运算符。相反,它是一个语法标记,即将出现一个初始化程序;您的代码与以下代码相同:

代码语言:javascript
复制
double salary { wage = 9999.0 };
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41431631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档