[英]Omit “> 0” in conditional?
我最近继承了一个旧项目,以进行一些优化并添加新功能。 在这个项目中,我在代码中看到了这种情况:
if (int_variable)
代替
if (int_variable > 0)
我只对boolean
类型的变量使用了第一个选项。
您是否认为第一种选择是检查数字是否为正的“正确”方法?
负数也计算为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
或空指针的表达式都被视为false。 还有其他的话。
所以基本上像
int i = ...;
if ( i )
测试i
是否为0。但是,如果i
为负,则条件也为true,因此不能替代i > 0
。 除非 i
没有unsigned
。 仅仅因为它们不能是负面的。 但是您的编译器可能会警告此类构造,因为它们经常显示错误的概念。
谈到编码风格, if ( i )
是真的与值0
进行比较,则它是不好的风格。 您最好明确地进行比较: if ( i != 0 )
。 但是,如果i
包含一些布尔结果,则应使用“说”名称(例如isalpha('A')
使用ctypes.h
函数而不是变量),并且不要进行比较。 比较可读性:
char ch = ...;
if ( isalpha(ch) )
if ( isalpha(ch) != 0 )
对于后者,您必须考虑一下比较-不必要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.