C++の演算子の優先順位と結合規則を徹底解説【一覧表付き】
演算子の優先順位とは
C++における演算子の優先順位(operator precedence)は、式の中で各項(オペランド)がどのようにグループ化されるかを決める重要なルールです。また、結合規則(associativity)とは、括弧がない場合に同じ優先順位を持つ演算子がどちらの方向から評価されるかを決める特性のことを指します。これらは式の評価結果に直接影響を与えます。
演算子によって優先順位には差があり、一部の演算子は他の演算子よりも先に評価されます。たとえば、乗算演算子(*)は加算演算子(+)よりも高い優先順位を持っています。
具体例:x = 7 + 3 * 2 の評価
x = 7 + 3 * 2;この式の場合、変数 x には 20 ではなく 13 が代入されます。その理由は、* 演算子が + 演算子よりも高い優先順位を持つため、まず 3 * 2 = 6 が計算され、その結果が 7 に加算されて 7 + 6 = 13 となるからです。
C++の演算子の優先順位一覧表
以下の表では、優先順位の最も高い演算子が表の上部に、最も低い演算子が下部に配置されています。式の中では、優先順位の高い演算子から順番に評価されます。意図した通りの計算順序にしたい場合は、括弧を使って明示的にグループ化することをおすすめします。
| 分類 | 演算子 | 結合規則 |
|---|---|---|
| 後置 | () [] -> . ++ -- | 左から右へ |
| 単項 | + - ! ~ ++ -- (type) * & sizeof | 右から左へ |
| 乗除 | * / % | 左から右へ |
| 加減 | + - | 左から右へ |
| シフト | << >> | 左から右へ |
| 関係 | < <= > >= | 左から右へ |
| 等価 | == != | 左から右へ |
| ビット単位AND | & | 左から右へ |
| ビット単位XOR | ^ | 左から右へ |
| ビット単位OR | | | 左から右へ |
| 論理AND | && | 左から右へ |
| 論理OR | || | 左から右へ |
| 条件(三項) | ?: | 右から左へ |
| 代入 | = += -= *= /= %= >>= <<= &= ^= |= | 右から左へ |
| カンマ | , | 左から右へ |
まとめ
演算子の優先順位と結合規則を正しく理解することで、複雑な式でも意図した通りの評価結果を得られるようになります。特に、代入系演算子や三項条件演算子は「右から左へ」結合される点に注意しましょう。曖昧さを避けたい場合は、括弧を活用してコードの可読性を高めることがベストプラクティスです。
-
C++で連続ツリー(Continuous Tree)を判定するアルゴリズムと実装例
連続ツリー(Continuous Tree)とは連続ツリーとは、ルートノードから葉ノードまでのすべての経路において、親ノードとそのすべての直接の子ノードとの値(重み)の絶対差が常に1となるような木のことです。ルートから葉への経路上の任意のノードを選んだとき、次の条件が必ず成り立ちます。|ノードの値 − 左の子ノードの値| = 1(右の子ノードについても同様に成り立つ)図解と具体例具体例を見ながら理解を深めましょう。下の木は、親ノードとその子ノードの値の絶対差が常に1であるため、連続ツリーとみなされます。一方、下の木は親子ノード間の絶対差が1になっていない箇所があるため、連続ツリーの条件を満たし
-
C++で最大二分木を構築する方法:再帰アルゴリズムと実装例を解説
最大二分木(Maximum Binary Tree)とは? ここでは、すべての要素が一意(重複なし)である整数配列が与えられたとします。この配列から構築される「最大二分木」は、以下のように定義されます。 根(ルート)には、配列内の最大値が格納されます。 左部分木は、最大値を基準に分割された左側の部分配列から構築された最大二分木です。 右部分木は、最大値を基準に分割された右側の部分配列から構築された最大二分木です。 この定義に従って最大二分木を構築します。たとえば、入力が [3,2,1,6,0,5] の場合、構築される木は次の図のようになります。 解き方のアプローチ この問題は、再帰的な