2013-03-26 51 views
4

如果我有這樣的條件:的語義檢查,如果條件

if (X && Y) {} 

請問編譯器檢查Y如果X是假的?它依賴於編譯器嗎?

+0

如果它真的是空的,編譯器可能會優化它,而且兩者都不會被檢查。 :) – Mike 2013-03-26 13:29:24

+0

可能重複:http://stackoverflow.com/questions/628526/is-short-circuiting-boolean-operators-mandated-in-cc-and-evaluation-order – 2013-03-26 13:29:28

+0

檢查是在執行運行時完成的,而不是在編譯階段 – MOHAMED 2013-03-26 13:30:58

回答

10

在C和most other languages短路評估是有保證的。因此Y僅在X評估爲真時才被評估。

這同樣適用於X || Y - 在這種情況下Y僅在X評估爲false時才被評估。

請參閱Mike's answer以參考C規範,其中提及並保證了此行爲。

+0

不允許C評估先是'Y',然後'X'? – 2013-03-26 13:29:01

+2

不,完全沒有。這實際上會很糟糕:'if(x && x-> foo)' - 如果'x'爲NULL? – ThiefMaster 2013-03-26 13:29:27

+0

在這種情況下,您需要檢查兩個單獨的'if'語句中的'x',然後檢查'x-> foo',我清楚地記得這樣做了。 – 2013-03-26 13:33:00

3

Y只有檢驗是否Xtrue

如果X是假的,然後Y將不檢查

BTW支票在執行運行時完成的,而不是在編譯階段

1

&&||都強制從左向右評估。如果第二個操作數被評估,兩者都會在第一個和第二個操作數之間引入一個序列點。如果可以從第一個操作數單獨確定表達式的結果,那麼它們都不會評估第二個操作數。 IOW,對於X && Y,Y將不會被評估,如果X是假的,而對於X || Y,Y將不會被評估如果X爲真。

請注意,優先順序不影響評估順序;給定表達式X || Y && Z,Y && Z而不是X之前被評估,儘管&&具有比||更高的優先級。首先評估X;如果結果爲0(假),則評估Y。如果該結果非零(真),則評估Z

這是在language standard(2011年版,在線草案)的第6.5.13和6.5.14節中定義的,因此它不依賴於編譯器。

7

的C規格(6.5.13)澄清這點你:

4不同的是按位二進制&運算符,& &操作左到右的評價擔保; 如果評估第二個操作數,則在第一個和第二個操作數的評估之間有一個序列點。 如果第一個操作數比較等於0,則不計算第二個操作數 。

所以C語言本身defineds,如果X == 0然後Y不會被選中。

0

如果Y有副作用,或訪問它可能是未定義的行爲(例如糟糕的指針引用),那麼編譯器必須保證Y不計算除非評估爲真X。但是,如果XY都沒有副作用,並且編譯器知道對它們的訪問已定義良好,則可以選擇以這樣的方式進行優化,以使兩種訪問都發生。

+0

爲什麼-1? .... – 2013-03-26 14:31:12