这种转换的可移植性。我可以确定两个断言都通过了吗?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
不要问为什么。我知道这很丑。谢谢。
assert( 4 < 5);
和assert(!( 4 > 5));
(4 < 5) ? 1 : 0
如果我真的需要将布尔值转换为0或1,我可能会写。一个好的编译器可能会产生相同的机器代码,对于人类读者来说更清楚。
这种转换的可移植性。我可以确定两个断言都通过了吗?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
不要问为什么。我知道这很丑。谢谢。
assert( 4 < 5);
和assert(!( 4 > 5));
(4 < 5) ? 1 : 0
如果我真的需要将布尔值转换为0或1,我可能会写。一个好的编译器可能会产生相同的机器代码,对于人类读者来说更清楚。
Answers:
int x = 4<5;
完全便携。符合标准。bool
以int
转换是隐式的!
来自C ++标准的§4.7/ 4说(整体转换)
如果源类型为bool,则值
false
将转换为零,并且值true
将转换为1。
至于C,据我所知是没有bool
的C.(1999年以前),所以bool
要int
转换在C ++中才有意义。在C中,4<5
求int
值为,在这种情况下,值为1
, 4>5
将求值为0
。
编辑:詹斯在评论中说,C99具有_Bool
类型。bool
是在stdbool.h
头文件中定义的宏。true
并且false
也在中定义了宏stdbool.h
。
C99的第7.16节说:
宏
bool
扩展为_Bool。[..]
true
扩展为整数常量1
,false
扩展为整数常量0
,[..]
bool
自1999年以来C 就在其中。只需使用“ stdbool.h”标头即可,并且应包含此标头。
bool
/ _Bool
类型的可用性如何,C中的关系运算符都会产生int
,而不是bool
。即使在C99中,关系运算符仍会产生int
。
您同时标记了问题[C]和[C ++]。语言之间的结果将是一致的,但是每种语言的答案结构都不同。
在C语言中,您的示例与bool
任何内容均无关(也适用于C99)。在C语言中,关系运算符不会产生bool
结果。两者4 > 5
并4 < 5
是产生类型的结果的表达式int
用值0
或1
。因此,在C中的示例中不会发生任何类型的“布尔到整数转换”。
在C ++中,关系运算符确实会产生bool
结果。bool
值可以转换为int
type,可以true
转换为1
和false
转换为0
。这是由语言保证的。
PS C语言还具有专用的布尔类型_Bool
(宏别名为bool
),其积分转换规则与C ++基本相同。但是,这与您在C中的特定示例无关。再次,无论语言规范的版本如何,C中的关系运算符始终会产生int
(而非bool
)结果。
bool
在C99中存在关系关系运算符仍在int
C99中产生,而不是bool
。因此,如果您感兴趣的是关系运算符(如您的示例),则该问题仍然与无关bool
。
int
,而不是bool
。没有转换发生。
bool
而其行为却类似但不允许采用其地址?许多嵌入式系统都使用此类类型(通常使用identifier声明bit
)。例如,在中档PIC上,if (bitVar1) bitVar2=1;
将有两条指令;最佳编码if (byteVar1) byteVar2=1;
至少为四个(在许多编译器上,可能为五个)。因此,此类类型可以大大提高性能。
C标准的6.5.8.6节说:
如果指定的关系为true,则每个运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)应产生1,如果为0,则产生0。 false。)结果的类型为int。
由于int到bool的转换是隐式完成的,因此似乎没有问题。这适用于Microsoft Visual C ++,GCC和Intel C ++编译器。在C或C ++中都没有问题。
assert(x!=0)
。即使bool(true)将Portable转换为int(1),“ not false”断言也具有更易读的表达式。