第20回
いろいろな演算子~演算子の優先順位

演算子の優先順位と結合規則

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(オーエス)」を「オス」と読む人に出会ったときです。最初は、何を言っているのか分かりませんでした。