演算子と演算結果の応用



すべての演算子は,演算結果を返す 

これまで,演算子と名の付く記号がいっぱい出てきました.それらのいくつかを,以下に列挙してみましょう.

算術演算
  +
  −
  *
  /
  %
代入演算子
  =
比較演算子
  >
  <
  ==
  >=
  <=
論理演算子
  &&
  ||
  !
その他
  ....

この節のタイトルは「すべての演算子は結果を返す」になっています.まあ,算術演算子が結果を返すというのは,当たり前ですよね.では,「その他の演算子の結果とは???」ということになると思います.



代入演算子の演算結果とは?

 まず,代入演算子から説明しましょう.その前に,次のプログラムを実行すると,3行のprintf()文は,何を表示するか予想してみて下さい.1つ目のprintf()の結果は,すぐわかりますけど,2つめ以降は,変ですね.書き間違いでは,と思いますよね.
 
 #include<stdio.h>
 void main(void){
   int a,b,c;
   a=6;
   printf("%d\n",a);         
   printf("%d\n",b=a);
   printf("%d\n",c=b=a);
 }

結果は,いずれのprintf()文も,6を表示します.
まず,a=6で,変数aには,6が代入(記憶)されます.1つ目のprintf()は説明の必要はありませんね.そうです変数aの内容を表示させるためのものです.

 しかし,次の2つの文は,変数bの内容や変数cの内容を表示させているのではありません.
   printf("%d\n",b=a);
   printf("%d\n",c=b=a);
 これらは,b=aの結果やc=b=aの結果(すなわち,代入演算の結果)を表示させているのです.
これは,2数の和を表示するとき,
   printf("%d",x+y)
と書くのと同じことです.(これもxやyの値を表示させているのではなく,x+yという演算の結果を表示させています)

 b=aと書くと,aの内容がbに代入されます.この時,(=)演算子は,結果として,bに代入された値を返すように作られているのです.したがって,2つめのprintf()は,b=aの演算結果6を表示します.言い換えれば,「b=aの演算を実行すると,結果としてbに代入された値を返す」ということになります.

 したがって,次の文の c=b=a の表現は,cでb=aの演算結果を受け取っていることになります.(この場合のcは,z=x+yのzのような役割をします)b=aの演算結果は,6ですからcには6が入ります.また,3つめのprintf()は,c=bの演算結果を表示しますから6を表示します.

 このことを応用すれば,1つの文で,複数の変数に同じ値を代入することができるということになります.すでに,どこかで見たことがあるかもしれませんが,
 例えば z=y=x=...=b=a=3; のように書けば,=で結ばれたすべての変数に3が代入されます.



比較演算子の演算結果とは?

 次に,比較演算子の演算結果について,説明しましょう「代入演算子」について理解できたのなら,簡単な説明で理解できると思います.まず,次のプログラムを,実際に作成して実行してみて下さい.
 
 #include<stdio.h>
 void main(void){
   int a,b;
   a=6;
   b=3;

   printf("a=%d,b=%dのとき\n",a,b);  

   printf("a==bの結果は%d\n",a==b); 
   printf("a>bの結果は%d\n",a>b);          
   printf("a<bの結果は%d\n",a<b);   
   printf("a>=bの結果は%d\n",a>=b); 
   printf("a<=bの結果は%d\n",a<=b); 
 }

実行して,わかったとおもいますが,比較演算子は,関係が
   成立しなければ,0
   成立すれば,  0以外の値
を返すように作られています.
 プログラム例の場合,aには6,bには3が代入されていますから,
   成立するのは, a>b, a>=bの2つだけで,これらの場合,0以外の値を返します.
   成立しないのが a==b, a<b, a<=bの3つで,これらの場合,0を返します.

ついでに,a=3,b=6とのときは,どうなるか確かめて下さい.
また,a=3,b=3とのときは,どうなるか確かめて下さい.
 



論理演算子の演算結果とは?

 次に,論理演算子の演算結果について,説明しましょう。
まず,次のプログラムを,実際に作成して実行してみて下さい.論理演算の結果を表示するプログラムです。1または0が表示されます。どのようなとき1が、どのようなとき0が表示されるか注意して見て下さい。
 
 #include <stdio.h>
 void main(void){
   int a,b,c,d;

   a=3; b=4; c=10; d=20; 
   printf("a=%d, b=%d, c=%d, d=%dの時\n",a<b && c<d );     
   printf(" a<b かつ c<d   = %d\n", a<b && c<d ); 
   printf(" a>b かつ c<d   = %d\n", a>b && c<d );
   printf(" a<b または c>d = %d\n", a<b || c>d );
   printf(" a>b または c>d = %d\n", a>b || c>d );
 }

実行して,わかったとおもいますが,論理演算子は、論理演算の結果を1または0で返します。
   成立すれば,  1  (条件が成立することを「真」あるいは TRUE と表現します)
   成立しなければ,0  (条件が成立しないことを「偽」あるいは FALSE と表現します)
を返すように作られています.
 また、論理演算子!(否定)は、
   !a
   !(a>0)
   !(a>b && a>c)
のように、変数や式の値が0以外のとき(真のとき)値を0(偽)に変換し、逆の場合、すなわち、変数や式の値が0(偽)のとき、1(真)に変換します。すなわち、否定します。

TRUEやFALSEはコンパイラーで記号定数として定義さています。



流れ制御文の条件表現について

 流れ制御文のif()文やwhile()文の()中には、比較演算子や論理演算子を用いた式を書き込みますが、これまでの説明を理解することが出来たら、結局は、それらの演算結果の数値で、条件の成立・不成立を判断していることがわかったと思います。
 したがって、if()文やwhile()文の条件式には、定数を書き込むこともできるという事になります。
いずれの制御文でも、()中に0を書けば条件不成立、0以外の数値を書けば、条件成立と見なされます。「プログラムの流れ制御」のところで紹介した無限ループは、その1例です。