t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

Cの学習とVBAとの比較 その2 ~Cのforループは極めて柔軟

本日もCの学習。

独習C

独習C

書籍によると、

ほかのプログラミング言語と比べると、Cのforループは際立って強力かつ柔軟です。

とのこと。

まずVBAのForループから見ていこう。

Sub test()
    Dim i As Integer
    For i = 1 To 10 Step 1
        Debug.Print i
    Next i
End Sub

VBAのForループは非常にわかりやすい。
「iが1から10まで1ずつ増える」という言葉どおりだからだ。
これをCに置き換えるとこうなる。

#include <stdio.h>

int main(void)
{
    int i;
    for(i=1;i<=10;i++){
        printf("i=%d\n",i);
    }
    return 0;
}

慣れない人は、なんか記号が増えてごちゃごちゃしている印象を受けるかもしれない。
Cのfor文ではセミコロンによって処理のパートが分かれている。
それぞれは、for(初期設定部; 条件判定部; インクリメント部)というらしい。
i++というのはVBAでいうとi=i+1のことだ。CでもVBAのように書けるが、慣れるとi++の方が直感的な気がする。

さて、CのforがVBAと異なるのは、それぞれのパートが果たす役割である。

初期設定部は、最初に1度だけ実行される。
条件判定部は、初期設定のすぐ後に実行され条件を満たしていれば中身の処理に移る。
中身の処理が最後まで来たら、次にインクリメント部が実行される。

つまり、このような動作である。
初期設定→条件判定→内容→インクリメント→条件判定→内容→インクリメント→条件判定

ここでCのforが凄いのは、決められているのは実行順だけで、各パートの処理内容は問わないということ。

たとえば、こんな変な書き方もできる。

int main(void)
{
    int i;
    for(i=1;i<=10;printf("%d\n",i)){
        i++;
    }
    return 0;
}

実行するとまず初期設定でiが1になり、そのあと条件判定をクリアしてforの内容i++が実行される。
それからインクリメント部のprintfが実行される。結果は2~10の整数が出力される。

また、こんな書き方もできる。

int main(void)
{
    int i;
    printf("数値を入力してください=>");
    for(scanf("%d",&i);i>=1;i--){
        printf("%d\n",i);
    }
    return 0;
}

上記は、初期設定部でscanfでiの値を入力させて、カウントダウンさせるプログラムである。

そもそも、条件判定部ですら比較演算をしなくても良い。

#include <stdio.h>

int main(void)
{
    int i;
    for(i=1;printf("test\n");i++){
    }
    return 0;
}

実は、ちゃんと条件判定は行われている。
Cでは0が偽(VBAのFalse)、0以外は真(True)となるが、printfは出力された文字数を戻り値として返す。
この場合はtestの4文字と、改行1文字でprintfの戻り値が5なので、真と判定される。

上記の場合は無限ループになるので、forの中身で判定してbreakしてやる必要がある。


さらに、カンマを用いて、初期設定部やインクリメント部で2つの処理を同時に行うこともできる。
以下は、iを増やしながらjを減らして、iがjに追いついたら終了するプログラムである。

#include <stdio.h>

int main(void)
{
    int i,j;

    for(i=1,j=10;i<j;i++,j--){
        printf("i=%d j=%d\n",i,j);
    }
    return 0;
}

出力は次のとおり。

i=1 j=10
i=2 j=9
i=3 j=8
i=4 j=7
i=5 j=6

それと、各パートは一部だけ書いても良いし、何も書かなくても良い。
たとえば、for( ; ; )と書けば単に無限ループになる。

これらの柔軟性をうまく活用できれば非常に強力なツールになるが、闇雲に使っては単にわかりにくいコードになってしまう点には気を付けたい。

Cのfor文は柔軟で痒い所に手が届く。
VBAのFor文はシンプルで見通しが良い。

他の言語を知ることでメインの言語の良さが見えてくるということもあるので多言語学習はおすすめである。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。