繁体   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