C言語の基本制御構造については、次回の講義で述べるが、その前に制御式につ
いて説明しておく。基本構造のうち、選択と繰り返しの場合、記述内容の真偽
でプログラムの制御が変わる。その記述内容を表すのが制御式である。これは
式なので、それを表す演算子(operator)が必要である。一般的には、次の演算
子が使われる。
- 関係演算子
- 大小関係を表す(<, <=, >=, >)
- 等価演算子
- 等価関係を表す(==, !=)
これらは演算子で、被演算子(operand)
2と組み合わせて式を作る
ことができる。式なので、その演算の結果の値があり、それは「真」(true:真
実の)または「偽」(false:誤った)となる。もう少し詳しく書くとその演算の
結果は、
式の内容が正しい場合 |
 |
計算結果は1(真)となる。 |
式の内容が誤りの場合 |
 |
計算結果は0(偽)となる。 |
である。これは2年生で学習するブール代数の規則と同じである。
実際のプログラム例を見たほうが分かりやすいであろう。C言語で次のように
書いたとする。
a = 4 > 8;
b = 4 < 8;
このプログラムの場合、数値の4や8が被演算子で、大小関係を表す
>や
< が演算子である。プログラムの動作は次のようになる。
- 最初の行は、式(4 > 8)の大小関係が誤りなので、この計算結果
は0となる。右辺の計算結果の0が左辺の変数aに代入され
る。したがって、aの値は0となる。
- 次の行は、式(4 < 8)の大小関係が正しいので、この計算結果は
1となる。右辺の計算結果の1が左辺の変数bに代入される。
したがって、bの値は1となる。
ポイント |
---|
制御式に使われる関係演算子や等価演算子を用いた式の計算結果は、正しい
場合1で、誤りの場合0となる。
|
制御式に使われる演算子は、関係演算子と等価演算子である。これらは、全て
2項演算子で、演算子の両側にオペランド(被演算子)を書く。記号の意味も数
学とほとんど同じなので理解しやすい。制御式に使われる演算子を表
1にまとめておく。使い方は、次節を見れば分かるであろ
う。
表 1:
制御式に使われる演算子
演算子種類 |
C言語 |
数学 |
関係演算子(大小判定) |
< |
 |
|
<= |
 |
|
> |
 |
|
>= |
 |
等価演算子 |
== |
 |
|
!= |
 |
被演算子(オペランド)が2つしか無い場合は、単純である。表
2のように書く。
表 2:
演算子の使い方
C言語 |
演算結果が1 |
演算結果が0 |
a < b |
 |
 |
a <= b |
 |
 |
a > b |
 |
 |
a >= b |
 |
 |
a == b |
 |
 |
a != b |
 |
 |
被演算子が3つ以上を組み合わせて、制御式を作る場合を説明する。例えば、
の場合、演算結果が1(真)となる制御式を作りたい。
のような場合である。制御式として
a < b < c
と書いたらどうなるであろうか?。変数の値が、

の条件を満たしていて
も、演算結果が1(真)とならない場合がある。正しい場合と誤りの場合を表
3に示す。
なぜこのような結果になるのであろうか?。この場合演算は、左から順に1つづ
つ実行されるからである。まず、a<bの演算が行われ、表のいずれの場合
でも、結果は1となる。そうすると次に、1<cの演算が行われる。これは、
cの値によって、0または1となるわけである。
表 3:
a < b < cの演算の結果
aの値 |
bの値 |
cの値 |
a < b < cの結果 |
1 |
2 |
3 |
1(真) |
-3 |
-2 |
-1 |
0(偽) |
これでは、困ってしまう。通常のプログラミング言語にはこれを解決する手段
が用意されている。そのためには、元の命題を
かつ
の場合、演算結果が1(真)となる制御式を作りたい。
と書き換える。「かつ」とは、両方とも同時にという意味である。そうして、
「かつ」に相当する演算子を使う。C言語では、
a < b && b < c
と書く。これで、希望通りの制御式が出来る。
C言語では、このような制御式(論理式)のための演算子は、表
4に示すものが用意されている。
表 4:
論理演算子
演算子 |
説明 |
演算機能 |
&& |
論理積(かつ) |
両方とも1(真)のときのみ1(真) |
|| |
論理和(または) |
少なくともどちらか一方が1(真)の時、1(真) |
! |
論理否定(反転) |
1(真)のとき0(真)、0(偽)のとき1(真) |
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成16年9月7日