C ++ VS2010调试器在循环范围之外的循环变量上表现得很奇怪

时间:2014-03-24 12:44:47

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

我有点困惑,因为看起来VS2010中的C ++调试器表现得有些奇怪。 如果我去运行这个:

int i = 100;

for(int i = 0; i < 5; i++)
{
    printf("Value of i inside loop: %d", i);
}

printf("Value of i outside loop: %d", i);

然后,当在上面的最后一行之后的一行上进行断点并将光标悬停在&#34; i&#34;之上时。变量,调试器显示值5.

但是,如果我决定发送&#34; i&#34;变量作为方法的参数:

Test(100);

void Test(int i)
{
    for(int i = 0; i < 5; i++)
    {
        printf("Value of i inside loop: %d", i);
    }

    printf("Value of i outside loop: %d", i);
}

然后,当在最后一行断点并用鼠标悬停在&#34; i&#34;,I时,调试器显示值100。

任何人都可以在此(或在您的机器上进行测试)让我感到高兴。它是一个bug还是一个功能,还是我错过了什么?

提前致谢!

更新:只是为了清楚 - 实际程序打印并按预期执行,只有调试器显示意外值。所以,人们可以忽略它说&#34; printf&#34;,它几乎可以涉及变量&#34; i&#34;。

3 个答案:

答案 0 :(得分:3)

这是一个错误。您要求调试器告诉您变量i的值。当前堆栈帧中有两个该名称的变量。调试器给你错误的(超出范围)。这可能是因为不为每个范围生成局部变量调试符号,仅针对每个堆栈帧。

不要这样做,这是一个非常糟糕的主意。它会让你感到困惑,或者如果不是你,会让一个追随你的程序员感到困惑,就像混淆调试器一样。

它应该生成警告C6244。

新项目最好指定/Wall /WX,即启用所有警告并将警告视为错误。

答案 1 :(得分:1)

在这两种情况下都有i的2个声明。在第一种情况下,c ++编译器会忽略声明i=100;,因此当循环结束时,i = 5。在第二种情况下,当函数结束时,i的值与参数的值相同,因为您只在函数内声明了一次。当循环结束时,循环中i的范围结束,并且作为参数传递的值保存在i中。在第二种情况下,没有定义被忽略。

答案 2 :(得分:-1)

第一个是错误。 printf应该以任何方式打印100。 某些版本的VS有一个选项'强制执行for-loop范围一致性' 或者其他一些。