【问题标题】:'true' not always converted to 1'true' 并不总是转换为 1
【发布时间】:2015-11-29 10:36:26
【问题描述】:

我有这个 MFC 代码:

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

其中 m_ComboBox 是一个 CComboBox 对象。有时当 CComboBox::SetCurSel 函数中的 SomeBooleanValue 为 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 变为 0,true 变为 1。

任何想法为什么会发生这种情况?

【问题讨论】:

  • SomeBooleanValue 在这里不是右值。
  • SomeBooleanValue 未初始化。
  • 101010,我没有注意到...所以当使用布尔变量作为整数时,我们不能确定它们会被转换为0和1吗? πάντα ῥεῖ,SomeBooleanValue 已初始化
  • @IKM2007 至少它不在您显示的代码中。

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


【解决方案1】:

标准的正确措辞是§ 4.7/p4 Integral conversions [conv.integral]:

如果目标类型是 bool,请参见 4.12。如果源类型是布尔型, 值 false 被转换为零并且值 true 被转换 到一个。

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

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

bool 类型的值为真或假。

但是注释 [49] 警告我们:

49) 以本国际描述的方式使用布尔值 标准为“未定义”,例如通过检查 未初始化的自动对象,可能会导致它表现得好像它是 不真也不假。

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

【讨论】:

  • 感谢您的回复,但我认为情况并非如此,因为我在构造函数中将布尔值初始化为 false。我提供的代码不是原始代码,但功能是相同的。我还在调试器中看到我将 true 传递给该函数。我会更仔细地调查这个案子,也许我遗漏了什么。
  • 我已经检查过了,你是对的。我使用的布尔值是从另一个未初始化的布尔值结构中复制的。在调试器上,我看到它的值为“true”,但实际上那里只有一个内存垃圾。修复后,我可以将该布尔值用作 0/1 整数。谢谢!
【解决方案2】:

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

  1. 您的布尔变量未初始化
  2. 您有另一部分正在覆盖您的变量(例如溢出)

【讨论】:

    猜你喜欢
    • 2017-07-23
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多