2015-11-05 57 views
1

我最近继承了一个旧项目来进行一些优化并添加新功能。在这个项目中我见过这种类型的情况遍布代码:的有条件地忽略“> 0”吗?

if (int_variable) 

代替

if (int_variable > 0) 

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

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

+3

如果'int_variable'的类型实际上是'int',则不会。如果它是'未签名',是的。 – EOF

+2

在C和C++中,任何非零值都被认为是真的。负值也不为零。 –

回答

9

负数还评估为true,所以您应该使用if (int_variable > 0)来检查数字是否为正值。

+1

在C中,他们不评估任何东西 - 不确定C++。在一个条件中,他们只是被认为是真实的(但不是'_Bool'常量'_True')。对于任何非零数字都是如此,不仅对于负值,这是正确的。 – Olaf

3

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

2

任何非零值将被认为是true,所以如果变量确实是int即有符号,那么您的>版本有点简略。为了清楚起见,我更喜欢做的是明确在许多情况下,即写

if (int_variable != 0) 

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

2

if (int_variable)if (int_variable != 0)的含义相同。

这和if (int_variable > 0)不一样,除非你知道这个值永远不会是负数。

1

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

在你的情况下,假设int_variable签订后,(int_variable)相当于(int_variable > 0)因为int_variable为负将分别得到truefalse


所以

if (int_variable) { … } 

检查int_variable是正的正确途径。

1

在C中,评估为整数0空指针的任何表达式都被认为是错误的。还有其他的事情是真的。

所以基本上类似测试,如果

int i = ...; 
if (i) 

i为0。但是,如果i为负数,则条件也将为真,因此这不是i > 0的替代品。 除非iunsigned。只是因为他们不能消极。但是你的编译器可能会警告这样的构造,因为它们经常表现出错误的概念。

即将到来的编码风格,if (i)是坏的风格,如果你真的比较值0。您最好明确比较:if (i != 0)。但是,如果i包含一些布尔结果,则应使用“发音”名称(例如,isalpha('A')使用ctypes.h函数而不是变量),并且不要进行比较。比较readbility:

char ch = ...; 

if (isalpha(ch)) 

if (isalpha(ch) != 0) 

对于你必须考虑第二个关于比较后者 - 不必要的。

+0

即使在'NULL!= 0x0'的体系结构中,这是否也是如此? –

+0

@ Mr.E:这就是为什么我写了“_null指针constant_”C(不确定C++,但相当肯定),不需要空指针常量为“全零位”。 – Olaf

+0

我知道NULL不是0,但从来没有听说过2个不同的整数值是'false'。谢谢 –