使用C bools作为整数时是否存在任何风险或陷阱

时间:2015-09-25 15:19:51

标签: c boolean

我有时会发现在整数表达式中使用bool可以缩短代码。 例如,我更喜欢

int n_items = has_a + has_b + has_box * 5;

int n_items = (has_a ? 1 : 0) + (has_b ? 1 : 0) + (has_box ? 5 : 0);

这应该是安全的,因为false == 0和true == 1。是否应该知道任何风险或陷阱?

对于bool,我指的是C99 bools或像a>b这样的布尔表达式。当然,我必须注意实际上不是布尔值的值,比如isdigit()的返回值。

1 个答案:

答案 0 :(得分:4)

bool的风险之一是它的语义与int不同,很多程序已使用bool作为int的别名,并且未使用来自_Bool的C99 stdbool.h typedef(例如,为C89开发或旨在兼容的程序):

typedef int bool;

然后这个表达式可能有不同的含义:

int a = (bool) 0.5;  // if bool is _Bool, evaluates to 1
                     // if bool is int, evaluates to 0

这可能会产生一些非常讨厌的错误。

另一方面,比(has_a ? 1 : 0)更短的形式是惯用!!has_a