Visual Studio调试器将“true”显示为“0”

时间:2012-11-25 22:50:06

标签: c++ visual-studio-2010 visual-c++

一个非常奇怪的情况发生在我身上 - 在使用调试器时,它向我显示某个布尔变量的值是true,但是当我打印它(或者用它做任何其他操作)时,它表现为0(即假)。

我该怎么做才能解决这个问题?我担心这是环境问题所以发布代码示例将毫无意义。 (一个隐藏的,烦人的内存管理错误不是原因,对吧?),在这个上下文中我想指出,发现我的环境没有很好的配置会令我感到惊讶(我在这个项目中工作)环境超过一年)。

到目前为止我:

  • 仔细检查编译器是否在我的项目属性中对代码进行了任何优化。
  • 尝试重新打开visual studio并清理并重新构建项目
  • 在网上搜索解决方案(未找到任何解决方案)。 我使用visual studio 2010,我的编程语言是C ++

关于代码共享请求:

我很抱歉,但我无法发布代码(我的老板会很高兴看到它在网络上运行)....如果你能够提出一些关于问题可能原因的想法,它会很棒,我会自己在代码中寻找线索,检查这些原因是否真的导致了问题。但是,为了清楚起见,这里有一些困扰我的代码行:

    bool dir = getNode(location)->getNext()->getDirection(); //dir is displayed as "true" in the debbuger
    int toPush = (dir == 1) ? 1 : 0; //"toPush" is displayed as "0" in the debbugger
    cout<<dir<<endl; //both output 0.
    cout<<(dir == true)<<endl;

根据您的要求,我附加了一个屏幕截图。注意“dir”的值在屏幕的右下角显示为“true”,而右边的程序输出则以0结尾(对应于“cout&lt;&lt; dir”命令)

screen shot

1 个答案:

答案 0 :(得分:3)

您不应该使用==运算符来测试bool值的真相。任何非零值都是真的。你有两条cout行,控制台窗口中的最后两行说240和0.我写这篇文章来证明我的想法:

#include <iostream>

using namespace std;

static bool getDirection()
{
    union forceBoolValue
    {
        unsigned int iValue;
        bool bValue;
    };
    forceBoolValue retValue;
    retValue.iValue = 0xFFFFFFFF;
    return retValue.bValue;
}

int _tmain(int argc, _TCHAR* argv[])
{
    bool dir = getDirection();  //dir is now 255*, which is non-zero and therefore "true"
    int toPush = (dir == 1) ? 1 : 0;  //dir may be true but it is not one, so toPush is 0
    int toPush2 = dir ? 1 : 0;  //dir is true, so toPush2 is 1
    cout << "Dir: " << dir << endl;
    cout << "toPush: " << toPush << endl;
    cout << "toPush2: " << toPush2 << endl;
    return 0;
}

类似的事情发生在dir == true,它可能再次测试一个值。我不知道为什么dir在您的代码中获得了一个不寻常的值(240),但是如果您删除了比较并只测试了值(如上面的toPush2那么)它应该解决问题。

我知道您说toPush行只是为了证明这个问题,但您是否正在对任何真实代码进行比较?如果是这样,请删除它们。

* dir可能不是255,取决于您环境中bool的大小。