简单if语句在应该的时候不评估为true

时间:2013-09-20 20:24:24

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

if ((!m_pMediaPage->PageLayer() || !m_pMediaPage->LoadState()) &&
     !m_pMediaPage->m_bRequestList)
{
    GetListInfo();
    m_pMediaPage->m_bRequestList = TRUE;
}
当所有值都为0时,

GetListInfo()不会被执行。

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

基本上改写为:

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

我只能假设if语句评估的值实际上并不是调试器所看到的。

我正在使用visual studio 2005并在第1行和第1行放置断点。 4检查值并查看它是否在if语句中执行。我不知道怎么调试这个。

就像我说的那样,在断点1处,调试器看到的每个值都是0。

.h中的函数:

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

BOOL:

typedef int BOOL;

2 个答案:

答案 0 :(得分:2)

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

  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选项。

答案 1 :(得分:1)

您将问题标记为VS2005;你是否安装了所有相关的服务包,以确保你没有遇到一些长期固定的编译器问题?

其次,您列出的函数似乎是非常简单的setter(您可能希望将它们设为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或堆栈/内存踩踏。

如果这不能解决问题,可能会解决问题。

如果这样可以解决问题,您可能需要查阅程序集以获取代码,看看是否有某种方式导致编译错误。