【C言語】
for文とwhile文の書き方
-C99スタイルでループカウンタの可視範囲を局所化するメリット-

■この記事の概要

この記事では、C言語でC99スタイルのfor文を使用し、ループカウンタの可視範囲を局所化する方法を紹介しています。

for文とwhile文の使い分けも説明し、簡潔で読みやすいコードの書き方を学べます。


■for文の新しい書き方(推奨C99スタイル)

//C99スタイルのfor文
#include <stdio.h>
int main(void){
    for(int x = 0 ; x<10; x++){
        for(int y = 0; y<10; y++){
            for(int z = 0; z<10; z++){
                printf("今時のfor文 xyz=%d\n",x*y*z);
            }
        }
    }
}

今のC99仕様では
変数は必要な所で宣言できます。

for文も宣言、初期化、更新が1行で書け
読むのが楽になります。


■for文の古い書き方(非推奨C89スタイル)

//C89スタイルのfor文
#include <stdio.h>
int main(void){
    /*関数先頭で変数の宣言*/
    int     x;
    int     y;
    int     z;

    /*とりあえず0で初期化*/
    x = 0;
    y = 0;
    z = 0;
      
    /*本処理*/
    for(x = 0 ; x<10; x++){
        for(y = 0; y<10; y++){
            for(z = 0; z<10; z++){
                printf("君の教科書古いかも? xyz=%d\n",x*y*z);
            }
        }
    }
    return  0;
}

昔のC89仕様のC言語では
変数の宣言は関数の先頭でしか
できませんでした。

なので昔の教科書では
変数の宣言は一律関数の先頭に記述されています。


参考:

DCL19-C. 変数と関数の有効範囲を最小限にする

■whileで記述すると4行も必要

void W(void){
    int i;//(1)変数宣言

//この間が実務では結構離れていたりする
   
    i = 0 ;//(2)初期化式
    while(i < 10){//(3)ループ条件式
        printf("W:%d\n",i);
        i++;//(4)更新式
    }
}

while文は
(1)変数宣言、
(2)初期化式、
(3)ループ条件、
(4)更新式
4行も必要です。


■for文なら1行で書けるので楽

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

変数宣言、初期化式、ループ条件、更新式が
書けます。

C99仕様ではループカウンタ変数をfor文ブロック内で宣言する事で変数の可視範囲を局所化する事が出来ます(=要するに、見る範囲が限定されるので変数をあちこち見なくて済みます)


■for文の第1式と第3式に書く事が無い時

void F2(void){
    char line[1024];
    for(;fgets(line,1024,stdin)!= NULL;){
      printf("F:%s",line);
    }   
}

for文の第一式と第三式に書く事がなければwhileが自然です。


■while文が自然な例

void W2(void){
    char line[1024];
    while(fgets(line,1024,stdin)!= NULL){
      printf("W:%s",line);
    }   
}

「標準入力から読めるあいだ回れ」と自然に読めませんか?


■まとめ

whileにするかforにするかは好みの問題である」と
聖典プログラミング言語Cに書いています。
迷ったら、とにかくfor文で書いてみましょう。
for文第1式と第3式に書く事がなければ
while文が自然です。

アンケート

4
10回転する時の貴方の好きなスタイルは