2013-10-10 56 views
56

我讀了一些舊代碼:有什麼理由使用if(1 ||!Foo())?

if (1 || !Foo()) 

有沒有見過之所以不寫:

if (!Foo()) 
+27

'1 ||某事()'將永遠產生真實。所以這兩個陳述是不相同的,但至於爲什麼這樣做,通過。 – SinisterMJ

+10

if(1 ||!foo())'<==>'if if(1)'。 – devnull

+0

爲什麼不只是刪除條件?你說'1 || foo()'=='foo()'。這意味着它們後面的代碼是無用的。您可以根據條件完全刪除它。 – Val

回答

134

兩個是相同。第一個將永遠不會評估Foo(),因爲1||短路。

爲什麼這麼做 - 可能有人想強制進入then分支進行調試,並將其留在那裏。也可能是因爲這是在源代碼控制之前編寫的,所以他們不希望代碼丟失,而現在只是繞過

+23

聽起來像是在開發/調試過程中插入的內容,並且因爲有人忘記刪除它或者因爲害怕破壞一些東西。 – Medinoc

+0

在任何情況下,這都是比註釋更好的解決方案,因爲編譯器會不斷檢查非活動代碼。我爲了調試的原因而一直這樣做。 – usr

+0

只有真正有經驗的開發人員才知道這一點。 +1 – Baby

11
1 || condition 

總是如此,無論condition是否爲真。在這種情況下,condition從未被評估過。下面的代碼:

int c = 5; 
if (1 || c++){} 
printf("%d", c); 

輸出5因爲c沒有被增加,但是如果你改變了10,該c++將實際調用,使得輸出6


這方面的一個通常的實際應用中的情況,當你想測試一些代碼片段時,計算結果爲true的條件只有很少滿足正在被調用:

if (1 || condition) { 
    // code I want to test 
} 

這永遠不會對condition進行評估,因此始終會調用// code I want to test。但是它肯定是不一樣的:

if (condition) { ... 

這也正是condition將實際評估的聲明(和你的情況Foo會被調用)

+0

*'你不想等到這個條件會評估爲真*是的,基本上短路是一種保存執行的技術! –

+0

@GrijeshChauhan:我不是指性能,也不是執行時間。我指的是符合特定的標準。 – LihO

+0

哎,這是一種奇怪的語言功能。我相信conding總是被評估,如果它有副作用(所以基本上我相信非const方法和靜態函數被評估過,但我嘗試了一個簡單的「hello world」,並且從未能夠在第一種情況O_O – GameDeveloper

44

if (1 || !Foo())將永遠滿意。因爲short-circuits evaluation甚至不會達到!Foo()

發生這種情況時,您需要確保將執行if以下的代碼,但您不想刪除其中的實際條件,可能是爲了進行調試。

更多信息,可以幫助你:

  • if(a && b) - 如果afalseb將不檢查。
  • if(a && b) - 如果atrue,b將被檢查,因爲如果它是false,表達式將是false
  • if(a || b) - 如果atrue,b將不會被檢查,因爲無論如何這是true
  • if(a || b) - 如果afalseb將被選中,因爲如果btrue那麼它會true

我們強烈建議有用於此目的的宏,說DEBUG_ON 1,這將使它更容易瞭解程序員的手段,而不是有幻數代碼(感謝@grigeshchauhan )。

+6

所以'if(!Foo())'可以是if(1 ||!Foo()){code} == == if(1){code}'=='{code}''無論是「{code}」還是「;'都取決於'Foo()'返回的值。:) –

+0

我擴展了你的最後一個表達式。編輯:用於調試目的或者使用宏'DEGUG_ON = 1'或註釋它。 '如果(DEGUG_ON ||!Foo())'(實際上我會評論代碼)。 ;) –

+0

*「強烈建議有一個宏用於此目的,比如說DEBUG_ON 1」* ...是的,除了代碼可讀性是您試圖找到該死的錯誤時的最後一個問題:-) – Mehrdad

10

問題得到了正確回答 - 不同之處在於操作的右側被短路,表明這是強制進入if塊的調試代碼。

但在最佳實踐,至少我在最佳實踐粗糙刺的興趣,我建議的替代品,以遞增的優先順序(最好是最後一個):

注:發現後我編寫實例這是一個C++問題,例子是C#。希望你能翻譯。如果有人需要我,請發表評論。

在行註釋:

if (1 /*condition*/) //temporary debug 

亂行註釋:

//if(condition) 
if(true) //temporary debug 

名稱,指示作用

​​

如果你想要一個真正強大的解決方案,您可以將源規則添加到源代碼控制,以拒絕任何名爲ForceConditionForDebug的簽入代碼。這段代碼不應該是這樣寫的,因爲它顯然不會傳達意圖。它永遠不應該被檢入(或被允許檢入)(源代碼管理?同行評審?)而且絕對不能允許它以當前形式執行生產。

相關問題