布尔到整数的转换

这个转换的可移植性如何? 我能确定这两个断言都能通过吗?

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


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

别问为什么,我知道这很难看,谢谢。

188047 次浏览
int x = 4<5;

完全便携。标准一致。 boolint转换是隐式的!

C + + 11或14标准的4.7/4,C + + 17标准的7.8/4,20标准的7.3.9/2(积分 转换)

如果源类型为 bool,则值 false转换为零和 值 true转换为1


至于 C,据我所知 C 中没有 bool(1999年以前) ,所以 boolint的转换只与 C + + 有关。在 C 语言中,4<5计算为 int值,在这种情况下,值是 14>5计算为 0

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

C99里的7.16说,

bool展开为 _ Bool。

[ . . ] true,它展开为整数常量 1,< strong > false 它展开为整数常量 0,[ . . ]

C 标准第6.5.8.6节写道:

每个运算符 < (小于) ,> (大于) ,< = (小于或等于) To)和 > = (大于或等于) 如果指定的 关系为真,如果为真则为0 False)结果的类型为 int。

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

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

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

P.S. C 语言还有一个专用的布尔类型 _Bool(宏别名为 bool) ,其整数转换规则基本上与 C + + 相同。尽管如此,这与 C 中的具体例子并不相关。同样,C 中的关系运算符总是产生 int(而不是 bool)结果,而不管语言规范的版本如何。

似乎没有问题,因为 int 到 bool 转换是隐式完成的。这在微软的 Visual c + + 、 gCC 和 Intel C++编译器中都可以使用。C 或 C + + 都没有问题。