C言語の演算の順序は数学と同じである.積(
*)や商(
/)は和(
+)や差
(
-)よりも優先度
3が高く,先に計算する.まだ学習する必要はないが,C言語にはいろいろな演算
子がある.教科書 [
1]の表3.16(p.94)に全ての演算子と
その優先度が書かれている.優先度はしばらく学習すると理解できる.数学の優先度と同
じであり,また情報科学やコンピューター言語の常識の範囲である.
演算子の優先度を変えたければ,数学同様に括弧を用いることができる.通常,数学では
対応が一目で分かるようにするために,3つの括弧--大括弧中括弧小括弧
--を使うことができる.それに対して,C言語では1種類の括弧--小括弧
--しか使えない.ひとつしかなくても,左右の括弧の対応を付けることが可能で
ある.演算の順序を変えるために,大括弧中括弧を使ってはならない.
言うまでもないと思うが,左右の括弧の数は等しくなくてはならない.演算子の順序の変
更以外にも括弧を使うが,必ず左右で一組である.コンパイラーは厳密に,左右の括弧の
対応をチェックする.もし,対応がおかしければコンパイルエラーのメッセージを出し,
コンパイルを中止する.
ここは,教科書のp.87-88あたりに述べていることである.
いままで,C言語のイコール(
=)--単純代入演算子--と数学のイコールとはまったく異なる働
きをするとしつこく述べてきた.
- C言語のイコールは,右辺の式を計算して,左辺の変数に代入する--という操作の
命令を表している.したがって,左辺は,必ず変数となる.
- 数学のイコールは,左辺と右辺が等しい--ということを表している.
C言語の単純代入演算子(
=)の動作を図
1に示す.
図 1:
C言語のイコール--代入演算子--の動作
|
C言語の左辺の値を左辺値(lvalue),右辺の値を(rvalue)と言う.これは憶えておいた方
が良い.ときどきコンパイラーのエラーメッセージの中にこれらの単語が使われている.
代入演算子は,単純代入演算子と複合代入演算子がある.複合代入演算子とは,教科書の
表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 |
ここは,教科書のp.95-97に述べていることである.
今までは,同じ型どうしの演算で,結果も同じ型に代入した.しかし,実際の計算では不
都合が生じることがある.例えば,整数型と倍精度実数型の加算が必要になることがある.
このように,型が異なるものの演算を混合演算と言う.この場合,精度の高い方に型の変
換が行われる.整数型の値は倍精度実数型に自動的に変換されて,計算が行われる.常識
の範囲でちゃんと計算が行われるのである.
代入演算において,右辺値と左辺値の型が異なる場合はどうなるか?.この場合は,右辺
値は左辺の変数の型に自動的に変換される.これも常識通りで,おかしな値にならないよ
うになっている.
ここは,教科書のp.98-99に述べていることである.
強制的にプログラマーがデータの型の変換を行わなくてはならないことがある.これが必
要なほとんどの場合は,整数どうしの除算である.例えば,クラスの英語の点数の合計を
格納している整数型の変数sumの値が3130とし,その人数は整数型の変数nに41
と格納されているとする.その平均を倍精度実数型の変数aveに格納したい.
次の例は,間違いである.
ave=sum/n;
このようにすると,
aveの値は76.000000
となる.右辺は整数と整数の演算なので,
右辺値は整数の76になる.それを,倍精度実数型の変数
aveに代入するので暗黙の型
変換により,76.000000
となるのである.
正しくは,つぎのようにする.
ave=(double)sum/n;
変数
sumの前に
(double)を付けることにより,強制的に倍精度実数型に変換し
ている.中括弧と型名を書くと,その右の値の型を強制的に変えることができる.これを
明示的型変換
4言う.
この型変換により,
sumの値は3130.000000
の倍精度実数になる.倍精度実
数と整数の複合演算なので,整数部分は倍精度実数に変換される.従って,右辺値は
76.341463
となる.これが左辺の
aveに代入されるので,ちゃんと平均値が
計算できる.
もちろん,
ave=sum/(double)n;
としても良いし,
ave=(double)sum/(double)n;
でも問題ない.
しかし,
ave=(double)(sum/n);
はダメである.これは,括弧内の
sum/nが整数どうしの演算なので,この括弧内の値
は76となる.それを倍精度実数型に変換しているので,右辺値は76.000000
とな
る.
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成18年7月5日