实际上,循环在这里是一个非常方便的混淆器。
考虑 while 循环的测试。这个测试在程序执行过程中运行了两次,第一次测试成功,因为它正在检查的 a 的值为 2。第二次运行,测试失败,因为它正在测试的 a 是不同的 a,其值为 3!这是非常令人惊讶的。
鉴于我的同事的解释,a 的三个声明仅存在于它们的封闭“{”和“}”分隔范围(或第一个的世界范围)中。如果这确实是真的,那么 while (a == 2) 测试应该永远通过,因为分配给值 3 的内部声明被“{”和“}”完全隐藏了
int a = 1; // world scope - a is 1
myproc()
{ // New scope; can define names inside here
int a = 2; // Redefine a to be 2
while ( a == 2 ) // We test whether a is 2
{ // New scope; can define names inside here
int a = 3; // Redefine a to be 3
} // end of scope, the a = 3 disappears; also branch back to top of loop
} // end of myprog scope, so the a=2 disappears
理解这一点的方法是意识到while (test) { statements; }
实际实现为:
if ( test ) { // T1
L1: {
statements;
if ( test ) // T2
goto L1;
}
}
所以实际上,测试语句被复制了,第一个'T1'在'{'和'}'之外的范围内执行,并获得为2的a,并通过;第二个 'T2' 在 '{' 和 '}' 的范围内执行并获得为 3 的 a 并且测试失败。
给定您的语句,第二个测试使用其本地范围的 a 定义,即 3,因此循环在一次通过后退出。