演算子の優先順位
この本を通して使用してきたように、式は複数の演算子で連鎖させることができる。例えば、次の行には3つの演算子で連鎖された4つの式が含まれている。
演算子の優先順位ルールは、連結された演算子が実行される順序と、それらが使用する式を指定する。演算子は、優先順位の高いものから低いものの順に実行される。
以下は、Dの演算子の優先順位表だ。演算子は、優先順位の高いものから低いものの順にリストされている。同じ行にあるものは、同じ優先順位を持つ。 (表内の行の折り返しは意味がない。例えば、==
と!is
は同じ優先順位を持つ。) 特に指定がない限り、演算子は左結合だ。
表で使用されている用語の一部は、以下で説明している。
演算子 | 説明 | 注 |
---|---|---|
! | テンプレートインスタンス化 | チェーンできない |
=> | ラムダ定義 | 実際の演算子ではない。テーブルに2回出現する。この行は左側の結合力を表す。 |
. ++ -- ( [ | 後置演算子 | ( および[ は、それぞれ) および] とバランスが取れていなければならない |
^^ | パワー演算子 | 右結合 |
++ -- * + - ! & ~ cast | 一項演算子 | |
* / % | 二項演算子 | |
+ - ~ | 二項演算子 | |
<< >> >>> | ビットシフト演算子 | |
== != > < >= <= in !in is !is | 比較演算子 | ビット演算子に対して順序付けられておらず、連鎖できない |
& | ビット単位のAND | 比較演算子に対して順序なし |
^ | ビット単位の排他的論理和 | 比較演算子に対して順序なし |
| | ビット単位のOR | 比較演算子に対して順序なし |
&& | 論理積 | 短絡 |
|| | 論理和 | 短絡 |
?: | 三項演算子 | 右結合 |
= -= += = *= %= ^= ^^= ~= <<= >>= >>>= | 代入演算子 | 右結合 |
=> | ラムダ定義 | 実際の演算子ではない;表に2回出現する;この行は右への結合力を示すためのもの |
, | コンマ演算子 | コンマを区切り文字として使用する場合(パラメータリストなど)と混同しないようにしよう |
.. | 数値範囲 | 実際の演算子ではない;特定のポイントで構文にハードコーディングされている |
チェーン
章の冒頭の行を考えてみよう:
2項演算子*
は2項演算子+
よりも優先順位が高いため、また2項演算子+
は=
よりも優先順位が高いため、この式は、括弧で囲んだ以下の式と同等として実行される。
別の例として、後置演算子.
は単項演算子*
よりも優先順位が高いため、次の式はまずオブジェクトo
のメンバーptr
にアクセスし、次にそれを逆参照する。
一部の演算子は連鎖できない:
エラー: 期待される')'の代わりに'=='が見つかった
プログラマーは、希望する実行順序を括弧で指定する必要がある:
結合性
2つの演算子が同じ優先順位を持つ場合、その結合性がどちらの演算子が先に実行されるかを決定する:左側の演算子か右側の演算子か。
ほとんどの演算子は左結合性であり、左側の演算子が先に実行される:
一部の演算子は右結合性であり、右側の演算子が先に実行される:
順序のない演算子グループ
ビット演算子と論理演算子の優先順位は言語で指定されていない:
エラー: b == c は演算子&の隣にある場合は括弧で囲む必要がある
プログラマーは、希望する実行順序を括弧で指定する必要がある:
演算子の優先順位=>
=>
は演算子ではないが、左側と右側の演算子との相互作用を指定するため、表に2回登場する。
上記の=>
の両側に=
演算子が存在する場合、=>
は左側の=
よりも優先されるため、プログラマーが以下の括弧を明示的に指定した場合と同様に、a
とより強く結合する:
右側では、=>
は=
よりも優先順位が低いため、右側のa
は、以下の追加の括弧が指定されたかのように、=
に強く結合する。
その結果、ラムダ式はa => a
だけになるのではなく、残りの式a => a = 1
も含まれる。これは、aが与えられた場合、a = 1を生成することを意味する。このラムダは、変数l
に割り当てられる。
注釈:これは単なる例だ。そうでなければ、a = 1
はラムダ式にとって意味のある本体ではない。そのパラメータa
への変更が失われたように見え、ラムダ式を呼び出した結果は常に1になってしまうからだ("失われたように見える"と言ったのは、a
の型に対して代入演算子がオーバーロードされており、副作用があるかもしれないからだ)。
コンマ演算子
コンマ演算子は2項演算子である。まず左側の式を実行し、次に右側の式を実行する。両方の式の値は無視される。
コンマ演算子は、ループの反復で複数の変数を変更する場合のfor
ループで最もよく使われる。