回答
在C和most other languages短路評估是有保證的。因此Y
僅在X
評估爲真時才被評估。
這同樣適用於X || Y
- 在這種情況下Y
僅在X
評估爲false時才被評估。
請參閱Mike's answer以參考C規範,其中提及並保證了此行爲。
不允許C評估先是'Y',然後'X'? – 2013-03-26 13:29:01
不,完全沒有。這實際上會很糟糕:'if(x && x-> foo)' - 如果'x'爲NULL? – ThiefMaster 2013-03-26 13:29:27
在這種情況下,您需要檢查兩個單獨的'if'語句中的'x',然後檢查'x-> foo',我清楚地記得這樣做了。 – 2013-03-26 13:33:00
的Y
只有檢驗是否X
是true
如果X
是假的,然後Y
將不檢查
BTW支票在執行運行時完成的,而不是在編譯階段
&&
和||
都強制從左向右評估。如果第二個操作數被評估,兩者都會在第一個和第二個操作數之間引入一個序列點。如果可以從第一個操作數單獨確定表達式的結果,那麼它們都不會評估第二個操作數。 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節中定義的,因此它不依賴於編譯器。
的C規格(6.5.13)澄清這點你:
4不同的是按位二進制&運算符,& &操作左到右的評價擔保; 如果評估第二個操作數,則在第一個和第二個操作數的評估之間有一個序列點。 如果第一個操作數比較等於0,則不計算第二個操作數 。
所以C語言本身defineds,如果X == 0
然後Y
不會被選中。
如果Y
有副作用,或訪問它可能是未定義的行爲(例如糟糕的指針引用),那麼編譯器必須保證Y
不計算除非評估爲真X
。但是,如果X
和Y
都沒有副作用,並且編譯器知道對它們的訪問已定義良好,則可以選擇以這樣的方式進行優化,以使兩種訪問都發生。
爲什麼-1? .... – 2013-03-26 14:31:12
- 1. 檢查,如果條件「空」
- 2. 如果條件檢查DBNull.Value
- 3. Web網格MVC 3-如果用於檢查條件的語法
- 4. 條件語句來檢查,如果數組是空的,角JS
- 5. 如果下劃線中的語句檢查條件?
- 6. java條件語句檢查
- 7. EXC_BAD_ACCESS檢查語句條件?
- 8. 如何檢查結果的條件
- 9. 檢查的URL,如果條件
- 10. 如何檢查,如果在條件
- 11. 如果在javascript語句中檢查兩個條件
- 12. 如果語句條件檢查!=「undefined」失敗
- 13. 複選框,如果語句檢查不檢查不鳥巢條件
- 14. 如果聲明條件時間檢查
- 15. 如果陳述無法檢查條件
- 16. AngularJS - 檢查條件NG-如果
- 17. 如果聲明不檢查條件
- 18. 檢查中如果條件 - else塊
- 19. 空安全檢查,如果條件priorty
- 20. 如果條件檢查兩個TextField值
- 21. 觸發不檢查,如果條件
- 22. 如果在linq中檢查條件
- 23. 如果SQL Server條件NULL檢查
- 24. 空檢查中如果條件
- 25. 如果語句檢查
- 26. Java如果語句檢查
- 27. 如果語句和條件
- 28. 條件語句,如果IE
- 29. 如果Outlook條件語句
- 30. LINQ語句,如果條件
如果它真的是空的,編譯器可能會優化它,而且兩者都不會被檢查。 :) – Mike 2013-03-26 13:29:24
可能重複:http://stackoverflow.com/questions/628526/is-short-circuiting-boolean-operators-mandated-in-cc-and-evaluation-order – 2013-03-26 13:29:28
檢查是在執行運行時完成的,而不是在編譯階段 – MOHAMED 2013-03-26 13:30:58