"true"并不总是转换为 1
'true' not always converted to 1
我有这个MFC代码:
bool SomeBooleanValue;
...
m_ComboBox.ResetContent();
m_ComboBox.AddString("String1");
m_ComboBox.AddString("String2");
m_ComboBox.SetCurSel(SomeBooleanValue);
其中m_ComboBox是CComboBox对象。有时,当SomeBooleanValue在CComboBox::SetCurSel函数中为true而不是1时,我会在调试过程中看到值252:
_AFXWIN_INLINE int CComboBox::SetCurSel(int nSelect)// here nSelect = 252!
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, CB_SETCURSEL, nSelect, 0); }
正如我所知,C++标准说:
bool类型的右值可以转换为int类型的右值,false变为零,true变为一。
你知道为什么会这样吗?
标准的正确措辞是§4.7/p4积分转换[conf.Integral]:
如果目的地类型为bool,请参见4.12。如果源类型是bool,值false被转换为零,值true被转换到一。
因此,是的,如果bool
的值为false
,则它将被转换为零,如果它的值为true,则它被转换为一。
同样来自§3.9.1/p6基本类型[基本.基本]:
布尔类型的值为true或false。
但注意[49]警告我们:
49)按照本国际标准描述的方式使用布尔值标准为"未定义",例如通过检查未初始化的自动对象,可能会使其表现为既不是真的也不是假的。
也就是说,如果不初始化布尔值,初始值将是未知的(即,任意的)。因此,您会得到一种被标准描述为"未定义"的行为。
获得这种行为的唯一机会是:
- 布尔变量未初始化
- 您有另一个部分正在写入您的变量(例如超限)
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 尝试将字符串变量转换为布尔值会导致 "true" 和 "false" 都等于 0
- 从true值到std::true_type的隐式转换
- "true"并不总是转换为 1
- 如果是字符或字符串返回false,但如果输入不能转换为整数则返回true.c++的while循环