ユーニックス総合研究所

  • home
  • archives
  • c-if-hukusujouken

C言語のif文で複数条件を指定する

  • 作成日: 2022-08-02
  • 更新日: 2023-12-25
  • カテゴリ: C言語

C言語のif文で複数条件を指定する

C言語のif文で複数条件を指定したい時があります。
複雑なプログラムになるとそういった条件指定が必要です。

こういう時はAND(&&)やOR(||)で条件式を連結して複数条件式にします。
この記事ではC言語のif文で複数条件を指定する方法を解説します。

関連記事

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方

単一の条件式

まず単一の条件式をおさらいしておきましょう。
単一の条件式は↓のように書くことができます。

int a = 1;  

if (a == 1) {  
    puts("等しい");  
}  

↑のa == 1という条件式は変数a1と等しいかチェックする条件式です。
こういった単一の条件式(a == 1など)は見た目も単純で書くのも楽です。
しかしその分複雑な条件を表現しようとすると物足りなくなってしまいます。

関連記事
C言語のif文の書き方【if, else if, else】

ANDで条件式を連結する

条件式を繋げて複数の条件式にしたい場合、1つはAND(&&)が使えます。
ANDは↓のように使います。

条件式1 && 条件式2  

ANDは両方の条件式が真の時に真になります。
どちらかの条件式が偽であれば偽になります。

たとえば↓のように書きます。

if (1 == 1 && 2 == 2) {  
    puts("真");  
}  

↑のコードを実行すると「真」と表示されます。
1 == 1は真でかつ2 == 2も真です。
よって1 == 1 && 2 == 2という複数条件式の結果は真になります。

では↓はどうでしょうか。

    if (1 == 1 && 2 == 3) {  
        puts("真");  
    } else {  
        puts("偽");  
    }  

↑の条件式1 == 1は真です。
しかし2 == 3は偽になります。
そのため1 == 1 && 2 == 3という複数条件式の結果は偽になります。
ANDは両方の条件式が真でないと真になりません。

↑のコードを実行すると「偽」と出力されます。

ORで条件式を連結する

条件式を繋げて複数の条件式にしたい場合OR(||)も使うことができます。
ORは↓のように使います。

条件式1 || 条件式2  

ORはどちらかの条件式が真であれば真にあります。
両方の条件式が偽だった場合は偽になります。

↓のように書きます。

if (1 == 1 || 2 == 3) {  
    puts("真");  
}  

↑の条件式1 == 1は真です。
そして2 == 3は偽になります。
ORは左右どちらかの条件式が真であれば真になります。
ですのでこの1 == 1 || 2 == 3という複数条件式は真になります。

偽になる場合も見てみます。

    if (1 == 2 || 3 == 4) {  
        puts("真");  
    } else {  
        puts("偽");  
    }  

↑の条件式1 == 2は偽です。
3 == 4も偽です。
つまりORで繋げた両方の条件式が偽になります。
この場合1 == 2 || 3 == 4という複数条件式は偽になります。

ANDとORを組み合わせて使う

ANDとORは組み合わせて使うことができます。
組み合わせ方はいろいろありますがたとえば↓のように組み合わせます。

条件式1 && 条件式2 || 条件式3  

↑のような複数条件式の場合、どういった処理になるのでしょうか?
演算子には優先順位が決まっています。
&&||は演算子です。

優先順位はOR(||)よりもAND(&&)のほうが高いです。
つまり↑のような複数条件式の場合、先にANDが処理されます。

最初に条件式1が実行され次に条件式2が実行されます。
そしてANDが評価されて真か偽を生成します。
そして条件式3が実行されてその結果とORで比較されます。

この処理の流れをプログラム的に確認したい場合は関数を使うとわかりやすいです。
たとえば↓のような関数を書きます。

#include <stdio.h>  

int expr1(void) {  
    puts("expr1");  
    return 1;  
}  

int expr2(void) {  
    puts("expr2");  
    return 0;  
}  

int expr3(void) {  
    puts("expr3");  
    return 1;  
}  

int main(void) {  
    if (expr1() && expr2() || expr3()) {  
        puts("真");  
    }  

    return 0;  
}  

↑のコードを実行すると↓の結果になります。

expr1  
expr2  
expr3  
真  

最初にexpr1()が実行され次にexpr2()が実行されます。
そして最後にexpr3()が実行されています。
ANDとORは先にANDが評価されて次にORが評価されます。

expr1() && expr2()の結果は偽になります。この結果をresult1とします。
result1 || expr3()の結果は偽 || 真になるので真になります。

expr1() && expr2()の結果が真だった場合はexpr3()は実行されません。
これはANDの結果が真になるからです。
ORはどちらかが真であれば真になるので不必要な条件式(expr3())は実行されません。

ANDとORの評価についてもっと詳しく見てみる

ANDとORの評価方法は若干異なっています。
これを実験するには↓のようなコードを書きます。

#include <stdio.h>  

int ok(void) {  
    puts("ok");  
    return 1;  
}  

int fail(void) {  
    puts("fail");  
    return 0;  
}  

int main(void) {  
    puts("ANDの実験1");  
    ok() && fail();  
    // ok  
    // fail  

    puts("ANDの実験2");  
    fail() && ok();  
    // fail  

    puts("ANDの実験3");  
    ok() && ok();  
    // ok  
    // ok  

    puts("ANDの実験4");  
    fail() && fail();  
    // fail  

    puts("---------");  

    puts("ORの実験1");  
    ok() || fail();  
    // ok  

    puts("ORの実験2");  
    fail() || ok();  
    // fail  
    // ok  

    puts("ORの実験3");  
    ok() || ok();  
    // ok  

    puts("ORの実験4");  
    fail() || fail();  
    // fail  
    // fail  

    return 0;  
}  

↑のコードを実行すると↓の結果になります。

ANDの実験1  
ok  
fail  
ANDの実験2  
fail  
ANDの実験3  
ok  
ok  
ANDの実験4  
fail  
---------  
ORの実験1  
ok  
ORの実験2  
fail  
ok  
ORの実験3  
ok  
ORの実験4  
fail  
fail  

実験結果を見るとANDはどちらかの条件式が偽であればその時点で評価が終了し残りの条件式は評価されません。
左の条件式が真であれば残りの条件式が評価されます。

ORはどちらかの条件式が真であればその時点で評価が終了し残りの条件式は評価されません。
最初の条件式が偽であれば残りの条件式は評価されます。

このようにANDとORの評価方法は若干異なっています。
関数を呼び出しながら条件式を評価したい場合は注意してください。