C言語 制御文-条件文-

C言語

条件文

ここでは、制御文の中の条件文についてみていきます。

C言語の条件文は、if-else if-else構造のif文、switch-case文があります。

これら条件文の書き方と例をまとめています。

最後にあまり使わない方が良いですが、強制分岐のgoto文を記述しています。

制御文の中の繰り返し文については、こちら別ページにまとめています。

C言語 制御文-繰り返し文-
C言語の繰り返し文(while,do while,for)の構造と使い方について記載します。

if 文

if文による条件分岐処理は、設定する条件に対して処理をするかしないかという場合に使います。

条件に書かれた式が真(1)の場合、ブロック内の処理が実行されます。

条件式が偽(0)の場合は、ブロック外の処理に進みます。

if – else 文

if文は、条件に対して処理をするかしないかというものでしたが、処理をしない場合に別の処理を実行したいというときがあるかと思います。そのような場合には、else節を記述します。

条件に記述した式が真の場合、if節のブロックにある処理1が実行されます。この場合、処理1を実行後、else節のブロックにある処理2を飛ばして、ブロック外のプログラムに処理を進めます。

条件式が偽の場合、else節のブロックにある処理2を実行します。この場合は、処理1は実行されません。処理2実行後、ブロック外のプログラムに処理を進めます。

if – else if 文

if文の条件判断は、複数連ねることができます。その時に使うのがelse if節になります。

条件1式の評価が真の場合、if節のブロック内の処理1が実行され、その後、if-else if文の外にプログラムが進みます。

条件1式の評価が偽の場合、else if節の条件2式の評価が実行されます。

条件2式の評価が真の場合、else if節のブロック内の処理2が実行され、その後、if-else if文の外にプログラムが進みます。

条件2式の評価が偽の場合、if-else if文のブロック外にプログラムが進みます。

この例では、else if節が1つですが、さらにelse if節を追加して、条件判断を連ねることができます。

また、すべての条件が偽の場合に何かしらの処理を実行させたい場合は、else節を追加してelse節のブロック内にその処理を記述します。

if-else if-else文の例

else if節、else節をもつif文の例を記載ます。

この例では、自動変数 i が0なので、if節が実行されます。

i の値を変えることで実行される節が変わるので、確認してみてください。

#include <stdio.h>

main()
{
    int i = 0;

    if(i == 0){
        printf("i=%d if program\n",i);
    }else if(i == 1){
        printf("i=%d else if program\n",i);
    }else if(i == 2){
        printf("i=%d else if program\n",i);
    }else{
        printf("i=%d else program\n",i);
    }
    printf("end\n");
}
C:\prog>test
i=0 if program
end

switch case文

条件分岐の制御文としてswitch case文があります。

if – else if – else文を使っても実装できるのですが、else if節が多くなる場合は、switch case文を使った方が見やすく、実行速度が速いので利点が多いかと思います。

switch case文は、switchで指定する変数の値を各caseの値と比較して、一致したところの処理を実行します。上図では、変数の値とcaseの値1を比較します。ここで値が互いに等しいとなった場合、処理1が実行されます。処理1実行後、breakによりswitchのブロック処理を抜け出し、ブロック外のプログラムに処理を進めます。

変数値とcaseの値1が不一致の場合、次のcase文の値2と変数値を比較します。

一致の場合は、処理2を実行し、処理2実行後、breakによりブロックを抜け出します。不一致の場合、default節の処理defを実行し、switchのブロック処理を抜けます。

もし、case内のbreakがないとすると、処理は、次に記述した処理を実行してしまいます。上の例でいうと、処理1の後のbreakがない場合、変数値とcaseの値1が一致したとき、処理1を実行し、その後、続けて処理2が実行されるとなります。あえてこのようにbreakを書かないとすることも設計上ありうるのですが、誤りを誘発する可能性があるので、お勧めできません。基本的にbreakは記述する設計を心掛けたほうが良いと思います。

caseの値1と値2で同じ処理をさせたい場合があると思います。その場合は、case 値1とcase 値2を続けて書くことで実装できます。

#include <stdio.h>

main()
{
    int i = 0;

    switch(i){
        case 0:
            printf("i = %d case 0\n",i);
            break;
        case 1:
            printf("i = %d case 1\n",i);
            break;
        default:
            printf("i = %d default\n",i);
            break;
    }
    printf("end\n");
}
C:\prog>test
i = 0 case 0
end

goto文

goto文は、処理を強制的に分岐させるときに使用しますが、多用すると分岐が複雑になり、プログラムの流れが追いにくくなるという理由で、あまり推奨されません。

goto文により、ラベル位置以降の処理を実行します。

上図では、goto文により処理1は実行されず、処理2が実行されます。

#include <stdio.h>

main()
{

goto LABEL;
    printf("ignore program\n");

LABEL:
    printf("goto program\n");

    printf("end\n");
}
C:\prog>test
goto program
end

コメント

タイトルとURLをコピーしました