Part 5.変数の定義域(5)

プログラ民!!


ちょっと用語が紛らわしかったようで、補足から入りたい。


私の「前判定」「後判定」と呼んでいるのは、for(int i=0;i<max;++i) のようなループにおいて、インクリメントの“後に”ループ脱出条件の判定を行なうか、“前に”行なうのか、ということである。

よく使われる、プログラムをテキストとして見て、判定文が上にあるか下にあるかという定義とは異なるけれど、こうして定義しないと整合性がとれない。たとえば、C言語であれ、


#define do_while(B,A) do { A; } while (B)
こういうマクロを定義して、

int i=0,j=0;
do_while( (i<10),(j++,i++) );
こういう書き方が出来る。条件部がプログラム表記上、前に出ているにもかかわらず、構造上、後で判定される。


この連載ではプログラムの論理構造を主題としているわけで、C言語限定ではなく、上のような構文を持つ言語をも対象として考慮しておかなければならない。


よって、プログラム表記上「上にあるか下にあるか」というような定義を用いるわけにはいかない。


さて続き。foreachのような構文を後判定で実装するメリットは、 id:sshi:20041104#p3 で書かれている程度だと思う。別に前判定でも構わないし、前判定で書いたものでもコンパイラの最適化によって後判定に書き換えられることがある。(その逆もありうる) だから、そのへんはこれ以上突っ込まない。


そういう考察をするまでもなく、ループ構造を一般化して考えていけば、なぜ後判定で書かなければならないか(書くことになるのか)が見えてくる。


そこでforeachでなく、もう少し一般的なループの脱出条件をどう書くかについて考えてみよう。