"true"并不总是转换为 1

'true' not always converted to 1

本文关键字:转换 true      更新时间:2023-10-16

我有这个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)按照本国际标准描述的方式使用布尔值标准为"未定义",例如通过检查未初始化的自动对象,可能会使其表现为既不是真的也不是假的。

也就是说,如果不初始化布尔值,初始值将是未知的(即,任意的)。因此,您会得到一种被标准描述为"未定义"的行为。

获得这种行为的唯一机会是:

  1. 布尔变量未初始化
  2. 您有另一个部分正在写入您的变量(例如超限)