bool转换为int

时间:2011-03-20 16:30:42

标签: c++ c c99

此转换的可移植性如何。我可以确定两个断言都通过了吗?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

不要问为什么。我知道这很难看。谢谢。

4 个答案:

答案 0 :(得分:173)

int x = 4<5;

完全便携。符合标准。 boolint转换是隐含的!

来自C ++标准的§4.7/ 4(积分转换

  

如果源类型为bool,则值 false将转换为零,   值 true转换为一个


至于C,据我所知,C中没有bool(1999年之前),因此boolint转换仅与C ++相关。在C中,4<5评估为int值,在这种情况下,值为14>5将评估为0

编辑:评论中的Jens说,C99有_Bool类型。 boolstdbool.h头文件中定义的宏。 truefalse也是stdbool.h中的宏定义。

来自C99的§7.16说,

  

bool 扩展为_Bool。

     

[..] true 扩展为整数常量 1 false   它扩展为整数常量 0 ,[..]

答案 1 :(得分:44)

您同时标记了您的问题[C]和[C ++]。结果将在语言之间保持一致,但每种语言的答案结构都不同。

在C语言中,您的示例与bool无关(也适用于C99)。在C语言中,关系运算符不会产生bool个结果。 4 > 54 < 5都是表达式int的结果,其值为01。因此,在C中的示例中没有任何类型的“bool to int conversion”。

在C ++中,关系运算符确实会产生bool个结果。 bool值可转换为int类型,true转换为1false转换为0。这是由语言保证的。

P.S。 C语言也有一个专用的布尔类型_Bool(宏名称为bool),其整数转换规则与C ++中的基本相同。但是,这与您在C中的具体示例无关。再次,无论语言规范的版本如何,C中的关系运算符始终生成int(而非bool)结果。

答案 2 :(得分:17)

C标准第6.5.8.6节说:

  

每个运营商&lt; (小于),&gt;   (大于),&lt; =(小于或等于   to),&gt; =(大于或等于)   如果指定,则应收1   关系是真,如果是,则为0   false。)结果的类型为int。

答案 3 :(得分:2)

似乎没有问题,因为int to bool cast是隐式完成的。这适用于Microsoft Visual C ++,GCC和Intel C ++编译器。在C或C ++中没问题。