考虑代码:
int i, j;
i = (i = 1, j = 3);
i++;
cout<<i<<" "<<j;
这打印4 3
(c ++ 14)。
我读到逗号运算符在左边计算表达式并返回右边的表达式。现在,如果这是正确的,我想知道j = 3的返回值是多少?它是右值吗?或者对左值的引用?
这实际上是如何运作的?
答案 0 :(得分:2)
为了计算(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。
答案 1 :(得分:2)
我想知道j = 3的返回值是多少?
作业操作*返回(或&#34;评估为&#34;)对操作左侧的引用,在本例中为j
。
所以i = (i = 1, j = 3);
与:
i = 1;
j = 3;
i = j;
*对于内置类型。自定义operator=
重载可能会返回他们想要的任何内容,尽管它建议返回对*this
的引用,因为这是C ++程序员的预期行为。
答案 2 :(得分:0)
赋值运算符返回一个引用左操作数的左值。它从右到左分组。 ([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++;