論理演算子

関係演算子を使用することで 2 つ値の大きさを比較することができますが、より複雑な条件式として 2 つの条件式が共に真の場合や、少なくともどちらか一つの条件式が真の場合といった条件式を定義する場合に使用するのが論理演算子です。ここでは C 言語で論理演算子を利用する方法について解説します。

(Last modified: )

論理演算子の種類

まずは論理演算子の種類を確認します。

演算子名前記述例意味
&&論理積 ANDa && baとbが共に真の場合に真
||論理和 ORa || baかbの少なくとも1つが真の場合に真
!否定 NOT!aaが真の時に偽、偽の時に真

上記において a や b の箇所にはそれぞれ関係演算子を使った条件式が入ります。記述方法としては次のようになります。

条件式 論理演算子 条件式

それでは 1 つずつ確認していきます。

論理積 AND

論理積( AND )は演算子の右辺及び左辺の条件式が共に真の場合のみ全体の評価が真となります。

左辺右辺全体

例えば次のように記述します

int x = 10;

if (x > 3 && x < 20){
  printf("x は3より大きく20より小さい\n");
}

左辺の条件式である変数 x に格納されている値が 3 より大きいかどうかを評価し、右辺の条件式である変数 x に格納されている値が 20 より小さいかどうかを評価します。そして左辺の条件式と右辺の条件式の結果が共に真の場合のみ全体の条件式が真となります。

論理和 OR

論理和( OR )は演算子の右辺か左辺の少なくともどちらか1つの条件式が真の場合に全体の評価が真となります。

左辺右辺全体

例えば次のように記述します

int x = 20;
int y = 30;

if (x > 10 || y < 20){
  printf("x が10より大いか、y が30よりも小さい\n");
}

左辺の条件式である変数 x に格納されている値が 20 より大きいかどうかを判別し、右辺の条件式である変数 y に格納されている値が 30 より小さいかどうかを判別します。そして左辺の条件式か右辺の条件式のどちらかの評価が真の場合に全体の条件式が真となります。

否定 NOT

否定( NOT )は演算子の右辺の条件式が真の場合に全体の評価が真となり、右辺の条件式が偽の場合に全体の評価が偽となります。

右辺全体

例えば次のように記述します

int x = 20;

if (!(x == 10)){
  /* ... */
}

右辺の条件式である変数 x に格納されている値が 10 と等しいかどうかを判別します。そして右辺の条件式か真の場合に全体の条件式が偽となります。

演算子の優先順位

論理演算子を使用する場合には優先順位に注意が必要です。論理積( && )や論理和( || )は関係演算子である == 演算子や > 演算子よりも優先順位が低いので次のように記述しても問題はありません。

if (x > 3 && x < 20){
  /* .... */
}

この場合 && 演算子が評価されるよりも前に > 演算子や < 演算子が評価されるからです。

それに対して論理否定( ! )は関係演算子である == 演算子や > 演算子よりも優先順位が高いので次のように記述することは問題があります。

if (!x == 10){
  /* .... */
}

この場合は先に ! 演算子が評価され、その後で == 演算子が評価されてしまいます。その為、論理否定を使う場合は次のように括弧 () を使って優先順位を変更する必要があります。

if (!(x == 10)){
  /* .... */
}

もちろん論理積や論理和の場合でも優先順位を明確にするために括弧 () を使っても構いません。

if ((x > 3) && (x < 20)){
  /* .... */
}
サンプルコード

では簡単なサンプルプログラムを作成して試してみます。

#include <stdio.h>

int main(void){
  int num;

  num = 10;
  printf("num = %d\n",num);

  if (num > 3 && num < 20){
    printf("num は3より大きく20より小さい\n");
  }

  if (!(num == 5)){
    printf("numは5とは等しくない\n");
  }

  return 0;
}

上記を「test3-1.c」の名前で保存します。まずコンパイルを行います。

論理演算子

コンパイルが終わりましたら「test3-1」と入力して実行します。

論理演算子

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。