'true'并不总是转换为1

时间:2015-11-29 10:36:26

标签: c++ mfc integer boolean type-conversion

我有这个MFC代码:

bool SomeBooleanValue;
...
m_ComboBox.ResetContent();
m_ComboBox.AddString("String1");
m_ComboBox.AddString("String2");
m_ComboBox.SetCurSel(SomeBooleanValue);

其中m_ComboBox是CComboBox对象。有时当在CComboBox :: SetCurSel功能中SomeBooleanValue为真而不是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类型的rvalue可以转换为int类型的rvalue,false变为零,true变为1。

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

标准的正确措辞是§4.7/ p4积分转换[conv.integral]:

  

如果目的地类型是bool,请参阅4.12。如果源类型是bool,   值false将转换为零,并转换值true   一个。

所以是的,例外行为是bool如果其值为false则转换为零,如果其值为真则转换为1。

同样来自§3.9.1/ p6基本类型[basic.fundamental]:

  

bool类型的值为true或false。

但请注意[49]警告我们:

  

49)以本国际描述的方式使用bool值   标准为“未定义”,例如通过检查a的值   未初始化的自动对象,可能会使其行为就像它一样   既不真实也不虚假。

也就是说,如果不初始化布尔值,则初始值将是未知的(即,任意)。因此,您将标准描述为“未定义”的行为。

答案 1 :(得分:1)

获得此行为的唯一机会是:

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