簡體   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