3 論理演算子

教科書のp.107-112の内容である.

3.1 論理演算子が必要な理由

被演算子が3つ以上を組み合わせて,条件式を作る場合を説明する.例えば,次のような 場合である. これを表すために,条件式として
a < b < c
と書いたらどうなるであろうか?.一見,良さそうだがC言語では許されない.

なぜダメなのであろうか?.演算はひとつずつ実行される.まず,a<bの演算が行わ れ,その結果は0または1である.そして,cが前の演算結果である0 または1と比較される.これは,最初意図したことと異なる.c01と比較したいのではない.

これでは,困ってしまう.通常のプログラミング言語にはこれを解決する手段が用意され ている.そのためには,元の命題を

と書き換える.「かつ」とは,両方とも同時にという意味である.そうして, 「かつ」に相当する演算子を使う.C言語では,
a < b && b < c
と書く.これで,希望通りの条件式が出来る.

C言語では,このような条件式(論理式)のための演算子は,表 3に示すものが用意されている.この3つの演算子 (&&,||,!)を論理演算子と言う.ここでも,論理演算子を使った演算結果は,0ま たは1の値となる.

表 3: 論理演算子
演算子 説明 演算機能
&& 論理積(かつ) 両方とも1(真)のときのみ1(真) 
|| 論理和(または) 少なくともどちらか一方が1(真)の時,1(真)
! 論理否定(反転) 1(真)のとき0(真),0(偽)のとき1(真)

3.2 論理演算子の動作

3.2.1 論理積

論理積演算子(&&)を挟んだ被演算子が両方とも1(真)の場合のみ,その結果は1(真) となる(表4).このことから,この演算子は,日本語で「かつ」,英語で は「AND」と呼ばれる.この演算子の演算規則を見ても明らかなように,0と1の積の演算 と同じである.このことから論理積と呼ばれるのである.

使い方は,先に示したように,

a < b && b < c
のように,演算子の左右に式を書く.もちろん式でなくて,値を書いても良い.

0と1以外の値を書いた場合どうなるか?.C言語の規則では,0以外の場合は, 全て真として取り扱われる.即ち

a = 1 && 5
b = -5 && 20.5
の場合,a=1, b=1となる.5や-5,20.5も真として取り扱われる.これは,以 降の論理和でも論理否定でも同じである.
表 4: 論理積
a b a && b
0 0 0
0 1 0
1 0 0
1 1 1

3.2.2 論理和

論理和演算子(||)を挟んだ被演算子の少なくとも一方が1 (真)の場合,演算の結果 は1(真)となる(表5).このことから,この演算子は,日本語で「または」,英 語では「OR」と呼ばれる.これは,に示す,この演算子の演算規則を見ても明らかなよう に,0と1の和の演算と同じである2.このことから 論理和と言われる.

使い方は,論理積と同様に,

a < b || b < c
と,演算子の左右に式を書く.もちろん式でなくて,値を書いても良い.

これも,0と1以外の値を書くことができる.論理積同様,0以外の場合は, 全て真として取り扱われる.

表 5: 論理和
a b a || b
0 0 0
0 1 1
1 0 1
1 1 1

3.2.3 論理否定

論理否定の演算は,演算子(!)の後ろに書く被演算子の値が0(偽)の場 合,1(真)となる.一方,被演算子の値が1(真)の場合,0(偽)となる(表6).

使い方は,

!(a < b)
のように,演算子の後に被演算子を書く.

これも,0と1以外の値を書くことができる.論理積同様,0以外の場合は, 全て真として取り扱われる.

表 6: 論理否定
a !a
0 1
1 0

3.3 演算子の優先順位

いろいろな演算子が出てきたので,その計算の優先順位が問題となる.数学で は,和や差よりも積や商が優先されるように,C言語でも優先順位がある.今 まで,出てきた演算子の優先順位を表7にまと めておく.常識通りの順序になっているので,あまり迷わないと思う.もし, 迷ったら,括弧()がもっとも優先順位が高いことを思い出し,それを使 えばよい.これは,数学と全く同じである.

また,優先順位が同じ場合,左側から評価するのも数学と同じである.

表 7: 演算子の優先順位(上のほうが優先順位が高い)
種類 演算子  
括弧 ()  
論理否定 !  
乗除 * /  
加減 + -  
比較 < <= > >=  
等価 == !=  
論理積 &&  
論理和 ||  


ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年7月12日


no counter