2017-08-05 156 views
2

比方說,我有一個簡單的函數來檢查一個條件,如果條件爲真,則返回true,如果條件爲false,則返回false。在布爾函數中使用elses C++

是更好地使用這種類型的代碼:

bool myfunction(/*parameters*/) { 
    if (/*conditional statement*/) { 
     return true; 
    } 
    return false; 
} 

或者這種類型:

bool myfunction(/*parameters*/) { 
    if (/*conditional statement*/) { 
     return true; 
    } 
    else return false; 
} 

或者它只是真的不有所作爲?另外,在決定是否「如果......其他」如果「與」如果...其他「與」開關「之間應該考慮什麼?

+6

爲什麼不簡單'返回條件表達式;'? –

+0

作爲一個建模工具的角度來看,如果你反向工程..第二個會給你兩個路徑 –

+0

@Someprogrammerdude因爲這會有很大的意義。 :P –

回答

1

這是一樣的。請記住,只要你說

return boolean; 

函數結束並返回到它的呼叫線。因此,把它放在其他地方或只是簡單地把它放在一起。

說,我們要檢查的主要

bool isPrime (int n){ 
    for (int i = 2; i <= sqrt(n); i++){ 
     if (n % i == 0) 
      return false; 
    } 
    return true; 
} 

,如果你看到的功能觀察,你就會知道,如果數量正確地與任何價值的sqrt(n)的範圍劃分,將返回false數不是素數。如果它不能被分開,那麼循環將不受任何干擾地結束,並且將數字表示爲素數。因此該功能正常工作。

+0

請具體 –

+0

我的意思是最好把條件返回你正在尋找的價值。例如,你知道你的情況在某些情況下是「真」的,而在其他情況下是「假」的。然後在這個函數中,只需要滿足這個條件,就可以輕鬆寫出大量的代碼。和乾淨的代碼。 – Shafi

0

由於兩個給定的答案都沒有擊中指甲,我會給你另一個答案。

從代碼(或編譯器)視圖中,假設兩個版本的最新編譯器是相同的。編譯器將優化if版本至return版本就好了。差異在於調試 - 您使用的調試器可能不允許您在返回值上設置斷點(例如,如果您想設置只返回真值的斷點)。雖然if版本在不同的行上給你兩個返回語句,任何理智的調試器都會在線設置斷點。

7

你也可以這樣寫,沒有任何條件可言:

bool myfunction(/*parameters*/) { 
    return /*conditional statement*/; 
} 

這樣,你完全避免條件。

當然,如果您在處理需要條件的不同功能時,它應該沒有區別。現代編譯器可以很好地工作。

就使用開關vs if-else而言,當你有很多情況下,switch允許你跳轉到單一的情況下,switch增加了效率,通過不運行所有的情況來加快執行速度。在較低的硬件/編譯器級別,switch語句允許您進行單一檢查/跳轉,如果您有許多if語句,則需要進行多次檢查/跳轉。

0

無論編譯器是否應用了任何優化,兩個函數都是相同的,因爲第二個函數中的「else」沒有任何影響。如果在條件滿足時立即離開函數,則在這種情況下,您將永遠不會進入另一個分支,因此「else」在第一個版本中是隱含的。 因此,我更喜歡第一個版本,因爲另一箇中的「其他」是誤導性的。

但是,我同意其他人的看法,這種函數(兩種變體)無論如何都沒有意義,因爲您可以簡單地使用純布爾條件代替這個函數,這只是一個不必要的包裝。

0

就編譯而言,您爲if-else語法選擇的特定格式不會產生重大影響。優化路徑通常會消除任何差異。您的決定應該基於視覺形式進行。

正如其他人已經指出,如果你有這樣一個簡單的條件,最好直接返回計算,並避免if聲明。

如果您有布爾計算,直接返回纔有效。你可能反而需要返回不同的類型:

int foo(/*args*/) { 
    if(/*condition*/) { 
    return bar(); 
    } 
    return 0; 
} 

或者你可以使用三元運算?:,但如果表達,也未必清楚。

通過使用短期收益(評估沒有達到函數的結尾),您還可以對幾個條件和評估進行排序。

int foo(/*args*/) { 
    if(/*condition1*/) { 
    return 0; 
    } 

    if(/*condition2*/) { 
    return 3; 
    } 

    int common = bar(/*args*/); 
    if(/*condition3*/) { 
    return 1-common; 
    } 

    return common; 
} 

根據最合乎邏輯的意義選擇表單,忽略這可能編譯的方式。然後考慮按摩表單以減少視覺複雜性(避免過多的縮進或深度分支)。