在条件中省略“> 0”?

Omit "> 0" in conditional?

最近继承了一个老项目,做一些优化和添加新功能。在这个项目中,我在整个代码中都看到了这种情况:

if (int_variable)

而不是

if (int_variable > 0)

我只对 boolean 类型的变量使用了第一个选项。

您认为第一个选项是 "correct" 检查数字是否为正数的方法吗?

没有。第一个选项是检查数字是否非零的正确方法。

负数的计算结果也为 true,因此您应该使用 if (int_variable > 0) 检查数字是否为正数。

任何非零值都将被视为 true,因此如果变量确实是 int,即已签名,则带有 > 的版本有点粗略。为了清楚起见,我更愿意在许多情况下明确说明,即写

if (int_variable != 0)

这可能有点令人费解(基本上计算一个可以自动推断的布尔值),我永远不会使用 if (bool_variable == true) 例如,但我认为整数情况使测试更清晰。大声朗读这两个案例对于整数来说效果更好。

if (int_variable)if (int_variable != 0)同义。

这与 if (int_variable > 0) 不同,除非您知道该值永远不会为负。

在 C 中使用整数值作为真值时,零产生 false 而任何非零值产生 true.

在您的情况下,假设 int_variable 已签名,(int_variable) 等同于 (int_variable > 0) 因为 int_variable 是负数将分别产生 truefalse


所以

if (int_variable) { … }

不是检查int_variable是否为阳性的正确方法。

在 C 中,任何计算结果为整数 0 空指针 的表达式都被认为是假的。其他都是真的。

基本上是这样的

int i = ...;
if ( i )

测试 i 是否为 0。但是,如果 i 为负,则条件也为真,因此这不能替代 i > 0除非iunsigned。仅仅是因为它们不能为负。但是您的编译器可能会警告此类结构,因为它们通常会显示错误的概念。

谈到编码风格,如果您真的与值 0 进行比较,if ( i ) 是一种糟糕的风格。您最好明确比较:if ( i != 0 )。但是,如果 i 包含一些布尔结果,您应该使用 "speaking" 名称(例如 isalpha('A') 使用 ctypes.h 函数而不是变量)并且不要比较。比较可读性:

char ch = ...;

if ( isalpha(ch) )

if ( isalpha(ch) != 0 )

对于后者,您必须再考虑一下比较 - 没有必要。