2015-02-06 60 views
2

我想有一個角度的嵌入式軟件發展的角度,我想問哪一個更好一起去,什麼是可能的優勢和劣勢?在C語言中,檢查分支語句的函數返回值的最佳做法是什麼?

bool funct(){ 
    bool retVal = 0; 
    //do something 
    return retVal; 
} 

//First Choice 
if(funct()){ 
    //do something 
} 

//Second Choice 
bool retVal = funct(); 
    if(retVal) 
    { 
    //do something 
    } 
+2

定義'更好'。 – Biffen 2015-02-06 12:42:33

+0

感謝您的評論,但我不得不說「更好」,因爲它可能在性能,可靠性或其他任何我無法預見的方面更好。因此而要求優點和缺點。 @Biffen – 2015-02-06 12:48:32

+4

不要擔心這種微觀優化。只要在意圖明確且易於理解的地方編寫乾淨的代碼即可。 – kkrambo 2015-02-06 13:12:21

回答

3
//First Choise 
if(funct()){ 
    //do something 
} 

爲您檢查函數的返回值將作出的決定和你的函數返回0或1

而且這裏有一個優勢,在第二次的選擇,因爲這是完全正常您只需保存一個變量retVal的空間即可保存返回值並執行檢查。

如果有需要使用的返回值不僅只是針對檢查中,如果條件和程序其他地方,那麼我會建議存儲返回值(選擇2)

+0

實際上,它返回'true'或'false',它畢竟返回'bool'。 :) – unwind 2015-02-06 12:57:13

+0

@unwind對不起?我沒有得到..? – Gopi 2015-02-06 12:59:25

+0

'0'和'1'是整數,但函數的返回類型是'bool',所以返回的值是'false'或'true'。當然,這些轉換爲整數「0」和「1」並帶有預期的結果,但這並不意味着它們是兩個整數。 – unwind 2015-02-06 13:16:10

1

的第一選擇(注拼寫)更好,但是由於與你想象的完全無關的原因。

原因是它只是一行代碼較短,因此您有一行代碼不必擔心,在試圖理解其工作原理時必須閱讀的代碼行數少於一行將來必須維護的代碼行。

在任何現實生活場景下,性能考慮都是毫無意義的,事實上,我願意猜測任何中途體面的編譯器都會爲這兩種選擇生成完全相同的機器代碼。

如果你有這樣一個基本性質的問題,我強烈建議你退出試圖「有鑑於嵌入式軟件開發點」。嵌入是困難的;嘗試非嵌入式,這很容易。一旦你掌握了非嵌入式,那麼你可以嘗試嵌入式。

2

這兩種方法都將正常工作。如果將代碼定義得更好,代碼將在編譯時執行(非常輕微)並且佔用(非常少)更少的空間,則替代方法1)更好。方法1)將函數的值讀入一個寄存器,並分支兩個命令的值,並且不使用存儲器。備選2)將讀取功能到寄存器的值,將值寫入存儲器,從存儲器讀取的值插入值的寄存器和分支 - 總共四個命令和四個字節的存儲空間(假定32位處理器)。

+1

我建議你原型這個;你會發現兩種選擇在任何現代編譯器上都會以相同的機器代碼結束。 – Ross 2015-02-06 14:06:26

2

要麼是在這個例子中大概OK,但在調試步進你就會知道是否分支被採用之前的狀態是真實的,可以強制變量到不同的值,如果代碼時,當第二個有微弱的優勢您希望測試備用路徑,並且在調試過程中可以在任何情況下有助於查看調用結果。

在更復雜的表達式的方法中可能是更重要的,例如在:

if(x() || y()) ... 

如果x()返回true,那麼y()不會被求值,其可以是或可以不是可取的,如果y()有副作用,所以它們的語義並不相同:

bool xx = x() ; 
bool yy = y() ; 
if(xx || yy) ... 

使用顯式賦值可以明確表達所需的語義。例如,如果你想要短路語義的話。

相關問題