这种转换的可移植性有多好。我能确定两个断言都通过了吗?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);不要问为什么。我知道这是丑陋的。谢谢。
发布于 2011-03-21 00:32:35
int x = 4<5;完全便携。符合标准。从bool到int的转换是隐式的!
§4.7/4来自C++ 11或14标准,§7.8/4来自C++ 17标准,§7.3.9/2来自20标准表示(整数转换)
如果源类型为bool,则值
false将转换为零,值bool将转换为一个。
至于C,据我所知,在C中没有bool (在1999年之前),所以bool到int的转换只与C++相关。在C中,4<5的计算结果为int值,在本例中,值为1,4>5的计算结果为0。
编辑: Jens在评论中说,C99有_Bool类型。bool是在stdbool.h头文件中定义的宏。true和false也是在stdbool.h中定义的宏。
§7.16来自C99的说明,
将宏bool展开为
_Bool。
。。展开为整数常量1,false的true,展开为整数常量0,..
发布于 2011-03-21 00:41:48
您同时标记了问题C和C++。结果在不同的语言之间是一致的,但每种语言的答案结构都是不同的。
在C语言中,您的示例与bool无关(这也适用于C99 )。在C语言中,关系运算符不会产生bool结果。4 > 5和4 < 5都是生成值为0或1的int类型结果的表达式。所以,在C语言的例子中,没有发生任何类型的"bool to int转换“。
在C++中,关系运算符确实会产生bool结果。bool值可以转换为int类型,true转换为1,false转换为0。这是由语言保证的。
P.S.C语言还具有专用的布尔类型_Bool (宏别名为bool),其整数转换规则与C++语言基本相同。但是,这与C中的特定示例无关。同样,无论语言规范的版本是什么,C中的关系运算符都会生成int (而不是bool)结果。
发布于 2011-03-21 00:34:32
C标准的第6.5.8.6节规定:
如果指定的关系为真,则
运算符<(小于)、>(大于)、<= (小于或等于)和>= (大于等于)中的每个运算符都将产生1,如果关系为假,则结果为0。)结果的类型为int.
https://stackoverflow.com/questions/5369770
复制相似问题