[英]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.