実際、ループは非常に便利な難読化ツールです。
while ループのテストを考えてみましょう。このテストは、プログラムの実行中に 2 回実行されます。1 回目は、検査している a の値が 2 であるため、テストは成功します。2 回目の実行では、テスト中の a が a であるため、テストは失敗します。値 3 を保持する異なる a! これは非常に驚くべきことです。
私の同僚の説明によると、a の 3 つの宣言は、'{' と '}' で区切られたスコープ (または最初のスコープのワールド スコープ) にのみ存在します。これが文字通り真である場合、値 3 に割り当てられた宣言の内部は '{' と '}' によって完全に隠されているため、while (a == 2) テストは永久に合格するはずです。
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 を取得して合格します。2 番目の 'T2' は '{' と '}' のスコープ内で実行され、3 である a を取得し、テストは失敗します。
あなたのステートメントを考えると、2 番目のテストは 3 である a のローカル スコープ定義を使用するため、ループは 1 回のパス後に終了します。