C   条件文

ホーム   C/C++チュートリアル


この章では、C の「条件分岐」と「繰り返し処理」を説明します。

if 文

if.c


#include <stdio.h>

int main()
{
    printf("10==10 is %d.\n", 10==10);
    printf("10==20 is %d.\n", 10==20);
    
    int num = -1;
    
    if (num)     // 0 以外の整数値はすべて true です
    {
        printf("%6d is true.\n", num);
    } else {
        printf("%6d is false.\n", num);
    }
    
    num = 0;
    
    if (num)
    {
        printf("%6d is true.\n", num);
    } else {
        printf("%6d is false.\n", num);
    }
    
    return 0;
}
    

実行結果


10==10 is 1.
10==20 is 0.
    -1 is true.
     0 is false.
    

コード説明

  1. if (num)
    if 文では、if に続く( と )の間に、1 か 0 かを返す式(条件判断文)書きます。
  2. ( と ) の間の式や数値が 1 と評価された場合は、続く { } の中の処理が実行されます。
  3. ( と ) の間の式や数値が 0 と評価された場合は、else に続く { } の中の処理が実行されます。
  4. また、 else 以降の処理は記述しなくても構いません。記述しなかった場合に ( と ) の間の数値や式が 0 と評価された場合は、何の処理も行われません。
  5. printf("%6d is false.\n", num);の %6d とは、 10進数を右詰め6桁で表示するという意味です。

なお、stdbool.h というヘッダーを読み込むと true false という表現が使えるようになります。

stdbool.c


#include 
#include 

int main()
{      
    if (true)
    {
        printf("True\n");
    } else {
        printf("False\n");
    }
    
    if (false)
    {
        printf("True\n");
    } else {
        printf("False\n");
    }
    
    printf("true  is %d.\n", true);
    printf("false is %d.\n", false);
    
    return 0;
}
    

実行結果


True
False
true  is 1.
false is 0.
    

しかし、これも次のように 1 と 0 を define で書き換えているだけみたいです。


#define false 0
#define true  1
    


if else

if  else 使うと、3つ以上の選択肢を設定することができます。

ifelse.c


#include <stdio.h>

void yourscore();

int main()
{
    yourscore(70);
    yourscore(90);
    yourscore(50);
    yourscore(30);
    
    return 0;
}

void yourscore(int score)
{
    if ( score >= 80 )
    {
        printf("成績はAです。\n");
    } else if ( score >= 60 ) {
        printf("成績はBです。\n");
    } else if ( score >= 40 ) {
        printf("成績はCです。\n");
    } else {
        printf("また頑張りましょう。\n");
    }
}
    

実行結果


成績はBです。
成績はAです。
成績はCです。
また頑張りましょう。
    

