繁体   English   中英

分配中使用逗号运算符

[英]Comma operator used in assignment

考虑代码:

int i, j;
i = (i = 1, j = 3);
i++;
cout<<i<<" "<<j;

这打印了4 3 (c ++ 14)。

我读到逗号运算符在其左侧计算表达式,并在其右侧返回表达式。 现在,如果这是正确的,我想知道j = 3的返回值是多少? 是右值吗? 还是对左值的引用?

这实际上如何工作?

为了计算(i = 1,j = 3),它从左到右计算用逗号分隔的表达式,并返回最后一个(最右边)表达式的值。 因此,它计算i = 1(i变为1),然后计算j = 3(j变为3),然后返回3。

计算(i = 1,j = 3)后返回3,然后执行赋值,将i设置为3。

然后计算i ++,将i设置为4。

然后,i和j被打印。

我想知道j = 3的返回值是多少?

赋值运算*返回(或“评估为”)对该运算左侧的引用(在本例中为j

所以i = (i = 1, j = 3); 等同于:

i = 1;
j = 3;
i = j;

*对于内置类型。 自定义operator=重载可能会返回所需的任何内容,尽管建议返回对*this的引用,因为这是C ++程序员的预期行为。

赋值运算符返回一个引用左操作数的左值。 它从右到左分组。 [expr.ass] )。 请注意,说返回对左值的引用没有意义-它要么返回左值,要么不返回左值。

逗号运算符从左操作数执行值计算和副作用,将其丢弃,然后对右操作数执行相同的操作。 [expr.comma]

因此,重构逗号运算符将产生以下等效代码:

i = 1;      // left operand, value discarded
i = j = 3;  // right operand, value preserved
i++;

然后重构复合分配将产生以下仍等效的代码:

i = 1;
j = 3;     // rightmost assignment
i = j;     // leftmost assignment
i++;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM