>>838の
foo() {
 cond = true;
 while (cond) {
  s1;s2;
    if (...) {cond = false}
  s3;s4;
 }
}
これは、condが2回目のループでfalseになるとすると、
s1,s2,s3,s4,s1,s2,s3,s4の順で実行される。
で、
foo() {
 s1;s2;
 if (!...) {foo();}
 s3;s4;
}
これは、2回目のループで(!...)がfalseになるとすると、
s1,s2,s1,s2,s3,s4,s3,s4で実行されるから順番が変わる。そこでs3;s4をifの前に持ってくるわけだ。
すると、
foo() {
_loop:
 s1;s2;s3;s4
 if(...) goto _loop;
}

みんな末尾再帰でgoto使う?