C++のループ for, while, do-while

プログラミングC++

C++のループは3種類(範囲指定のforを別に考えると4種類)、あります。

それぞれの使い方を説明します。

C++の聖書と称えられるストラウストラップの本を参考にしています。

C++でループ

プログラムを組むときはループは必須です。

C++のループは3種類for文, while文, do-while文があります。

大抵はfor文、たまにwhile文を使うくらいです。まずはfor文をしっかりマスターしておきましょう。

for

普通のfor文

まずは普通のfor文です。

最初だけコンパイル可能なmain関数入りです。

1, 2, 3, 4, 5という整数のvectorで各成分を出力することを考えてみます。

#include <iostream>
#include <vector>

int main(void){

    std::vector<int> v{1,2,3,4,5};

    for (int i=0; i<5; ++i){
        std::cout << v[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

for文だけを取り出すと以下のようになります。iが0から始まって5まで、というループです。

    for (int i=0; i<5; ++i){
        std::cout << v[i] << " ";
    }

for文の基本文法は以下です。

    for (初期化文; 終了する条件; 繰り返す式){
        // 何かをやる
    }

初期化文などにどんな条件、式を入れても大丈夫ですが、普通は以下のような使い方をします。

「初期化文」にint i=0と書きます。C言語ではintをここに書けなかったのを思い出します。ここにintを書いたことによって、iはこのfor文だけで通用する変数になりました。

「終了する条件」は「i < 最大値」または「i != 最大値」と書きます。どちらでもいいと思います。趣味の問題です。

「繰り返す式」は「++i」または「i++」と書きます。for文で書いている限りどちらでも同じです。

int i=0はauto i=0と書いてもOKです。

    for (auto i=0; i<5; ++i){
        std::cout << v[i] << " ";
    }

size()で回すfor文

ここからはvectorなどのコンテナ専門のfor文の回し方です。

vの最大数はv.size()で取得することにすれば下記のようになります。

    for (size_t i=0; i<v.size(); ++i){
        std::cout << v[i] << " ";
    }

初期化文は、int i=0ではなくsize_t i=0と書かないとコンパイラが文句を言うことがあります。

イテレータで回すfor文

C++らしくイテレータを取得してfor文を回すのは以下のようにします。

イテレータの場合は正しい型を書かずautoを用いるのが慣例です(本当はstd::vector<int>::iterator)。イテレータはポインタ変数のように使用しますので、*itで値にアクセスします。

    for (auto it=v.begin(); it != v.end(); ++it){
        std::cout << *it << " ";
    }

範囲指定のfor文

範囲指定のfor文が使えるようになって、こればかり使うようになってきました。

    for (auto x : v){
        std::cout << x << " ";
    }

配列要素が大きいときや、書き換えるなら&をつけておくのに注意です。

while文

while文は以下のようにして使います。

    while (条件){
        //何かやる
    }

条件が偽になるまでループを周り続けます。

for文で書き直すなら以下のようになります。

    for (;;){
       // 何かやる
       if (!条件){
           break;
        }
    }

逆にfor文を書き直すこともできます。for (初期化文; 終了する条件; 繰り返す式)は以下のようなwhile文になります。

    初期化文;
    while (終了する条件){
        // なにかやる
        繰り返す式
    }

つまり、以下のような形になります。

    int i = 0;
    while (i<5){
        std::cout << v[i] << " ";
        ++i;
    }

おそらくwhile文を使う人は、最後の++iを処理の中に紛れ込ませます。

    int i = 0;
    while (i<5){
        std::cout << v[i++] << " ";
    }

私は、処理とインクリメントを同じ文の中に書くと混乱するので書きませんが、割とこういう書き方を好む人が多いと思います。

do-while文

do-while文は、whileに似ています。条件が処理の後に判定されます。

    do {
        //何かやる
    }while(条件式)

大抵の場合、whileと変わりません。

処理が必ず1回実行されることが保証されます、と本には書いてあります。確かにそうなのですが、私は使ったことがありません。普通のwhile文で代用可能ですし、for文でも書けます。

まとめ

趣味の問題なのですが、私はfor文しか使いません。whileはdo-whileは製品コードで使ったことはありません。逆に、whileを好んで使う人もいます。do-whileを好む人はあまり見たことがありません。

「普通はfor文、無限ループだけはwhile文」というのが普通のようです。

コメント

スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク
タイトルとURLをコピーしました