在条件中省略“> 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
是负数将分别产生 true
和 false
。
所以
if (int_variable) { … }
不是检查int_variable
是否为阳性的正确方法。
在 C 中,任何计算结果为整数 0
或 空指针 的表达式都被认为是假的。其他都是真的。
基本上是这样的
int i = ...;
if ( i )
测试 i
是否为 0。但是,如果 i
为负,则条件也为真,因此这不能替代 i > 0
。 除非i
是unsigned
。仅仅是因为它们不能为负。但是您的编译器可能会警告此类结构,因为它们通常会显示错误的概念。
谈到编码风格,如果您真的与值 0
进行比较,if ( i )
是一种糟糕的风格。您最好明确比较:if ( i != 0 )
。但是,如果 i
包含一些布尔结果,您应该使用 "speaking" 名称(例如 isalpha('A')
使用 ctypes.h
函数而不是变量)并且不要比较。比较可读性:
char ch = ...;
if ( isalpha(ch) )
if ( isalpha(ch) != 0 )
对于后者,您必须再考虑一下比较 - 没有必要。
最近继承了一个老项目,做一些优化和添加新功能。在这个项目中,我在整个代码中都看到了这种情况:
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
是负数将分别产生 true
和 false
。
所以
if (int_variable) { … }
不是检查int_variable
是否为阳性的正确方法。
在 C 中,任何计算结果为整数 0
或 空指针 的表达式都被认为是假的。其他都是真的。
基本上是这样的
int i = ...;
if ( i )
测试 i
是否为 0。但是,如果 i
为负,则条件也为真,因此这不能替代 i > 0
。 除非i
是unsigned
。仅仅是因为它们不能为负。但是您的编译器可能会警告此类结构,因为它们通常会显示错误的概念。
谈到编码风格,如果您真的与值 0
进行比较,if ( i )
是一种糟糕的风格。您最好明确比较:if ( i != 0 )
。但是,如果 i
包含一些布尔结果,您应该使用 "speaking" 名称(例如 isalpha('A')
使用 ctypes.h
函数而不是变量)并且不要比较。比较可读性:
char ch = ...;
if ( isalpha(ch) )
if ( isalpha(ch) != 0 )
对于后者,您必须再考虑一下比较 - 没有必要。