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

5.1 算術演算子(p.107)

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

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

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

5.2.1 関係演算子(p.108)

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

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

[練習1]
次の d の値をC言語のプログラムで計算せよ。なぜ d の値がそのようになるのか考えよ。ヒント、教科書 p.34表3-1を見よ。

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

5.2.2 等価演算子(p.108)

関係演算子が大小の比較を表すのに対して、等価演算子は等しいか否かを表す。
[練習1]
教科書の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言語風で格好良いのである。 \begin{lstlisting}[caption=インクリメントとデクリメントの例,label=prog:inc_dec]
...
...;
j=10;i++;
j-;printf(''i=%d j=%d\n'',i,j);return 0;
}
\end{lstlisting}

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

    5.4 代入演算子(p.118)

    単純代入演算子(=)は説明しなくても分かっていると思うだろうが、これがどうして なかなかちゃんと理解されていないのである。単純代入演算子(=)は数学のイコール ($ =$)と異なり、これは演算子である。演算子と言うことであるから、これを挟んだ変数 に対して操作をする4。 その操作 は、左辺の式の値を右辺の変数に代入する。必ず、右辺は式5で、右辺は変数でなくてはならない。もし、左辺と右辺が 等しいか否かの比較は等価演算子(==)を使う。C言語では、代入演算子(=)と等 価演算子(==)はしっかり区別を付けなくてはならない。

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

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

    ホームページ: Yamamoto's laboratory
    著者: 山本昌志
    yamamoto masashi
    平成17年5月14日


    no counter