ここでは、C言語演算子の優先順位一覧表と結合規則についてまとめておきます。
C言語の演算子(えんざんし と読みます)には、優先順位というものが存在します。
優先順位を考慮せず代入式などを記述してしまうとプログラムが意図した処理にならない可能性があります。
優先順位の簡単な説明
優先順位を簡単に言うなら、算数で習ったような
足し算・引き算より掛け算・割り算の方が先に計算する
というようなことです。
例えば、
x = 10 + 3 * 2;
が実行されると変数xの値は、16になります。
もちろん上記の+や*以外にもC言語には沢山の演算子が存在します。
一覧を以下に示します。
C言語演算子の優先順位一覧
優先順位 | 演算子 | 意味 | 名称 | 結合規則 |
---|---|---|---|---|
1 | () . , -> | 括弧 配列 構造体のメンバ参照 構造体のポインタのメンバ参照 | 式 | 左から右 |
2 | ! & ++ — sizeof (cast) | 否定 ポインタの参照 アドレス参照 インクリメント デクリメント 変数等のサイズ(バイト) キャスト | 単項演算子 | 右から左 |
3 | * / % | 乗算 徐算 余り | 乗除演算子 | 左から右 |
4 | + – | 加算 減算 | 加減算演算子 | 左から右 |
5 | << >> | ビット左シフト ビット右シフト | シフト演算子 | 左から右 |
6 | < > <= >= | 未満(より小さい) 超える(より大きい) 以下 以上 | 関係演算子 | 左から右 |
7 | == != | 一致 不一致 | 関係演算子(等価、不等価) | 左から右 |
8 | & | ビット同士の論理積 | ビット演算子 | 左から右 |
9 | ^ | ビット同士の排他的論理和 | ビット演算子(排他的論理和) | 左から右 |
10 | | | ビット同士の論理和 | ビット演算子 | 左から右 |
11 | && | 条件の論理積 | 論理演算子(AND) | 左から右 |
12 | || | 条件の論理和 | 論理演算子(OR) | 左から右 |
13 | ?: | 条件?真の処理:偽の処理 | 三項演算子 | 左から右 |
14 | = *= /= %= += -= <<= >>= &= |= ^= | 代入 乗算して代入 除算して代入 余りを代入 加算して代入 減算して代入 左シフトして代入 右シフトして代入 論理積とって代入 論理和をとって代入 排他的論理和をとって代入 | 代入演算子 | 右から左 |
15 | , | 式と式の区切り | コンマ演算子 | 左から右 |
結合規則について
一覧表に結合規則という項目があります。これは少し分かりにくい言葉なので説明します。
計算式や条件式は通常左から右に見ていきますよね。
この見た目と実際の計算順は少し違うということです。
代入式が一番分かりやすいので例にとります。
x = 10 + 2 * 5;
ここで優先順位が登場します。
上記式を優先順位が高い順に並べると
* > + > =
となります。
この中で*と+に関しては結合規則が左から右です。
ですから通常は10+2*5と左から右に計算したいところですが、ここで優先順位がじゃまします。
+より*の方が優先順位が高い為、まず2*5を計算して10を求めてから10+10を計算して20を得ます。
ここまでまとめると
x = 20;
となります。
最後に、この中で一番優先順位が低い=ですが、結合規則が右から左となっています。
これは
x = 20;
の式を右から左に数値が移動すると考えると分かりやすいです。
つまり20という値が変数xに入るという意味です。
ですから変数xの値は20になるのです。
なんとなく分かったでしょうか?
コメント