在C/C++中将int强制转换为bool
Casting int to bool in C/C++
我知道在C和C++中,当将布尔强制转换为int、(int)true == 1
和(int)false == 0
时。我想知道朝相反的方向选角。。。
在下面的代码中,在使用Visual Studio 2013和KeilµVision 5编译的.c文件中,以下所有断言对我来说都是正确的。注意(bool)2 == true
。
C和C++标准对将非零、非一整数强制转换为布尔值有何规定?是否指定了此行为?请附上引文。
#include <stdbool.h>
#include <assert.h>
void TestBoolCast(void)
{
int i0 = 0, i1 = 1, i2 = 2;
assert((bool)i0 == false);
assert((bool)i1 == true);
assert((bool)i2 == true);
assert(!!i0 == false);
assert(!!i1 == true);
assert(!!i2 == true);
}
不是对于任何C++编译器,我可以假设(bool(true==(int(1吗?:
- 反向铸造(int-->bool(
- 没有讨论非零、非一的值
0个基本类型(1((2(的值映射到false
。
其他值映射到true
。
该约定是在原始C中通过其流量控制语句建立的;C当时没有布尔类型。
假设false
作为函数返回值表示失败是一个常见的错误。但特别是从main
来看,false
表示成功。我已经多次看到这种错误,包括在D语言的Windows入门代码中(当你有像Walter Bright和Andrei Alexandrescu这样的人出错时,很容易出错(,因此请注意。
对于内置类型,不需要强制转换为bool
,因为这种转换是隐式的。然而,Visual C++(微软的C++编译器(有一种倾向,会为此发出性能警告(!(,这是一个纯粹愚蠢的警告。强制转换不足以关闭它,但通过双重否定的转换,即return !!x
,效果很好。可以将CCD_ 11读取为“转换为bool
”运算符,与-->
一样可以读作“转到";。对于那些深入研究运算符符号可读性的人。;-(
1(C++14§4.12/1“零值、空指针值或空成员指针值被转换为false
;任何其它值被转换为CCD_ 15。对于直接初始化(8.5(,std::nullptr_t
类型的prvalue可以转换为bool
类型的prvalue;得到的值是CCD_ 18”
2(C99和C11§6.3.1.2/1“当任何标量值转换为_Bool
时,如果该值比较等于0,则结果为0;否则,结果为1。";
以下引用了C11标准(最终草案(。
6.3.1.2:当任何标量值转换为_Bool时,如果该值比较等于0,则结果为0;否则,结果为1。
bool
(由stdbool.h
映射到C的内部名称_Bool
(本身是一个无符号整数类型:
类型_Bool和与标准有符号整数类型相对应的无符号整数类型是标准无符号整数。
根据6.2.5p2:
声明为类型_Bool的对象足够大,可以存储值0和1。
AFAIK这些定义在语义上与C++相同,只是内置的(!(名称略有不同。C++的bool
和C.的_Bool
注意,C不像C++那样使用术语右值。然而,在C中,指针是标量,因此将指针分配给_Bool
的行为与C++中一样。
在没有微软cl编译器C4800警告的情况下,对cast-int->bool有一种老派的"Marxismic"方法,那就是使用否定的否定。
int i = 0;
bool bi = !!i;
int j = 1;
bool bj = !!j;
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- 从标准::字符串到标准::矢量<bool>的快速转换
- 从标准::未来<void>到非标量标准::未来<bool>引发的错误转换
- 如果类对象需要在 C++ 中转换为 int,为什么会调用 "operator bool()"?
- 从nullptr_t转换为bool:有效与否
- 为什么这个GitHub项目将字符串转换为bool
- 我无法将'2D array whit bool'转换为"空 2D 数组布尔值"(用于生命游戏)
- 错误:无法将"dirent*"转换为"search_directories(std::string, std::list<start_tournament_info_t*>&, bool)
- 无法将“ bool”转换为“ gzfile {aka gzfile_s*}”
- 防止在执行时将两个类中的两个对象转换为 bool:if(a!=b)
- C++变体用bool转换构造函数
- 为什么函数向bool存在隐式转换
- Bool 在 'std::rel_ops' 示例中进行强制转换
- 为什么显式 bool() 转换在上下文转换中不发生
- Visual Studio无法在布尔运算的上下文中实例化强制转换运算符模板(T=bool)
- 为什么C/C++会自动将char/wchar_t/short/bool/enum类型转换为int
- 错误 C2440: 'type cast':无法从 'bool' 转换为 'CString'
- C++11 无法将 std::condition_variable::wait 从 'void' 转换为 'bool'
- 为什么显式运算符 bool 允许我转换为任何基元类型
- 将位集数组转换为矢量<bool>