コード説明

  1. if (score >= 80) の >= という記号は比較演算子で、80 以上という意味になります。> が 80 より上と 80 を含まないのに比べ、 >= は 80 も含みます。
  2. else if (score >= 60) などすることで、複数の条件を設定することができます。 条件は上から判定されますので、最初に if (score >= 0) などとしてしまうと、 すべての score が含まれてしまい、そこで処理が止まります。
  3. 最後の } else { は省略できます。else を省略して、 どの条件にも当てはまらない場合は、何も処理されません。


switch 文

条件分岐の方向が多くある場合には、switch 文を使うのも便利です。

switch.c


#include <stdio.h>

void character(char code);

int main()
{
    character('C');
    character('A');
    character('B');
    character('D');
    character(65);
    
    return 0;
}

void character(char code)
{
    switch (code)
    {
    case 'A':
        printf("%c\n", code);
        break;
    case 'B':
        printf("%c\n", code);
        break;
    case 'C':
        printf("%c\n", code);
        break;
    default:
        printf("not matching.\n");
    }
}
    

実行結果


C
A
B
not matching.
A
    

コード説明

  1. C には、char というデータ型もあります。char は、 1バイト文字を1文字だけ格納できるデータ型です。 1つの文字は実際には文字コードという整数値になっています。int が、 -21億から+21億という大きな整数値を格納することができるのに対して、 char は -128 から +127 までの整数値しか格納することができません。 しかしその分、メモリの使用量も少なくなります。
  2. switch ( ) の ( ) の間には、整数値か整数値を格納した変数を指定します。 文字列型や条件文は指定できません。
  3. swith 文は ( ) の間で指定した値と同じ値を持つ case キーワードの位置ま飛びます。そして、そこに記述された処理をします。
  4. case キーワードの後に指定できる値は整数値だけです。値の後にはコロン : をつけます。
  5. case キーワードで始まった処理は break キーワードが現れるまで続きます。 もし break キーワードを記述しなければ、次の case キーワードの処理も実行されてしまいます。
  6. break キーワードには、セミコロン ; をつけます。
  7. どの case キーワードの値にも一致しなかった場合は、default キーワードの処理が実行されます。
  8. default キーワードには値は記述しませんが、コロン : はつけます
  9. default キーワードは省略できます。default キーワードを省略した場合に、どの case キーワードにも一致しなかった場合は、何の処理も行われません。
  10. 'A' の文字コードは 65 です。
  11. %c は整数値(文字コード)を文字に変換する変換指定子です。


while 文

while.c


#include <stdio.h>

int main()
{
    int num = 1;
    
    while (num < 11)
    {
        printf("%d回目\n", num);
        num++;
    }
    printf("End...\n");
    
    return 0;
}
    

実行結果


1回目
2回目
3回目
4回目
5回目
6回目
7回目
8回目
9回目
10回目
End...
    

コード説明

  1. while 文は、while キーワードの次に( と ) で囲んで真偽値の得られる「条件(Condition)」というものを書きます。
  2. 「(num < 11)」の < という記号は、比較演算子と呼ばれるものです。num が 11 より小さい場合は真になり、11以上の場合は偽になります。
  3. 「num++;」の ++ という記号はインクリメント(Increment、増加)という演算子です。 numの値を1つだけ増やします。
  4. num が 11になり (num < 11) が偽になった場合は、while文は終了します。


while 文は break キーワードで終了させることもできます。

break.c


#include <stdio.h>

int main()
{
    int num = 1;
    
    while (num)
    {
        printf("%d回目\n", num);
        num++;
        if (num > 10) { break; }
    }
    printf("End...\n");
    return 0;
}
    

実行結果は先ほどと同じです。

コード説明

  1. while (num) の場合、num の値が 0 以外の場合は、真になります。
  2. このサンプルにように、最初のnumが1以上の場合は このままでは無限ループになります。
  3. 「if (num > 10)」の > も比較演算子です。num の値が10より上であれば真になります。
  4. { break; } というふうに、break; と記述すると、 その段階で繰り返し処理が終了します。


continue というキーワードを使うと、繰り返し処理を その回の処理だけスキップできます。

continue.c


#include <stdio.h>

int main()
{
    int num = 0;
    
    while (num < 11)
    {
        num++;
        if (num % 2 != 0 ) { continue; }
        printf("%d回目\n", num);
    }
    printf("End...\n");
    return 0;
}
    

実行結果


2回目
4回目
6回目
8回目
10回目
End...
    

コード説明

  1. 「if (num % 2 != 0 ) の % という記号は整数の割り算の余りを求める 算術演算子です。
  2. 整数を2で割ると、奇数の場合は余りが1になり、偶数の場合は余りが0になります。
  3. != という記号は比較演算子です。左辺の値と右辺の値が違う場合に真になります。
  4. 結果、num が奇数の場合には、continue キーワードが実行されて その回の処理はスキップされます。

  5. do-while 文を使うと、条件に合致するかどうかに関わらず 最低一回は処理が実行される繰り返し文が書けます。

    dowhile.c

    
    #include <stdio.h>
    
    int main()
    {
        int num = 0;
        
        do {
            printf("%d回目\n", num);
            num++;
            if (num > 10) { break; }
        } while (num);
        printf("End..\n");
        
        return 0;
    }
        

    実行結果

    
    0回目
    1回目
    2回目
    3回目
    4回目
    5回目
    6回目
    7回目
    8回目
    9回目
    10回目
    End..
        

    コード説明

    1. do {
      通常、数値の 0 は偽と判定され、その先に進めませんが、do キーワード で始めることによって、判定されることを避けて処理を進めることができます。
    2. while (num);
      最後に、条件を判定することにより最低1回は実行されることになります。 条件式の後にセミコロン ; が必要なことに気をつけてください。


    for 文

    繰り返す回数があらかじめ決まっている場合などは、while 文よりも、for 文の方がよく使われます。

    for.c

    
    #include <stdio.h>
    
    int main()
    {
        for (int i=1; i <= 10; i++)
        {
            printf("%d回目\n", i);
        }
        printf("End..\n");
        
        return 0;
    }
        

    実行結果

    
    1回目
    2回目
    3回目
    4回目
    5回目
    6回目
    7回目
    8回目
    9回目
    10回目
    End..
        

    コード説明

    1. for 文は ( と ) の間に、初期値、条件式、更新式(インクリメントなど)を セミコロン ; で区切って記述します。3つの項目が並んでいるので分かりやすいです。
    2. int i=1;
      初期値に使われる変数名は、イテレーター(Iterator、反復子)の頭文字をとって、i が慣習的に使われます。さらに変数が必要な場合は、i からアルファベットを辿って j、k、l などと命名されます。
    3. i <= 10;
      <= という記号は比較演算子です。i の値が 10 以下、つまり 10 が含まれています。一方、i < 10 とすると、10 未満、つまり 10 は含まれません。ここでは、i < 11; とするよりも i <= 10 とする方が感覚的に意味が分かりやすくなると思います。
    4. i++;
      最後に i の値をインクリメントします。このインクリメントは、for 文が一回繰り返される最後に処理されます。


27623 visits
Posted: Dec. 23, 2019
Update: Dec. 23, 2019

ホーム   C/C++チュートリアル   目次