C言語に存在する演算子📘の優先度が、どのように定義されているか一覧できるようにしました。
C++ の演算子一覧がこちらのページにあります。
| 優先度 | 演算子 | 機能 | 結合の向き | 解説章 | 
|---|---|---|---|---|
| 1 | () | 関数呼び出し | 左から右 | 第9章 | 
| [] | 配列の要素 | 第25章 | ||
| -> | ポインタからの構造体メンバアクセス | 第31章 | ||
| . | 構造体メンバアクセス | 第26章 | ||
| ++ | 後置インクリメント | 第12章 | ||
| -- | 後置デクリメント | 第12章 | ||
| (type) {…} | 複合リテラル | 第26章、第32章 | ||
| 2 | ! | 論理否定 | 右から左 | 第15章 | 
| ~ | ビット否定 | 第49章 | ||
| ++ | 前置インクリメント | 第12章 | ||
| -- | 前置デクリメント | 第12章 | ||
| + | 符号 | 第2章 | ||
| - | 符号を反転させる | 第2章 | ||
| * | ポインタの間接参照 | 第31章 | ||
| & | メモリアドレス | 第6章、第31章 | ||
| sizeof | 変数や型の大きさを取得 | 第6章、第19章 | ||
| _Alignof | 【C11】アラインメント値を取得 | 第37章 | ||
| 3 | (型名) | キャスト | 右から左 | 第21章 | 
| 4 | * | 乗算 | 左から右 | 第3章 | 
| / | 除算 | 第3章 | ||
| % | 剰余 | 第3章 | ||
| 5 | + | 加算 | 左から右 | 第2章 | 
| - | 減算 | 第2章 | ||
| 6 | << | 左シフト | 左から右 | 第49章 | 
| >> | 右シフト | 第49章 | ||
| 7 | < | 左の方が小さい | 左から右 | 第13章 | 
| <= | 左が右以下 | 第13章 | ||
| > | 左の方が大きい | 第13章 | ||
| >= | 左が右以上 | 第13章 | ||
| 8 | == | 等しい | 左から右 | 第13章 | 
| != | 等しくない | 第13章 | ||
| 9 | & | ビット積 | 左から右 | 第49章 | 
| 10 | ^ | ビット単位排他的論理和 | 左から右 | 第49章 | 
| 11 | | | ビット和 | 左から右 | 第49章 | 
| 12 | && | 論理積 | 左から右 | 第15章 | 
| 13 | || | 論理和 | 左から右 | 第15章 | 
| 14 | ? : | 条件演算子 | 右から左 | 第14章 | 
| 15 | = | 代入 | 右から左 | 第7章 | 
| += | 加算代入 | 第7章 | ||
| -= | 減算代入 | 第7章 | ||
| *= | 乗算代入 | 第7章 | ||
| /= | 除算代入 | 第7章 | ||
| %= | 剰余代入 | 第7章 | ||
| <<= | 左シフト代入 | 第49章 | ||
| >>= | 右シフト代入 | 第49章 | ||
| &= | ビット積代入 | 第49章 | ||
| |= | ビット和代入 | 第49章 | ||
| ^= | ビット単位排他的論理和代入 | 第49章 | ||
| 16 | , | カンマ | 左から右 | 第27章 | 
「優先度」の列の数値が小さいものほど、演算が優先されます。演算とは、演算子ごとに異なる処理のことを指しており、/ なら除算、<< ならシフト演算といった意味です。オペランド📘の式から値を得ることは評価📘といい、(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; のように使われる ( ) とは異なります。これは括弧式と呼ばれ、演算子ではありません。括弧式の効果は、グループ化する範囲を示すことです。
Programming Place Plus のトップページへ
| はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア | 
| X で ポスト/フォロー | LINE で送る | noteで書く | 
|  RSS | 管理者情報 | プライバシーポリシー |