我最近继承了一个旧项目,以进行一些优化并添加新功能。在这个项目中,我在整个代码中看到了这种类型的条件:
if (int_variable)
而不是
if (int_variable > 0)
我只使用boolean
类型的变量来使用第一个选项。
您认为第一个选项是"正确"检查数字是否为正数的方法
答案 0 :(得分:9)
负数也会评估为true
,因此您应该使用if (int_variable > 0)
检查数字是否为正数。
答案 1 :(得分:3)
没有。第一个选项是检查数字是否为非零的正确方法。
答案 2 :(得分:2)
任何非零值都将被视为true
,因此,如果变量确实为>
,即已签名,则int
的版本有点粗略。为清楚起见,我更喜欢在许多情况下明确表示,即写
if (int_variable != 0)
这可能有点复杂(基本上计算一个可以自动推断的布尔值),我绝不会使用if (bool_variable == true)
,但我认为整数情况会使测试更清晰。大声读出两个案例对整数来说更好。
答案 3 :(得分:2)
if (int_variable)
与if (int_variable != 0)
具有相同的含义。
这与if (int_variable > 0)
不同,除非您知道该值永远不会为负数。
答案 4 :(得分:1)
当使用整数值作为C中的真值时,零产生false
,而任何非零值产生true
。
在您的情况下,假设int_variable已签名,(int_variable)
不等同于(int_variable > 0)
,因为int_variable
为否定将产生true
和{分别为{1}}。
所以
false
是不检查if (int_variable) { … }
是否为正的正确方法。
答案 5 :(得分:1)
在C中,任何计算为整数0
或空指针的表达式都被视为false。其他任何事都是真的。
所以基本上像
int i = ...;
if ( i )
测试i
是否为0.但是,如果i
为负数,则条件也为真,因此这不是i > 0
的替代。 除非 i
为unsigned
。仅仅因为他们不能消极。但是你的编译器可能会警告这些结构,因为它们经常显示错误的概念。
如果您真的要与价值if ( i )
进行比较,那么即使是编码风格,0
也是不好的风格。您最好明确比较:if ( i != 0 )
。但是,如果i
包含一些布尔结果,则应使用"说"名称(例如isalpha('A')
使用ctypes.h
函数而不是变量)并且不进行比较。比较可读性:
char ch = ...;
if ( isalpha(ch) )
if ( isalpha(ch) != 0 )
对于后者,你必须考虑一下比较 - 不必要的。