2 式を計算するときのテクニック

2.1 括弧

C言語の演算の順序は数学と同じである.積(*)や商(/)は和(+)や差 (-)よりも優先度3が高く,先に計算する.まだ学習する必要はないが,C言語にはいろいろな演算 子がある.教科書 [1]の表3.16(p.94)に全ての演算子と その優先度が書かれている.優先度はしばらく学習すると理解できる.数学の優先度と同 じであり,また情報科学やコンピューター言語の常識の範囲である.

演算子の優先度を変えたければ,数学同様に括弧を用いることができる.通常,数学では 対応が一目で分かるようにするために,3つの括弧--大括弧$ [\ ]$中括弧$ \{\ \}$小括弧 $ (\ )$--を使うことができる.それに対して,C言語では1種類の括弧--小括弧 $ (\ )$--しか使えない.ひとつしかなくても,左右の括弧の対応を付けることが可能で ある.演算の順序を変えるために,大括弧$ [\ ]$中括弧$ \{\ \}$を使ってはならない.

言うまでもないと思うが,左右の括弧の数は等しくなくてはならない.演算子の順序の変 更以外にも括弧を使うが,必ず左右で一組である.コンパイラーは厳密に,左右の括弧の 対応をチェックする.もし,対応がおかしければコンパイルエラーのメッセージを出し, コンパイルを中止する.

2.1.1 代入演算子

ここは,教科書のp.87-88あたりに述べていることである.

2.1.1.1 単純代入演算子

いままで,C言語のイコール(=)--単純代入演算子--と数学のイコールとはまったく異なる働 きをするとしつこく述べてきた. C言語の単純代入演算子(=)の動作を図1に示す.
図 1: C言語のイコール--代入演算子--の動作
\includegraphics[keepaspectratio,scale=1.0]{figure/substitution_op.eps}

C言語の左辺の値を左辺値(lvalue),右辺の値を(rvalue)と言う.これは憶えておいた方 が良い.ときどきコンパイラーのエラーメッセージの中にこれらの単語が使われている.

2.1.1.2 複合代入演算子

代入演算子は,単純代入演算子と複合代入演算子がある.複合代入演算子とは,教科書の 表3.13の単純代入演算子(=)をのぞいた全てである.この中で,現在の諸君が憶えな くてはならないものを表1にしめす.

表 1: 憶えるべき複合代入演算子.表中のaの値は,演算の結果である.演算の 前のaの値は7,hogeは3とする.いずれも整数型の変数とする.
複合代入演算子 動作 単純代入演算子の記述 aの値
+= 加算して代入 a+=hoge a=a+hoge 10
-= 減算して代入 a-=hoge a=a-hoge 4
*= 積算して代入 a*=hoge a=a*hoge 21
/= 除算して代入 a/=hoge a=a/hoge 2
%= 剰余算して代入 a%=hoge a=a%hoge 1

2.2 暗黙の型変換

ここは,教科書のp.95-97に述べていることである.

2.2.0.1 混合演算

今までは,同じ型どうしの演算で,結果も同じ型に代入した.しかし,実際の計算では不 都合が生じることがある.例えば,整数型と倍精度実数型の加算が必要になることがある. このように,型が異なるものの演算を混合演算と言う.この場合,精度の高い方に型の変 換が行われる.整数型の値は倍精度実数型に自動的に変換されて,計算が行われる.常識 の範囲でちゃんと計算が行われるのである.

2.2.0.2 代入における型変換

代入演算において,右辺値と左辺値の型が異なる場合はどうなるか?.この場合は,右辺 値は左辺の変数の型に自動的に変換される.これも常識通りで,おかしな値にならないよ うになっている.

2.3 明示的型変換

ここは,教科書のp.98-99に述べていることである.

強制的にプログラマーがデータの型の変換を行わなくてはならないことがある.これが必 要なほとんどの場合は,整数どうしの除算である.例えば,クラスの英語の点数の合計を 格納している整数型の変数sumの値が3130とし,その人数は整数型の変数nに41 と格納されているとする.その平均を倍精度実数型の変数aveに格納したい.

次の例は,間違いである.

ave=sum/n;
このようにすると,aveの値は76.000000$ \cdots$となる.右辺は整数と整数の演算なので, 右辺値は整数の76になる.それを,倍精度実数型の変数aveに代入するので暗黙の型 変換により,76.000000$ \cdots$となるのである.

正しくは,つぎのようにする.

ave=(double)sum/n;
変数sumの前に(double)を付けることにより,強制的に倍精度実数型に変換し ている.中括弧と型名を書くと,その右の値の型を強制的に変えることができる.これを 明示的型変換4言う. この型変換により,sumの値は3130.000000$ \cdots$の倍精度実数になる.倍精度実 数と整数の複合演算なので,整数部分は倍精度実数に変換される.従って,右辺値は 76.341463$ \cdots$となる.これが左辺のaveに代入されるので,ちゃんと平均値が 計算できる.

もちろん,

ave=sum/(double)n;
としても良いし,
ave=(double)sum/(double)n;
でも問題ない.

しかし,

ave=(double)(sum/n);
はダメである.これは,括弧内のsum/nが整数どうしの演算なので,この括弧内の値 は76となる.それを倍精度実数型に変換しているので,右辺値は76.000000$ \cdots$とな る.
ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年7月5日


no counter