C言語の演算子の結合規則を完全ガイド!初心者でもわかる演算の読み方
生徒
「C言語で足し算や引き算の計算はできるようになってきたんですけど、複雑な式になるとどこから計算されるのか分からなくなります。」
先生
「その気持ちはよく分かります。C言語には『演算子の結合規則』というルールがあり、それによって計算の順番が決まるんです。」
生徒
「演算子の優先順位とは違うんですか?」
先生
「優先順位は『どの演算子が先』かという話で、結合規則は『同じ優先順位同士ならどちらから計算するか』という話なんです。実際の計算を例にしながら解説します。」
1. 結合規則とは?
C言語には多くの演算子があります。足し算、引き算、掛け算、割り算、比較、代入など、たくさんの演算子が混ざった式を書くことができます。しかし、式の書き方によっては、どこから計算されるか分かりにくくなることがあります。そんなときに役立つのが結合規則という仕組みです。
結合規則とは、同じ優先順位を持つ演算子が複数並んだとき、どちら側から計算するかを決めるルールです。結合規則には大きく分けて二種類があります。
- 左結合:左から右へ計算する
- 右結合:右から左へ計算する
日常的な算数では「左から右」が当たり前のように思えますが、C言語では例外もあります。代入や条件演算子などは右結合なので、理解していないと結果がまったく違うものになります。
2. 左結合の例
まずは左結合から説明します。左結合は、左側の式から順番に計算していく結合規則です。算数と同じ感覚で理解できるので、イメージしやすいルールです。例えば、次のような式です。
int result = 10 - 3 - 2;
printf("%d", result);
この式は数字が並んでいるだけなので簡単に見えますが、計算の順番は「左から右」です。
つまり、
10 - 3 = 7
7 - 2 = 5
したがって結果は5になります。
5
掛け算、割り算、足し算、引き算、ビット演算子、比較演算子、論理演算子の多くは左結合です。同じ優先順位同士なら、基本的に左から処理されると覚えておくと安心です。
3. 右結合の例
右結合は、右側から計算する結合規則です。特に、代入演算子や条件演算子(?:)などが右結合になります。右結合を知らずにプログラムを書くと、予想外の動作をすることがあります。
int a, b, c;
a = b = c = 5;
printf("%d %d %d", a, b, c);
このコードは一見複雑に見えますが、右から順番に計算されます。
c = 5 → b = c → a = b という順番です。すべてに5が代入されるため、aもbもcもすべて5になります。
5 5 5
右結合を知らないと、「左から代入される」と誤解してしまうことがあります。正しい動作を理解するために、右結合の存在を必ず意識しておきましょう。
4. 結合規則の一覧
C言語の演算子の結合規則は決められており、どれが左結合、どれが右結合なのかがはっきりと分類されています。以下は代表的な結合規則の一覧です。
| 演算子の種類 | 例 | 結合規則 |
|---|---|---|
| 単項演算子 | !, ++, --, sizeof | 右結合 |
| 掛け算・割り算・剰余 | *, /, % | 左結合 |
| 足し算・引き算 | +, - | 左結合 |
| 比較演算子 | <, >, <=, >= | 左結合 |
| 等値演算子 | ==, != | 左結合 |
| 論理演算子 | &&, || | 左結合 |
| 代入演算子 | =, +=, -= | 右結合 |
| 条件演算子 | ?: | 右結合 |
5. 実際に比較してみよう
左結合と右結合の違いを感じるには、実際のコードを見比べると分かりやすくなります。次の二つの式を比べてみましょう。
int x = 20 / 5 / 2;
printf("%d", x);
2
この式は20 ÷ 5 = 4、4 ÷ 2 = 2となり、左から処理されるため結果は2です。
次は右結合の例です。
int x, y;
x = y = 10;
printf("%d %d", x, y);
10 10
6. 結合規則を無視したいときは?
結合規則を覚えるのが難しいと感じる人もいます。その場合、もっと簡単な方法があります。それはかっこで囲むことです。かっこは最優先で計算されるので、結合規則を気にせず書けます。
int result = (10 - 3) - 2;
printf("%d", result);
5
初心者のうちは、迷ったら必ずかっこを使った方が安全です。自分にも他人にも読みやすいコードになり、バグも減らせます。