for文一重化とは二重以上の入れ子になっているfor文を一重にまとめることをいいます。
単純に考えるとfor(;;)が消えるので7バイト縮まるのですが上手くいく場合とそうでない場合があります。
ここでは二重のfor文を一重化することを考えます。
単純に考えるとfor(;;)が消えるので7バイト縮まるのですが上手くいく場合とそうでない場合があります。
ここでは二重のfor文を一重化することを考えます。
for文一重化は次のようにするのが基本となります。
(bは終了条件なので常に存在しています。)
ということはfor文が二重の段階でc,d,f,gの部分に処理が入らないように工夫すると一重化で短くなりやすいです。
ここではfが常に真であることを仮定します。
たいていの場合、工夫してfを真にすることはそんなに難しくありません。
問題なのは実行順序が変わっているという点です。プログラムの流れを見てみましょう。
なぜこのようにbとdの順序を逆転させるかというと、bがループの終了条件になっているからです。
dで行われる処理がbに依存する場合は工夫しないと一重化することができません。
しかしそれ以上に問題なのが最初の部分が大幅に変わっていることです。
for文二重化の際に最もネックとなってくるのがこの点で、初期化の方法を変えるのが難しい場合は二重のままである方が短い場合が多いです。
for(a;b;c)for(d;e;f)g; for(a;e?g,f:(c,d,b););これでは1バイトも縮んでいませんが、cとd、fとgのいずれかが無い場合はコンマの分だけ短くなります。
(bは終了条件なので常に存在しています。)
ということはfor文が二重の段階でc,d,f,gの部分に処理が入らないように工夫すると一重化で短くなりやすいです。
ここではfが常に真であることを仮定します。
たいていの場合、工夫してfを真にすることはそんなに難しくありません。
問題なのは実行順序が変わっているという点です。プログラムの流れを見てみましょう。
a->b->d-> e->g->f->e->c-> b->d-> e->g->... //二重 a-> e->g->f->e->c->d->b-> e->g->... //一重、eの初期値が真 a->e->c->d->b-> e->g->f->e->c->d->b-> e->g->... //一重、eの初期値が偽変わったのは最初の部分とbとdの順序です。
なぜこのようにbとdの順序を逆転させるかというと、bがループの終了条件になっているからです。
dで行われる処理がbに依存する場合は工夫しないと一重化することができません。
しかしそれ以上に問題なのが最初の部分が大幅に変わっていることです。
for文二重化の際に最もネックとなってくるのがこの点で、初期化の方法を変えるのが難しい場合は二重のままである方が短い場合が多いです。
コメントをかく