C語言中怎樣理解三目運算子(條件運算子)的右結合性

2021-06-18 14:38:01 字數 769 閱讀 1974

涉及了c中的優先順序、結合性、求值順序。結合性只有在相同優先順序的運算子間才起作用,比如a+b*c,+與*優先順序不同,這裡根本不用去管結合性。而a+b+c則需要進行結合性考慮了,如果+為左結合性,那麼應該理解為:(a+b)+c,如果+為右結合性,那麼應該理解為a+(b+c),當然了,我們已經知道+為左結合性了。

對於?:,在c中與它優先順序相同的只有它自己,因此只有連續的?:才會體現出它的右結合性,即a?b:c?d:e中,根據右結合性可知應理解為a?b:(c?d:e)。顯然,上述問題中是體現不出這種結合性來的。

再者,還有乙個求值順序的問題,,a?b:c在ansi中規定了表示式的求值順序,c語言規定先對a求值,非零則對b求值並作為該表示式的值,為零則對c求值並作為表示式的值,並且b和c中有且僅有乙個會被求值。

對於題目中的就應該是:先進行(--a == b++)的求值,根據是否為零,會對(a++)或(b++)進行求值。說白了,也就是只有兩種可能性:

可能性1:先算(--a == b++),再算(a++);可能性2:先算(--a == b++),再算(b++)。

至於(--a == b++)中到底是先算--a 還是b++則僅從c語言這個角度是無法判別的,這是個實現問題,如果要想寫出健壯的可移植的**就應該避免這種表述.

總結一下,就是先看優先順序,次看結合性,有的求值有序,有的則無序。 實際上,一條語句中出現多次同乙個變數的自增或自減是不合規範的,因為這種寫法出現的結果是不確定的,根據編譯器而定。a++表示語句執行後a = a + 1,到底有多後?有2個a++怎麼辦?這都是編譯器內部機制的問題。真正好的程式設計師是避免這種情況的。

C語言中怎樣理解三目運算子(條件運算子)的右結合性

涉及了c中的優先順序 結合性 求值順序。結合性只有在相同優先順序的運算子間才起作用,比如a b c,與 優先順序不同,這裡根本不用去管結合性。而a b c則需要進行結合性考慮了,如果 為左結合性,那麼應該理解為 a b c,如果 為右結合性,那麼應該理解為a b c 當然了,我們已經知道 為左結合性...

C語言 條件運算子 三目運算子

1 if a b else max a b a b 無論a b是否滿足,都向同乙個變數賦值 條件運算子優先於賦值運算子,所以先求解條件表示式,再將它的值賦值給max 2 a b printf d n a printf d n b 注意此處表示式後面沒有 a b a 100 b 200 表示式2和表示...

C語言 三目運算子(條件運算子)

今天在看c語言的時候看到了下面的 廢話少說,直接上 include intmain inta,b,c intmax 執行結果如下 please enter three integer numbers 34 67 12max is 67 這個例子很簡單,其中運用了三目運算子 m a b?a b 如果在...