为什么';t与C11中bool转换为bool的比较?
给定以下C11代码:为什么';t与C11中bool转换为bool的比较?,c,boolean,c11,C,Boolean,C11,给定以下C11代码: int a = 1234; bool b = (bool)a; // equivalent to (a != 0) or (a != false) which evaluates to 1 or true if (a) // equivalent to if(a != 0) or if (a != false) which evaluates to 1 or true printf("a\n"); if (a == (bool)true) // should be
int a = 1234;
bool b = (bool)a; // equivalent to (a != 0) or (a != false) which evaluates to 1 or true
if (a) // equivalent to if(a != 0) or if (a != false) which evaluates to 1 or true
printf("a\n");
if (a == (bool)true) // should be equivalent to if(!(a == false)) or if (a != false)
printf("a == (bool)true\n");
我知道true是#定义true 1
,但是bool
显然不是一个普通的整数类型,因为(bool)0.1
之类的值计算为1,而强制转换为int将导致0
1) 为什么不为true
定义为(bool)1
?这将允许编译器至少输出一个警告
2) 为什么我的示例中的整数没有转换为
bool
,这样a==(bool)true
将计算为(bool)a==(bool)true
,这实际上是真的?从注释中总结:
\u Bool
实际上“只是”另一个无符号整数类型,其异常规则是,如果值不等于0(“false”),则转换为该类型的结果总是为1(“true”)
因为它是一个无符号整数,所以应用整数提升规则。
即使将
true
定义为(bool)1
,比较a==true
的结果实际上是比较1234==1
,这总是false
,从评论中总结:
\u Bool
实际上“只是”另一个无符号整数类型,其异常规则是,如果值不等于0(“false”),则转换为该类型的结果总是为1(“true”)
因为它是一个无符号整数,所以应用整数提升规则。
即使true
被定义为(bool)1
,比较a==true
也会导致实际比较1234==1
,这总是false
我知道true是#定义true 1
,但bool
显然不是
普通整数类型,因为类似(bool)0.1的值为1
而强制转换为int将导致0
bool
(实际上\u bool
;bool
是一个扩展到\u bool
的宏)是一个整数类型。它确实有一个与任何其他类型都不相同的不寻常的特性:将任何非零值转换为\u Bool
会产生1
请注意,生成逻辑布尔值的运算符仍然生成值为0
或1
的int
结果。由于隐式转换,这通常不是问题
1) 为什么不为true
定义为(bool)1
?这将允许编译器
至少输出一个警告
编译器可以随时生成警告。比较true
或false
时发出警告是个好主意
2) 为什么我的示例中的整数没有转换为bool
这样的值
那a==true
将计算为(bool)a==true
,这实际上会
是真的吗
a==true
必须先将其操作数转换为相同类型,然后才能进行比较。这是通过通常的算术转换完成的。第6.3.1.8节描述了规则(相当复杂)。一个非常快速且不精确的总结是将较窄类型(较小的整数转换秩)的操作数转换为另一个操作数的类型。例如,当比较类型为int
和long
的表达式时,int
操作数提升为long
\u Bool
是最窄的整数类型,因此它总是在比较中提升,除非它与另一个\u Bool
值进行比较
仅仅为了\u Bool
而更改这些规则会让人困惑,而且不会给你带来太多好处
底线:不要将相等值与false
或true
进行比较。不要写:
if (a == true)
if (a == false)
只要写下:
if (a)
如果你是这个意思的话。同样,不要写:
if (a == true)
if (a == false)
只要写
if (!a)
我知道true是#定义true 1
,但bool
显然不是
普通整数类型,因为类似(bool)0.1的值为1
而强制转换为int将导致0
bool
(实际上\u bool
;bool
是一个扩展到\u bool
的宏)是一个整数类型。它确实有一个与任何其他类型都不相同的不寻常的特性:将任何非零值转换为\u Bool
会产生1
请注意,生成逻辑布尔值的运算符仍然生成值为0
或1
的int
结果。由于隐式转换,这通常不是问题
1) 为什么不为true
定义为(bool)1
?这将允许编译器
至少输出一个警告
编译器可以随时生成警告。比较true
或false
时发出警告是个好主意
2) 为什么我的示例中的整数没有转换为bool
这样的值
那a==true
将计算为(bool)a==true
,这实际上会
是真的吗
a==true
必须先将其操作数转换为相同类型,然后才能进行比较。这是通过通常的算术转换完成的。第6.3.1.8节描述了规则(相当复杂)。一个非常快速且不精确的总结是将较窄类型(较小的整数转换秩)的操作数转换为另一个操作数的类型。例如,当比较类型为int
和long
的表达式时,int
操作数提升为long
\u Bool
是最窄的整数类型,因此它总是在比较中提升,除非它与另一个\u Bool
值进行比较
仅仅为了\u Bool
而更改这些规则会让人困惑,而且不会给你带来太多好处
底线:不要将相等值与fa进行比较