为什么';t与C11中bool转换为bool的比较?

为什么';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

给定以下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 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进行比较