这个return语句有啥意义吗?

Posted

技术标签:

【中文标题】这个return语句有啥意义吗?【英文标题】:Is there any significance to this return statement?这个return语句有什么意义吗? 【发布时间】:2016-05-26 01:53:43 【问题描述】:

我想知道我所看到的涉及代码的部分是否有任何意义

return (num!=0);

其中 num 是一个 int。这是一个布尔函数的 return 语句,如果 num != 0 则返回 TRUE,如果 num = 0 则返回 false。

我不确定这是否有隐藏的意义,但我不明白为什么他们不能简单地写:

return num;

这是我看到的代码:

bool SemClass::cut(int &a, int &b, int &c) 

  int num = 0;    
  check(a, num);
  check(b, num );
  check(c, num);
  return (num != 0);

【问题讨论】:

我怀疑这个人不知道 int 会收敛到一个布尔值,其中 num!=0 为真,否则为假。 是的,很抱歉这是 C++。 返回 bool 而不是 int 是语言特定的行为,这在代码的可读性和可移植性方面存在一些严重差异。 在这种情况下,在 C++ 中,编写 numnum!=0 都可以。但是,num!=0 可能更明显地表明该方法正在返回一个布尔值。从技术上讲,只有整数值0 将等同于布尔值false,而所有其他值将等同于布尔值true。通过编写num!=0,明确表示如果num 不等于0,则该方法将返回true,如果是,则返回false。隐式转换:en.cppreference.com/w/cpp/language/implicit_cast 一些编译器会在“return num”上给出“缩小”警告。在那里进行额外的测试会将返回类型从 int 更改为 bool,从而消除警告。 【参考方案1】:

当通过隐式转换作为boolean 返回时,整数、浮点和无范围枚举的值 0 以及空指针和指向成员的空指针值变为 false。其他值(例如 1、2、3、4 等)映射为 true。该约定是通过其流控制语句在原始 C 中建立的; C 当时没有布尔类型。

隐式转换:en.cppreference.com/w/cpp/language/implicit_cast

在这种情况下,在 C++ 中,编写 numnum!=0 都可以。但是,num!=0 可能会更明显地表明该方法正在返回一个布尔值。从技术上讲,只有整数值0 将等同于布尔值 false,而所有其他值将等同于布尔值 true。通过编写num!=0,明确表示如果num不等于0,该方法将返回true,如果不等于0,则返回false。

良好的做法规定,如果它是一个真正的真值,那么您应该使用boolean,因为它让调用者非常清楚将返回什么。返回integer 时,可以将其视为代码/枚举类型值。

因此,在这种情况下,num!= 优于 num。然而,括号不是必需的。如果您在方法应该返回 boolean 时返回 integer,某些编译器也会发出警告。

【讨论】:

另一方面,!= 0 和括号一样是多余的。即使将函数更改为返回整数,(几乎)它在布尔上下文中的所有使用都同样有效。 @filmor numnum!=0 在逻辑上是等价的;这是没有争议的。然而,好的做法(当然,一如既往地有争议)可能会要求您明确地将 integer 转换为 boolean 这(显式转换内容)可能适用于更复杂的类型,但恕我直言,隐式布尔转换是一件好事,应该尽可能使用。这个return 是一个好的开始:)【参考方案2】:

作者可能写了return num,编译器会生成完全相同的二进制文件。在这里,作者试图明确并让读者尽可能容易地猜测函数返回的内容。

当快速阅读者看到return num 知道numint 并且当前函数返回bool 时,他需要停止几分之一秒到几秒(取决于关于 C++ 的集中度和易用性)记住整数可以通过映射0 -> false, anything else -> true 隐式转换为布尔值。那么,为什么不把它写下来呢?

当快速阅读者看到return num!=0 时,(s)他猜测当前函数返回一个布尔值(它可能不是,但它会很可疑)并且很容易理解返回值的含义。

根据经验,我建议在不影响阅读并且只需要更多(或更少)字符的情况下选择更明确的写作。不要忘记您不是为编译器编写代码,而是为与您合作或将与您合作的数十名其他开发人员编写代码(r 代码)。 C++ 可能在 20 年内不太常见,如果您的程序不仅能被大师而且每个人都容易理解,那就太好了(我在这里概括,不仅仅是在谈论隐式布尔转换)。

【讨论】:

【参考方案3】:

作者在两个方面(过分)小心:

    括号是多余的。

    C++ 中的任何数字类型都隐式转换为bool:如果数字比较为零,则为false,否则为true

我个人更喜欢赤裸裸的return num;,因为我发现它更清晰。

(请注意,在 C 中,关系运算符返回 int 类型 1 和 0,而不是 truefalse)。

【讨论】:

以上是关于这个return语句有啥意义吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用不返回任何内容的 return 语句有啥好处吗?

c语言exit和return有啥区别

Try语句中有return,那么finally中的code会执行吗?什么时候执行?

在流水线函数中包含“return”关键字有啥好处?

sql join语句中表的顺序有啥意义吗

请问c#中return语句不能写在finally里面吗?