[英]Does the C/C++ ternary operator actually have the same precedence as assignment operators?
我查詢的幾乎所有C / C ++運算符優先級表都列出了三元條件運算符,其優先級高於賦值運算符。 但是,有一些表,例如Wikipedia上的表和operator-precedence.com上的表,這些表處於相同的優先級。 是更高的還是相同的?
在C ++語法中,
assignment-expression: conditional-expression logical-or-expression assignment-operator initializer-clause throw-expression conditional-expression: logical-or-expression logical-or-expression ? expression : assignment-expression initializer-clause: assignment-expression braced-init-list
可以結合到
assignment-expression: logical-or-expression logical-or-expression ? expression : assignment-expression logical-or-expression assignment-operator assignment-expression logical-or-expression assignment-operator initializer-clause throw-expression
如果僅查看=
和?:
,並且如果忽略之間的內部表達式?
和:
,這顯然賦予?:
和=
完全相同的優先級。
這與C語法不同,在C語法中, ?:
的左操作數或右操作數都不能將賦值運算符作為其最高運算符。
assignment-expression: conditional-expression unary-expression assignment-operator assignment-expression conditional-expression: logical-OR-expression logical-OR-expression ? expression : conditional-expression
因此,對於C,給它們賦予不同的優先級是有意義的。
就是說,優先級別僅是標准實際所說的內容的近似值,您選擇的任何優先級別在某些情況下都會表明該級別具有誤導性或完全是錯誤的。 根據您的解釋, ?:
的內部表達可能是其中之一,對我而言。
您會在標准中找到:
58)運算符的優先級不是直接指定的,但是可以從語法中得出。 (注意)
這意味着將推斷出優先級表,而不指定優先級表。 只要它們的行為相同,就可以說兩者都是正確的。 因此,即使優先級表將它們放置為具有相同的優先級,或將三元數放置在賦值運算符的上方,實際上,由於語法的原因,也會發生相同的情況。
請注意, 關聯在這里起着更大的作用(這也是從語法中得出的)。
即使您假設它們具有相同的優先級:
a = b ? c : d;
將被視為a = (b ? c : d)
因為它們都是從右到左的關聯 。
C ++的答案是?:
和=
具有相同的優先級。 是的,幾乎每個C ++運算符優先級表都是錯誤的。
在C語言中, ?:
是否大於=
並不重要,因為在C語言中,不允許?:
運算符求值為l值,如果優先級影響行為,則必須這樣做。 (假設它們已經是RTL關聯的)。 例如,請參見Luchian Crigore的答案下的討論。
由於早期的C ++運算符優先級表可能已從C表復制並擴展,因此此錯誤可能是如此普遍。 也許錯誤仍然存在,因為很少使用反例-a a?b:c=d
形式a?b:c=d
表達式。 也許。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.