使用C布尔作为整数时是否存在任何风险或缺陷
我有时发现在整数表达式中使用bool可以使代码更短、更简单。 例如,我更喜欢使用C布尔作为整数时是否存在任何风险或缺陷,c,boolean,C,Boolean,我有时发现在整数表达式中使用bool可以使代码更短、更简单。 例如,我更喜欢 int n_items = has_a + has_b + has_box * 5; 结束 这应该是安全的,因为false==0,true==1。有没有什么风险或问题是你应该知道的 对于布尔,我指的是C99布尔或布尔表达式,如a>b。当然,我必须注意那些不是布尔值的值,比如isdigit的返回值。bool的风险之一是它的语义与int不同,许多程序已经使用bool作为int的别名,并且没有使用stdbool的C99(b
int n_items = has_a + has_b + has_box * 5;
结束
这应该是安全的,因为false==0,true==1。有没有什么风险或问题是你应该知道的
对于布尔,我指的是C99布尔或布尔表达式,如a>b。当然,我必须注意那些不是布尔值的值,比如isdigit的返回值。bool的风险之一是它的语义与int不同,许多程序已经使用bool作为int的别名,并且没有使用stdbool的C99(bool typedef)。例如。,为C89开发的程序或与以下内容兼容的程序:
typedef int bool
例如,该表达式可能具有不同的含义:
int a = (bool) 0.5; // if bool is _Bool, evaluates to 1
// if bool is int, evaluates to 0
这会产生一些非常讨厌的bug
另一方面,一个比a更短的形式?1:0是惯用的!!has_a.这是编写非常混乱的代码的好方法。没有布尔值这样的东西。C只有整数,所以这个问题没有意义。布尔数已经是整数了。C99中有,但它仍然保留1或0的无符号整数值。@meagar:C中有一个数据类型_Bool/Bool。但是,它实际上是一个值为0和1的无符号整数值类型。布尔表达式不产生Bool结果,但具有int兼容性。@Emi1303 C具有_Bool布尔类型。
int a = (bool) 0.5; // if bool is _Bool, evaluates to 1
// if bool is int, evaluates to 0