Programming Place Plus トップページ – 新C++編
優先度 | 演算子 | 機能 | 結合の向き | 解説ページ |
---|---|---|---|---|
1 | :: | スコープ解決 | 左から右 | 「列挙型」「整数型」 |
2 | () | 関数呼び出し | 左から右 | 「関数を作る」 |
[] | 配列の要素 | 「文字列の入力」「std::vector」 | ||
-> | ポインタからのメンバアクセス | |||
. | メンバアクセス | 「構造体」 | ||
++ | 後置インクリメント | 「for文」 | ||
– | 後置デクリメント | 「for文」 | ||
type()、type{} | 関数形式キャスト | |||
static_cast | キャスト | 「浮動小数点数」「符号無し整数」 | ||
dynamic_cast | キャスト | |||
const_cast | キャスト | |||
reinterpret_cast | キャスト | |||
typeid | 型情報の取得 | |||
3 | ! | 論理否定 | 右から左 | 「要素を探索する」 |
~ | ビット否定 | |||
++ | 前置インクリメント | 「for文」 | ||
– | 前置デクリメント | 「for文」 | ||
+ | 符号 | 「計算」 | ||
- | 符号を反転させる | 「計算」 | ||
* | ポインタの間接参照 | |||
& | メモリアドレス | |||
sizeof | 変数や型の大きさを取得 | 「整数型」 | ||
(type) | キャスト | 「アサート」 | ||
new、new[] | 動的メモリ割り当て | |||
delete、delete[] | 動的に割り当てたメモリの解放 | |||
alignof | アラインメント値を取得 | |||
4 | .* | ポインタメンバへのアクセス | 左から右 | |
->* | ポインタメンバへのアクセス | |||
5 | * | 乗算 | 「乗算と除算」 | |
/ | 除算 | 「乗算と除算」 | ||
% | 剰余 | 「乗算と除算」 | ||
6 | + | 加算 | 左から右 | 「計算」 |
- | 減算 | 「計算」 | ||
7 | << | 左シフト | 左から右 | |
>> | 右シフト | |||
8 | < | 左の方が小さい | 左から右 | 「論理値」 |
<= | 左が右以下 | 「論理値」 | ||
> | 左の方が大きい | 「論理値」 | ||
>= | 左が右以上 | 「論理値」 | ||
9 | == | 等しい | 左から右 | 「論理値」 |
!= | 等しくない | 「論理値」 | ||
10 | & | ビット積 | 左から右 | |
11 | ^ | ビット排他的論理和 | 左から右 | |
12 | | | ビット和 | 左から右 | |
13 | && | 論理積 | 左から右 | 「要素を探索する」 |
14 | || | 論理和 | 左から右 | 「要素を探索する」 |
15 | ? : | 条件演算子 | 右から左 | 「if文と条件演算子」 |
= | 代入 | 「代入」 | ||
+= | 加算代入 | 「代入」 | ||
-= | 減算代入 | 「代入」 | ||
*= | 乗算代入 | 「代入」 | ||
/= | 除算代入 | 「代入」 | ||
%= | 剰余代入 | 「代入」 | ||
<<= | 左シフト代入 | |||
>>= | 右シフト代入 | |||
&= | ビット積代入 | |||
|= | ビット和代入 | |||
^= | ビット排他的論理和代入 | |||
throw | 例外の送出 | |||
17 | , | カンマ | 左から右 |
「優先度」の列の数値が小さいものほど、演算が優先されます。演算とは、演算子ごとに異なる処理のことを指しており、/
なら除算、<<
ならシフト演算といった意味です。オペランドの式から値を得ることは評価といい、(a + b) / f()
であれば、a + b
を計算して値を作ったり、f を呼び出して戻り値を得たりすることを指します。演算子の優先度が高いからといって、その演算子のオペランドが先に評価されるということではありません。評価の順序は、&& や ||(短絡評価)、カンマ演算子(必ず左から)、?:(第1オペランドを評価してから、第2または第3オペランドが評価される)といった一部の例外を除いて、未定義です1。
「結合の向き」とは、優先度が同じ演算子が1つの式の中に複数あらわれるとき、どの演算子とどのオペランドが結びついているのかを決めるルールです。たとえば、a * b / c
では、*
や /
は同じ優先度で、左から右の結合なので、(a * b) / c
であるとみなされます。同様に、a = b = c
では、=
は右から左の結合なので、a = (b = c)
であるとみなされます。
なお、最も高い優先度のところにあるので勘違いしやすいですが、( ) は関数呼び出しのものであって、a = (10 + 5) * 2;
のように使われる ( ) とは異なります。これは括弧式というもので、演算子ではありません。括弧式の効果は、グループ化する範囲を示すことです。