我有一些简单的代码行(如下)。 [bp]表示断点。
for(int i=0;i<300;i++){}
int i=0;
cout<<i;
[bp] for (i=0;i<200;i++){}
当我在visual studio中调试它时,它告诉我在断点上我等于300。令人讨厌的是,0被打印到控制台。有没有办法让它意识到不同范围内的两个变量实际上可以具有相同的名称?
我还想在第二个循环中添加一些代码然后调试它 - 但是当我尝试这样做时,我一直显示为300.非常讨厌。
答案 0 :(得分:5)
在我的visual studio中,查看调试器Locals窗口
i 300 int
argc 1 int
argv 0x00214b88 wchar_t * *
i 0 int
请注意!调试输出中有两个i varible,i == 300和i == 0
我在想它变得困惑的原因是调试器的怪癖/错误,它跟踪我当你将鼠标悬停在i上时会感到困惑,它只会返回第一个i?或者某些这样的,我不认为它在语义上检查我要显示的内容。
答案 1 :(得分:1)
如果您的断点位于
for (i=0;i<200;i++){}
行,这意味着新的i
在命中断点时尚未初始化,因为该行代码尚未执行。所以它仍然带有原始i
值。
答案 2 :(得分:0)
在代码中不同位置使用相同的varibale是 NOT 理想。
以下是解决方案:
使用大括号分隔同一变量的不同用例。
for(int i=0;i<300;i++){}
{
int i=0;
cout<<i;
}
{
[bp] for (i=0;i<200;i++){}
}
注意:强>
正如罗伯特正确地指出的那样,除非执行指令,否则
i 不会初始化为新值。
古德纳克!!
答案 3 :(得分:0)
第三个i
可以为第一个i
添加别名,因为它们具有非重叠的范围。第二个i
不能对第三个进行别名,因为它们的范围执行重叠。
因此,编译器知道它需要为至少两个整数分配存储空间。第一个整数的空间可以由第一个和第三个i
共享,第二个i
的空间专门为第二个i
保留。这些位置可以是寄存器或堆栈槽,而不失一般性。
中期结论:对于编译器,使用名称i的频率并不重要。它只关心你有多少变量,以及它们的范围重叠。
因此,当调试器点击第二个for循环时,它会看到您正在观看第三个i
。调试器会查找第三个i
的位置。由于该位置也用于第一个i
,它仍然包含300.这当然对程序无关紧要,因为你开始将0写入第三个i
,覆盖旧的该位置的价值为300。
因此,关键步骤是了解变量如何映射到位置。