簡體   English   中英

此函數是否在所有控制路徑上都有明確的返回值?

[英]Does this function have explicit return values on all control paths?

對於任何數據類型,我都有一個以單位為中心的Heaviside階躍函數 ,我用以下編碼:

template <typename T>
int h1(const T& t){
   if (t < 1){
       return 0;
   } else if (t >= 1){
       return 1;
   }
}

在代碼審查中,我的審稿人告訴我,所有控制路徑都沒有明確的回報。 編譯器也沒有警告我。 但我不同意; 條件相互排斥。 我該如何處理?

這取決於模板的使用方式。 對於int ,你很好。

但是 ,如果t是IEEE754浮點double精度型,其值設置為NaN ,則t < 1t >= 1都不true ,因此程序控制到達if塊的末尾! 這會導致函數返回而沒有顯式值; 其行為未定義。

(在更一般的情況下, T以不覆蓋所有可能性的方式重載<>=運算符,程序控制將到達if塊的末尾而沒有明確的return 。)

這里故事的寓意是決定哪個分支應該是默認的,並將其作為else情況。

僅僅因為代碼是正確的,這並不意味着它不會更好。 正確執行是質量的第一步 ,而不是最后。

if (t < 1) {
    return 0;
} else if (t >= 1){
    return 1;
}

對於任何數據類型的t ,上述對於<>=具有合理的行為是“正確的”。 但是這個:

if (t < 1) {
    return 0;
}
return 1;

通過檢查更容易看出每個案例都被覆蓋,並且完全避免了第二個不需要的比較(某些編譯器可能沒有優化)。 代碼不僅由編譯器讀取,而且由人類讀取,包括10年后的人。 給人類一個休息時間,並為他們的理解更簡單地寫作。

如上所述,一些特殊數字可以是<>= ,所以你的評論者是對的。

問題是:是什么讓你想要首先像這樣編碼? 為什么你甚至考慮讓自己和他人(需要維護代碼的人)的生活如此艱難? 事實上,你足夠聰明地推斷<>=應涵蓋所有情況並不意味着你必須使代碼更復雜而不是必要的。 物理學也適用於代碼:盡可能簡單,但不簡單(我相信愛因斯坦這樣說)。

想一想。 你想要實現什么目標? 必須是這樣的:'如果輸入小於1則返回0,否則返回1。 你所做的就是通過說...哦,但這意味着如果t大於或等於1則返回1.這種不必要的'x暗示y'需要代表維護者進行額外的思考工作。 如果您認為這是一件好事,我建議您自己進行幾年的代碼維護。

如果是我的評論,我會再說一遍。 如果您使用'if'語句,那么您基本上可以在所有分支中執行任何操作。 但在這種情況下,你不做“任何事情”。 您要做的就是返回0或1,具體取決於是否t <1。 在這種情況下,我認為“:”語句比更好 ,更具可讀性if語句。 從而:

return t<1 ? 0 : 1;

我知道某些公司禁止使用?:運營商,我覺得這很糟糕。 ?:通常與規格匹配得更好,它可以使代碼更容易閱讀(如果小心使用)......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM