演算子の優先順位と結合規則
Cの演算子を一通り紹介してきました。これらには『どの演算を先に行うか』という優先順位があります。
基本は算数の規則と同じ
Cは関数で処理を組み上げていく言語で、制御構造などのいわゆる予約語は非常に少なく、ライブラリに納められている多数の関数とユーザー(プログラマー)が定義した関数とが等価に扱われるという特徴を持っています。
そのため、基本的な言語仕様がシンプルなのですが、シンプルな言語仕様でありながら細やかな処理を記述できるのは、演算子の種類が豊富なためだと言えます。
関数や演算子を使った処理・計算の手順を『式』と呼ぶことは、既に説明しました。その式を実行して結果を求めることを(式の)「評価」と呼びます。そして、演算子には「どの命令から先に評価するか」という優先順位があります。
四則演算子の場合、
+−より×(*)÷(/)を使った式を先に計算する
という基本規則があります。これは、算数で習った規則と同じですね。
この場合、+と−、*と/は同じ順位となります。1つの式の中に+と−や*と/が存在した場合、左に記述された方の式が先に評価されます。これを『結合規則』と言います。
優先順位と結合規則
以上をまとめると、演算子の優先順位と結合規則は次のような意味合いになります。
・優先順位:式中のどの演算子から先に演算を行うか
・結合規則:式中で同一の優先順位を持つ演算子が現れた場合に、左右どちらから先に演算を行うか
Cの演算子の優先順位と結合規則を表1にまとめました。演算子の数が多く、さらにその優先順位や結合規則を意識しなければならないのでは、複雑な式を記述する際に混乱してしまいます。
そのような場合には、これも算数の時間に習った規則と同じで、先に計算させたい式を()で囲みます。
例えば、
x = a + b * c;
という式では、b * cが先に計算されて、その結果にaを加算します。a + bを優先してその結果にcを乗算したいのなら、()を使って次のようにします。
x = (a + b) * c;
その他の演算子では、優先順位を利用したC独特の簡略記法をいろいろと使えます。これらについては、配列やポインタを説明した後で詳しく紹介することにしましょう。
表1:演算子の優先順位と結合規則
種類 |
演算子 |
結合規則 |
優先順位 |
関数, 添字, 構造体メンバ参照,後置増分/減分 |
() [] . -> ++ -- |
左→右 |
高
低 |
前置増分/減分, 単項式※ |
++ -- ! ~ + - * & sizeof |
左←右 |
キャスト |
(型名) |
乗除余 |
* / % |
左→右 |
加減 |
+ - |
シフト |
<< >> |
比較 |
< <= > >= |
等値 |
== != |
ビットAND |
& |
ビットXOR |
^ |
ビットOR |
| |
論理AND |
&& |
論理OR |
|| |
条件 |
?: |
左←右 |
代入 |
= += -= *= /= %= &= ^= |= <<= >>= |
コンマ |
, |
左→右 |
※単項式とは演算子を適用する項が1つだけの式で、!(否定)、~(排他的論理和)、+(正)、-(負)、*(ポインタ)、&(アドレス)、sizeofが該当します
あとがき
hiropの『ちょっと気になる専門用語』~《記号の読み方》
色々な演算子を紹介してきましたが、そのほとんどは記号で表現されます。僕がCを学び始めたとき、書籍に記述されたそれら記号の読み方に頭を悩ませたものです。例えば"&"は「あんど」とか「あんぱさんど」と読むことは知っていても、じゃあ"&&"はなんと読めばよいのか……?
本を読むレベルでは、適当に「あんどあんど」などとしていましたが、他者にソースの解説をする場合に果たしてそれで通じるのだろうか……? という疑問です。
1人で自由にコーディングできる場合は別として、チームで複数のメンバーと合同作業をする場合、記号の読み方を共通させることは非常に重要です。が、これが案外バラバラだったりします。
"&"や">"のように誰もが知っている記号は別として、C独自の記号については、多くの場合、社内やチーム内で独自の読み方が定まっているようです。
そこで、これらC独自の記号の読み方を、僕の知っている範囲でまとめてみます。あくまでローカルな規則なので、まったく異なる読み方をしている人もいるかと思います。取りあえず、参考までに……ということで。
表2:記号の読み方(あくまでhiropの知る範囲)
記号 |
読み |
= |
いこーる/げた/だいにゅう |
+ |
ぷらす/たす |
- |
まいなす/ひく |
* |
あすた/あすたりすく |
/ |
すら/すらっしゅ |
== |
ひとしい/いこいこ |
++ |
ぷらぷら/たすたす |
-- |
まいまい/ひくひく |
& |
あんど/あんぱさんど/あんぱさ |
| |
おあ/たてぼう |
&& |
あんどあんど |
|| |
おあおあ/たてたて |
() |
かっこ/まるかっこ/ぱーれん(印刷用語) |
{} |
なみかっこ 数学では中括弧 Cでは大括弧 |
[] |
かくかっこ 数学では大括弧 |
. |
どっと/ぴりおど/てん |
! |
びっくり |
< |
しょうなり/ひだりやま |
> |
だいなり/みぎやま |
<= |
しょうなりいこーる/しょういこ |
>= |
だいなりいこーる/だいいこ |
<< |
しょうなりしょうなり/ひだりやまにこ/ひだりおくり |
>> |
だいなりだいなり/みぎやまにこ/みぎおくり |
ちなみに、Windowsのプログラミングでよく用いられるDLL(Dynamic Link Library)は、通常は「ディー・エル・エル」と読みますが、ある会社では「でれれ」というそうです(笑)。
その他「API(エー・ピー・アイ)」を「あぴ」という人もいます。一番驚いたのは、「OS(オーエス)」を「オス」と読む人に出会ったときです。最初は、何を言っているのか分かりませんでした。
|
|
|