【问题标题】:Simple if statement not evaluating to true when it should简单的 if 语句不应该评估为真
【发布时间】:2013-09-20 20:24:24
【问题描述】:
if ((!m_pMediaPage->PageLayer() || !m_pMediaPage->LoadState()) &&
     !m_pMediaPage->m_bRequestList)
{
    GetListInfo();
    m_pMediaPage->m_bRequestList = TRUE;
}

当所有值为 0 时,GetListInfo() 不会被执行。

PageLayer() 和 LoadState() 返回整数,m_bRequestList 是一个整数。

基本上改写成这样:

if ((!0 || !0) && !0)  -or-  if ((1 || 1) && 1)

我只能假设 if 语句所评估的值与调试器所看到的并不完全一样。

我正在使用 Visual Studio 2005 并在第 1 行和第 4 行放置断点以检查值并查看它是否执行到 if 语句中。我不确定如何调试它。

就像我说的,调试器在断点 1 处查看的 3 个值中的每一个都是 0。

.h 中的函数:

int  PageLayer() {return m_iCurrentLayer;} - protected
BOOL LoadState() {return m_bLoadDone;}     - protected

布尔值:

typedef int BOOL;

【问题讨论】:

  • 然后您使用调试器逐步检查并确认您获得了预期的返回值?您已经尝试预先捕获所有的值,以便在 if 之前看到它们?
  • 我单步执行是,即使在重复继续 (F5) 之后,它也会以相同的值返回到同一点,并且不会进入 if 语句。我没有尝试在 if 语句之外捕获它们,但我不明白为什么它们不会与调试器声称的值一起打印出来。不过我会试一试。
  • 在断点 1 处尝试单步执行方法,使用 F10 验证两个方法的返回值。
  • @Enigma 你可以进入LoadState 的事实证明事情并不像你说的那样。如果PageLayer 返回零,那么您的程序甚至不会调用LoadState。在表达式 A || B 中,如果 A 为真,则 B 不会被计算。
  • @john:我应该澄清一下。我没有进入您提到的功能,而只是查看将返回的值。

标签: c++ debugging if-statement visual-studio-2005 logic


【解决方案1】:

如果从不同函数返回的所有值都返回零,则该条件语句看起来好像会被执行。如果函数体没有被执行,我会按如下方式调试问题:

  1. 记录if-语句之前所有函数的值:

    std::cout << "page-layer=" << !m_pMediaPage->PageLayer() << ' '
              << "load-state=" << !m_pMediaPage->LoadState() << ' '
              << "request-list=" << !m_pMediaPage->m_bRequestList << '\n';
    

    是的,调试器也应该显示这些值,但我非常相信打印出来的值就是实际评估的值。

  2. 如果这不能对问题所在提供必要的洞察力,我会开始将条件分解为单独的部分并在每个级别验证成功,例如:

    if (!m_pMediaPage->PageLAyer()) {
        std::cout << "page-layer is not set\n";\
    }
    if (!m_pMediaPAge->LoadState()) {
        std::cout << "load-state is not set\n";
    ...
    
  3. 如果这仍然没有提供任何见解,我会开始怀疑函数返回有趣的值,我会验证不同的结果是否是有趣的值,我会在使用预处理后开始查看输出-E 选项。

【讨论】:

  • 我级联了 if 语句,奇怪的是第一个语句甚至没有在调试器中被命中。就好像断点不在调试器眼中的位置。
  • @Enigma:是否有可能使用了一些陈旧的目标文件?从头开始干净地构建您的项目!另外,您看到记录的输出了吗?
  • @Enigma,您是否正在尝试调试代码的“发布版本”?听起来您正在尝试调试已优化的代码。这通常不是很有帮助,因为优化器有移动事物的习惯,因此调试器无法真正跟踪正在发生的事情。
【解决方案2】:

您将问题标记为 VS2005;您是否安装了所有相关的服务包以确保您不会遇到一些长期修复的编译器问题?

其次,您列出的函数似乎是非常简单的设置器(您可能希望将它们设为 const,尽管这与您的问题无关)。

您正在调试调试器,因此检查您的断言是否都为零可能很有价值:

bool plCond = (m_pMediaPage->PageLayer());
bool lsCond = (m_pMediaPage->LoadState());
bool rlCond = (m_pMediaPage->m_bRequestList);
bool getListInfoCond = ((!cond1 || !cond2) && !cond3);

if (getListInfoCond)
{
    GetListInfo();
    m_pMediaPage->m_bRequestList = TRUE;
}

如果这解决了问题,你要么有一个 heisenbug,要么有一个堆栈/内存踩踏。

如果这不能解决问题,它可能会找到原因。

如果这确实解决了问题,您可能需要查阅程序集以获取代码,看看您是否以某种方式触发了编译器错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多