回答
1 || condition
總是如此,無論condition
是否爲真。在這種情況下,condition
從未被評估過。下面的代碼:
int c = 5;
if (1 || c++){}
printf("%d", c);
輸出5
因爲c
沒有被增加,但是如果你改變了1
到0
,該c++
將實際調用,使得輸出6
。
這方面的一個通常的實際應用中的情況,當你想測試一些代碼片段時,計算結果爲true的條件只有很少滿足正在被調用:
if (1 || condition) {
// code I want to test
}
這永遠不會對condition
進行評估,因此始終會調用// code I want to test
。但是它肯定是不一樣的:
if (condition) { ...
這也正是condition
將實際評估的聲明(和你的情況Foo
會被調用)
*'你不想等到這個條件會評估爲真*是的,基本上短路是一種保存執行的技術! –
@GrijeshChauhan:我不是指性能,也不是執行時間。我指的是符合特定的標準。 – LihO
哎,這是一種奇怪的語言功能。我相信conding總是被評估,如果它有副作用(所以基本上我相信非const方法和靜態函數被評估過,但我嘗試了一個簡單的「hello world」,並且從未能夠在第一種情況O_O – GameDeveloper
if (1 || !Foo())
將永遠滿意。因爲short-circuits evaluation甚至不會達到!Foo()
。
發生這種情況時,您需要確保將執行if
以下的代碼,但您不想刪除其中的實際條件,可能是爲了進行調試。
更多信息,可以幫助你:
if(a && b)
- 如果a
是false
,b
將不檢查。if(a && b)
- 如果a
是true
,b
將被檢查,因爲如果它是false
,表達式將是false
。if(a || b)
- 如果a
是true
,b
將不會被檢查,因爲無論如何這是true
。if(a || b)
- 如果a
是false
,b
將被選中,因爲如果b
是true
那麼它會true
。
我們強烈建議有用於此目的的宏,說DEBUG_ON 1
,這將使它更容易瞭解程序員的手段,而不是有幻數代碼(感謝@grigeshchauhan )。
所以'if(!Foo())'可以是if(1 ||!Foo()){code} == == if(1){code}'=='{code}''無論是「{code}」還是「;'都取決於'Foo()'返回的值。:) –
我擴展了你的最後一個表達式。編輯:用於調試目的或者使用宏'DEGUG_ON = 1'或註釋它。 '如果(DEGUG_ON ||!Foo())'(實際上我會評論代碼)。 ;) –
*「強烈建議有一個宏用於此目的,比如說DEBUG_ON 1」* ...是的,除了代碼可讀性是您試圖找到該死的錯誤時的最後一個問題:-) – Mehrdad
問題得到了正確回答 - 不同之處在於操作的右側被短路,表明這是強制進入if塊的調試代碼。
但在最佳實踐,至少我在最佳實踐粗糙刺的興趣,我建議的替代品,以遞增的優先順序(最好是最後一個):
注:發現後我編寫實例這是一個C++問題,例子是C#。希望你能翻譯。如果有人需要我,請發表評論。
在行註釋:
if (1 /*condition*/) //temporary debug
亂行註釋:
//if(condition)
if(true) //temporary debug
名稱,指示作用
如果你想要一個真正強大的解決方案,您可以將源規則添加到源代碼控制,以拒絕任何名爲ForceConditionForDebug的簽入代碼。這段代碼不應該是這樣寫的,因爲它顯然不會傳達意圖。它永遠不應該被檢入(或被允許檢入)(源代碼管理?同行評審?)而且絕對不能允許它以當前形式執行生產。
- 1. 使用if(0 == foo())而不是(foo()== 0)有什麼好處?
- 2. 爲什麼許多lisps有「foo」,「foo-1」,「foo-2」等函數名?
- 3. 「foo =(foo + 1)%bar」究竟幹什麼?
- 4. PHP速度:什麼更快? if(isset($ foo))或if($ foo == true)
- 5. 「#if Foo - 0 == 0」和「#if defined(Foo)&& Foo == 0」之間的區別是什麼?
- 6. 爲什麼循環中的foo + = foo + 1會導致-1?
- 7. 高速路由中`/:foo *`和`/:foo(。*)`有什麼區別?
- 8. 爲什麼`返回$ foo if/pattern /;`返回$ foo,即使$ foo匹配模式?
- 9. 「if(1)」做什麼?
- 10. 有什麼理由不使用OpenID?
- 11. using params [:foo]和@foo有什麼區別?
- 12. Foo :: class.java和Foo :: javaClass有什麼區別?
- 13. 如果沒有foo節點存在,爲什麼「foo!= 1」在xslt中的行爲與「not(foo = 1)」不同?
- 14. C++中if(x^1!= 1)和if(int(x^1)!= 1)有什麼區別?
- 15. 爲什麼有人會使用#if 1 C預處理器指令?
- 16. 爲什麼「foo = foo || {};」不行?
- 17. 爲什麼需要if(0)和if(1)
- 18. 有什麼理由爲什麼要使用MPI的Wtime?
- 19. 哪個`if(!isset($ foo)OR(isset($ foo)AND $ foo == $ bar))`或`if(!isset($ foo)OR $ foo == $ bar)`更好?
- 20. 單個等於一個if。的JavaScript。有什麼好的理由?
- 21. Java中if(!foo)和if(foo == false)之間的性能差異(如果有的話)是什麼?
- 22. 爲什麼example.com/foo/有效,但example.com/foo沒有?
- 23. 試圖理解爲什麼.attr('value','foo')有效但是.val('foo')不會
- 24. if($ a)和if($ a == 1)之間的區別是什麼?
- 25. 什麼是「x && foo()」?
- 26. FOO代表什麼?
- 27. 「def function(foo)」中使用的「foo」是什麼:「使用Python3.x時的用法
- 28. Foo()和Foo()是什麼樣的數組?
- 29. 這是什麼意思? int foo = foo + 4;
- 30. foo(&nil)與foo(&「不是proc」)有什麼不同?
'1 ||某事()'將永遠產生真實。所以這兩個陳述是不相同的,但至於爲什麼這樣做,通過。 – SinisterMJ
if(1 ||!foo())'<==>'if if(1)'。 – devnull
爲什麼不只是刪除條件?你說'1 || foo()'=='foo()'。這意味着它們後面的代碼是無用的。您可以根據條件完全刪除它。 – Val