e知識「e-chishiki.com」では、インドでの著名なIT著者、IT教育者、eセキュリティーの大家により作成された様々な種類のプログラミング言語に関する技術的なコンテンツを知識情報データーベースとして提供します。
オンライン書籍; インド式プログラミングバイブル C言語入門 (上)
第 1 章 : C言語入門 始めに(書籍のプレビュー)
インド式プログラミングバイブル C言語入門
この記事は、2008年4月から発売の「インド式プログラミングバイブル C言語入門 (上)」より掲載しました。書籍の情報は、こちらをご覧ください。
演算子の結合性
式の中に、同じ優先度を持つ演算子が2つ含まれている場合、その関係は、演算子の結合性を使って解決されます。結合性には、「左から右」と「右から左」の2種類があります。「左から右」の結合性を持つと言うことは、左側のオペランドが非曖昧でなければならないと言うことです。非曖昧とは、何を意味しているのでしょうか?非曖昧とは、他の副式の評価に使われていてはならないということです。同様に、結合性が「右から左」である場合には、右オペランドが非曖昧でなければなりません。例を使って、具体的に見てみましょう。
以下の式があるとします。
a = 3 / 2 * 5 ;
この式では、同じ優先度を持つ演算子である/と*が、結合されています。この2つの関係は、/と*の結合性を使って解釈します。ただし、両方とも、「左から右」の結合性からは逸脱しません。各演算子と、オペランドの非曖昧性の組み合わせは、図1.10の通りになります。
| 演算子 |
左 |
右 |
解 釈 |
|---|---|---|---|
| / | 3 | 2 もしくは 2 * 5 | 左オペランドが非曖昧で、右は曖昧 |
| * | 3 / 2もしくは 2 | 5 | 右オペランドが非曖昧で、左は曖昧 |
| 図 1.10 |
/と*の両方が「左から右」の結合性を持っていますが、/だけが非曖昧な左オペランド(「左から右」結合性の必要条件)を持っているため、先に実行されます。
別の式を、検討してみましょう。
a = b = 3 ;
この式では、どちらの代入演算子も、同じ優先度と同じ結合性(右から左)を持っています。各演算子と、オペランドの非曖昧性の組み合わせは、図1.11の通りになります。
| 演算子 |
左 |
右 |
解 釈 |
|---|---|---|---|
| = | a | b もしくは b = 3 | 左オペランドが非曖昧で、右は曖昧 |
| = | b もしくは a = b | 3 | 右オペランドが非曖昧で、左は曖昧 |
| 図 1.11 |
両方の=が「右から左」の結合性を持っていますが、2つめの=だけが、非曖昧な右オペランド(「右から左」結合性の必要条件)を持っているため、2つめの=の方が、先に実行されます。
さらにもう1つ、式を検討してみましょう。
z = a * b + c / d ;
この式では、*と/が、同じ優先度と同じ結合性(左から右)を持っています。各演算子と、オペランドの非曖昧性の組み合わせは、図1.12の通りになります。
| 演算子 |
左 |
右 |
解 釈 |
|---|---|---|---|
| * | a | B | 両方のオペランドが非曖昧 |
| / | c | D | 両方のオペランドが非曖昧 |
| 図 1.12 |
この場合、両方の演算子が、非曖昧な左オペランドを持っており、どちらを先に実行しても同じ結果となるため、コンパイラは、*と/のいずれの演算からでも実行できます。



