簡體   English   中英

C / C ++三元運算符實際上是否與賦值運算符具有相同的優先級?

[英]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,給它們賦予不同的優先級是有意義的。

就是說,優先級別僅是標准實際所說的內容的近似值,您選擇的任何優先級別在某些情況下都會表明該級別具有誤導性或完全是錯誤的。 根據您的解釋, ?:的內部表達可能是其中之一,對我而言。

您會在標准中找到:

5個表達式[expr]

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM