这个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++ 中,编写num
和 num!=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++ 中,编写 num
和 num!=0
都可以。但是,num!=0
可能会更明显地表明该方法正在返回一个布尔值。从技术上讲,只有整数值0
将等同于布尔值 false,而所有其他值将等同于布尔值 true。通过编写num!=0
,明确表示如果num不等于0,该方法将返回true,如果不等于0,则返回false。
良好的做法规定,如果它是一个真正的真值,那么您应该使用boolean
,因为它让调用者非常清楚将返回什么。返回integer
时,可以将其视为代码/枚举类型值。
因此,在这种情况下,num!=
优于 num
。然而,括号不是必需的。如果您在方法应该返回 boolean
时返回 integer
,某些编译器也会发出警告。
【讨论】:
另一方面,!= 0
和括号一样是多余的。即使将函数更改为返回整数,(几乎)它在布尔上下文中的所有使用都同样有效。
@filmor num
和 num!=0
在逻辑上是等价的;这是没有争议的。然而,好的做法(当然,一如既往地有争议)可能会要求您明确地将 integer
转换为 boolean
。
这(显式转换内容)可能适用于更复杂的类型,但恕我直言,隐式布尔转换是一件好事,应该尽可能使用。这个return
是一个好的开始:)【参考方案2】:
作者可能写了return num
,编译器会生成完全相同的二进制文件。在这里,作者试图明确并让读者尽可能容易地猜测函数返回的内容。
当快速阅读者看到return num
知道num
是int
并且当前函数返回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,而不是 true
和 false
)。
【讨论】:
以上是关于这个return语句有啥意义吗?的主要内容,如果未能解决你的问题,请参考以下文章