6 演算子(教科書の8章)

6.1 算術演算子(p.107)

算術演算子(教科書 p.107)については,今更説明するまでもないであろう.この中で,剰 余4(%)はかなり便利である.11%4 の演算結果は,3--11を4で割った値--である.この演算子は便利なので,覚えて おくと良い.

6.2 関係演算子,等価演算子,論理演算子(p.108〜)

これらの演算は,主に論理演算に使われる5.論理が正しい(真 True)か誤り(偽 False)と いう演算である.演算の結果は,真か偽のいずれかである.真の場合が 1 で,偽の場合 が 0 である.

6.2.1 関係演算子(p.108)

算術演算子の + は2つのデータの加算を行い,その和を返す.5+813 になるようにである.関係演算子(p.108)も同じで,2つのデータの演算を行い値を返す. 関係演算子が返す値は,01 である.たとえば,10<20の演算結果は 110>200になる.もちろん,演算を行う2つの数値は,実数でも良 い.関係演算子は,大小の比較を行ってその判定をしていると考える.難しいことは, なにもない.
[練習1]
以下に示すそれぞれの a の値を計算し,結果を表示す るプログラムを作成せよ.4番目の演算結果については,演算 子の優先順位(p.135表8-3)が問題となる.

  a=1+2   a=1<2   a=1>2    
  a=1+3>=2+2   a=5*((1<2)+(2<4))      

[練習1]
次の d の値をC言語のプログラムで計算せよ.なぜ d の値がそのようになるのか考えよ.ただし,全ての変 数はint型とする.ヒント,教科書 p.34表3-1を見よ.

  a=1122334455;    
  b=1122334455;    
  c=a+b;    
  d=1<c;    

6.2.2 等価演算子(p.108)

関係演算子が大小の比較を表すのに対して,等価演算子は等しいか否かを表す.
[練習1]
教科書のp.108の等価演算子の表を見ながら,以下の演算結果 の値を考えよ.もし分からない場合は,プログラムを作成し て,計算してみよ.

  100 == 100   3 == 5   3.0 == 3    
  6 != 5   5 != 5    

6.2.3 論理演算子(p.109)

論理演算子は2年生の時に学習したブール代数の演算子である.ブール演算では,否定は NOT で,論理積は AND で,論理和は OR で表す.しかし,p.109の表に示すような記号を 用いる.当然これも真理値表で書くことができて,表24のように表す.

演算の対象が 0 の場合は偽 (0) として扱われ,1 の場合は真 (1) となる.これは簡単 でブール代数の演算そのものである.表24のようになる.

表 2:否定の演算
a !a
0 1
1 0
表 3:論理積の演算
a b a && b
0 0 0
0 1 0
1 0 0
1 1 1
表 4:論理和の演算
a b a || b
0 0 0
0 1 1
1 0 1
1 1 1
   

問題は,演算の対象が 01 以外の場合である.プログラマーからすれば, コンパイラーがエラーを出すか,実行時にエラーを出して止まってくれれば良いのだが, 実際にはそうはならない.C言語の仕様では 01 以外の場合,それは真(1) として扱うと決まっている.C言語では,

として取り扱われると覚えておく.そうすると,論理演算は表57のようになる.

表 5: C言語の否定演算
a !a
0 1
0以外 0
表 6: C言語の論理積
a b a && b
0 0 0
0 0以外 0
0以外 0 0
0以外 0以外 1
表 7: C言語の論理和
a b a || b
0 0 0
0 0以外 1
0以外 0 1
0以外 0以外 1
   

6.3 インクリメント,デクリメント演算子(p.110)

インクリメント演算子(++)は 1 加算し,デクリメント演算子(-)は 1 減算す る演算子である.教科書に書いてあるように,a=a+1 あるいは a=a-1の代わり に使われる.カウンターとして使っている変数の値を変化させるときに,使われることが 多く,代入演算子(=)を使うよりも,インクリメントやデクリメント演算子を使う方 がC言語風で格好良いのである.
   1 #include <stdio.h>
   2 
   3 int main(void){
   4   int i,j;
   5 
   6   i=10;
   7   j=10;
   8 
   9   i++;
  10   j--;
  11 
  12   printf("i=%d  j=%d\n",i,j);
  13 
  14   return 0;
  15 }


[練習1]
リスト3の動作を確かめよ.

6.4 代入演算子(p.118)

6.4.0.1 単純代入演算子

単純代入演算子(=)は説明しなくても分かっていると言いたいが,これがどうして なかなかちゃんと理解されていないのである.単純代入演算子(=)は数学のイコール ($ =$)と異なり,これは演算子である.演算子と言うことであるから,これを挟んだ変数 に対して操作をする6. その操作 は,右辺の式の値を左辺の変数に代入する(図7).必ず,右辺は式7で,左辺は変数でなくてはならない.

左辺と右辺が等しいか否かの比較は等価演算子(==)を使う.C言語では,代入演算子 (=)と等価演算子(==)はしっかり区別を付けなくてはならない.

図 7: 代入演算子の動作.
\includegraphics[keepaspectratio,scale=1.0]{figure/substitution_op.eps}

そもそも,代入演算子に数学のイコールと同じ記号を使うから,間違う.a=b+cと書 かないでa+b->cとでも書けば,間違えることは無いし,意味も分かりやすい. 最初の高級言語で,代入演算子にイコールが使われたから,それ以降,使われているのだろ う.

6.4.0.2 複合代入演算子

複合代入演算子もよく使われる.特に += は使われることが多いので,よく覚えておか なくてはならない.a の変数の値に b を加算する場合,a=a+bとすれば よいが,C言語ではa+=bと書くのが普通である.前者でも問題なく実行できるが,後 者の方がC言語風で格好良いとされている.ほかの複合代入演算子も同じである.

代入演算子の使用例については,教科書 [1]のp.119の表8-2が詳しい.そ こを一度見よ.

   1 #include <stdio.h>
   2 
   3 int main(void){
   4   int i,j;
   5 
   6   i=3;
   7   j=6;
   8 
   9   i+=j;
  10 
  11   printf("i=%d  j=%d\n",i,j);
  12 
  13   return 0;
  14 }


[練習1]
リスト4の動作の結果を考えよ.

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


no counter