[英]What's the precedence of comma operator inside conditional operator in C++?
這里發生了什么事?
#include <iostream>
using namespace std;
int main(){
int x=0,y=0;
true? ++x, ++y : --x, --y;
cout << "x: " << x << endl;
cout << "y: " << y << endl; //why does y=0 here?
x=0,y=0;
false ? ++x, ++y : --x, --y;
cout << "x: " << x << endl;
cout << "y: " << y << endl;
}
x: 1
y: 0
x: -1
y: -1
第二種情況似乎不錯。 我希望在第一種情況下 x 和 y 都增加到 1 但只有左側操作數增加。
第一個相當於:
(true ? (++x, ++y) : (--x)), --y;
第二個相當於:
(false ? (++x, ++y) : (--x)), --y;
因此--y
總是被執行。 在第一行中,首先執行增量,因此x = 1, y = 0
是預期的。 在第二行中,首先執行x
的遞減,因此x = -1, y = -1
是預期的。
如果有人想知道為什么
++x
和++y
之間的逗號沒有相同的效果,那是因為(true? ++x)
根本無效。 因此,編譯器會一直掃描,直到找到:
,但除此之外,它會在到達較低優先級運算符[(,
在本例中) 或語句結尾] 時停止。
y
為零是因為逗號 在所有 C++ 運算符中的優先級最低。 因為它的優先級低於三元條件運算符,所以條件運算符被解析為true? ++x, ++y : --x
true? ++x, ++y : --x
和false? ++x, ++y : --x
false? ++x, ++y : --x
。 在這兩種情況下,-- --y
語句都是無條件執行的。
編輯第一個逗號是不同的,因為編譯器發現了一個?
,所以現在它需要一個:
來完成條件的“when true”表達式。 這就是++x
和++y
都被采用的原因。
閱讀標准
§5.18 逗號運算符 [expr.comma]
¶1 逗號運算符從左到右分組。
expression: assignment-expression expression , assignment-expression
一對用逗號分隔的表達式從左到右求值; 左邊的表達式是一個丟棄值表達式(第 5 條)。 83與左表達式相關的每個值計算和副作用在與右表達式相關的每個值計算和副作用之前排序。 結果的類型和值是右操作數的類型和值; 結果與其右操作數屬於相同的值類別,並且如果其右操作數是泛左值和位域,則結果是位域。
¶2 在逗號被賦予特殊含義的上下文中,[ 示例:在函數參數列表 (5.2.2) 和初始值設定項列表 (8.5) 中 - 結束示例 ] 第 5 條中描述的逗號運算符只能出現在括號中. [ 例子:
f(a, (t=3, t+2), c);
有三個參數,其中第二個的值為 5。--end example ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.