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

5.1 算術演算子(p.107)

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

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

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

5.2.1 関係演算子(p.108)

算術演算子の + は2つのデータの加算を行い,その和を返す.5+813 になるようにである.関係演算子(p.108)も同じで,2つのデータの演算を行い値を返す. 関係演算子が返す値は,01 である.たとえば,10<20の演算結果は 110>200になる.もちろん,演算を行う2つの数値は,実数でも良 い.関係演算子は,大小の比較を行ってその判定をしていると考える.難しいことは, なにもない.
[練習5]
以下に示すそれぞれの 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))      

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

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

5.2.2 等価演算子(p.108)

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

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

5.2.3 論理演算子(p.109)

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

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

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

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

    として取り扱われると覚えておく.そうすると,論理演算は表46のようになる.
  • 4. C言語の否定演算
  • 5. C言語の論理積
  • 6. C言語の論理和
  • 表 4: C言語の否定演算
    a !a
    0 1
    0以外 0
    表 5: C言語の論理積
    a b a && b
    0 0 0
    0 0以外 0
    0以外 0 0
    0以外 0以外 1
    表 6: C言語の論理和
    a b a || b
    0 0 0
    0 0以外 1
    0以外 0 1
    0以外 0以外 1
       

    5.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 }
    


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

    5.4 代入演算子(p.118)

    5.4.0.1 単純代入演算子

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

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

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

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

    5.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 }
    


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

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


    no counter