我有点困惑,因为 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);
然后,当在上面最后一行之后的一行上设置断点并将光标悬停在“i”变量上方时,调试器将显示值 5。
但是,如果我决定将“i”变量作为参数发送给方法:
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);
}
然后,当在最后一行断点并将鼠标悬停在“i”上时,调试器显示值 100。
任何人都可以告诉我这一点(或在您的机器上进行测试)。这是一个错误还是一个功能,或者我错过了什么?
提前致谢!
更新:只是为了让事情变得清楚 - 实际程序按预期打印和执行,只有调试器显示意外的值。因此,人们可以忽略它说的“printf”,它几乎可以是涉及变量“i”的任何内容。
最佳答案
这是一个错误。您要求调试器告诉您变量 i
的值。当前堆栈帧中有两个同名的变量。调试器给你错误的(超出范围)。这可能是因为局部变量调试符号不是为每个作用域生成的,而是为每个堆栈帧生成的。
不要这样做,这是一个非常糟糕的主意。它会让你感到困惑,或者即使不是你,也会让你之后的程序员感到困惑,就像它让调试器感到困惑一样。
它应该生成警告 C6244。
新项目最好指定/Wall/WX
,即启用所有警告并将警告视为错误。
关于C++ VS2010 调试器对超出循环范围的循环变量表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22609781/