[英]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 < 1
或t >= 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.