c-lang:演算子の優先度と評価順序
table:precedence
優先順位 演算子 名称と説明 結合方向
1 ( ) 関数呼び出し演算子 (function call operator)関数コール 左から
. .演算子、ドット演算子 ( .operator ) 構造体のメンバ参照(構造体の名前より) 左から
-> ->演算子、アロー演算子 ( ->operator ) 構造体のメンバ参照(構造体を指すポインタより) 左から
添字演算子 ( subscript operator) 配列の添え字 左から
++ 前置増分演算子 ( prefix incremental operator) インクリメント 左から
-- 前置減分演算子 ( prefix decremental operator) デクリメント 左から
2 ++ 後置増分演算子 ( postfix incremental operator ) インクリメント 右から
-- 後置減分演算子 ( postfix decremental operator ) デクリメント 右から
~ ~演算子、補数演算子 ( complement operator ) 右から
! 論理否定演算子 ( logical negation operator ) 右から
+ 単項+演算子 ( unary + operator ) 単項演算子の'+'(プラス) 右から
- 単項-演算子 ( unary - operator ) 単項演算子の'-'(マイナス) 右から
& 単項&演算子、アドレス演算子 ( address opeerator ) 変数などのアドレス 右から
* 単項*演算子、間接演算子 ( indirection opeerator ) ポインタからのデータ参照 右から
sizeof sizeof 演算子 (sizeof operator) 記憶量 右から
3 ( 型 ) キャスト演算子 ( cast opeerator ) タイプキャスト。式の値を型名で示される型に変換する。 右から
4 * 2項*演算子 ( binary * opeerator ) 乗算 左から
/ /演算子 ( binary / opeerator ) 除算 左から
% %演算子 ( binary % opeerator ) 剰余 左から
5 + 2項+演算子 ( binary + opeerator ) 加算 左から
- 2項-演算子 ( binary - opeerator ) 減算 左から
6 << <<演算子、左シフト演算子 ( left-shift opeerator ) 左シフト 左から
> >>演算子、右シフト演算子 ( right-shift opeerator ) 右シフト 左から
7 < <演算子 ( < opeerator ) 左から
<= <=演算子 ( <= opeerator ) 左から
>演算子 ( > opeerator ) 左から
= >=演算子 ( >= opeerator ) 左から
8 == ==演算子 ( == opeerator ) 2つの式の値が等しければ「真」そうでなければ「偽」。 左から
!= !=演算子 ( != opeerator ) 2つの式の値が等しくないなら「真」等しければ「偽」。 左から
9 & ビット積演算子、ビットAND演算子 ( bitwise AND opeerator)2つの式の値のビットごとの AND(論理積)をとる 左から
10 ^ ビット差演算子、ビット排他OR演算子 ( bitwise non-equivalence opeerator)2つの式の値のビットごとの XOR(排他的論理和)をとる 左から
11 | ビット和演算子、ビットOR演算子 ( bitwise OR opeerator )2つの式の値のビットごとの OR (論理和)をとる 左から
12 && 論理積演算子、論理AND演算子 ( logical AND opeerator ) 2つの式(型は整数)の AND(論理積) 左から
13 || 論理和演算子、論理OR演算子 ( logical OR opeerator ) 2つの式(型は整数)の OR (論理和) 左から
14 ? : 条件演算子 ( conditional opeerator ) 右から
15 = 単純代入演算子 ( simple assignment opeerator )単純代入 右から
*= 複合演算子、*=演算子 ( *= opeerator )乗算代入 右から
/= 複合演算子、/=演算子 ( /= opeerator )除算代入 右から
%= 複合演算子、%=演算子 ( %= opeerator )剰余代入 右から
+= 複合演算子、+=演算子 ( += opeerator )加算代入 右から
-= 複合演算子、-=演算子 ( -= opeerator )減算代入 右から
<<= 複合演算子、<<=演算子 ( <<= opeerator ) 左シフト代入 右から
>= 複合演算子、>>=演算子 ( >>= opeerator ) 右シフト代入 右から
&= 複合演算子、&=演算子 ( &= opeerator ) ビット積代入 右から
|= 複合演算子、|=演算子 ( |= opeerator ) ビット和代入 右から
^= 複合演算子、^=演算子 ( ^= opeerator ) ビット差代入 右から
16 , カンマ演算子 ( comma opeerator ) 順次 左から
Cの演算子の優先順位には、おかしなものもあるので、なるべく括弧()で囲もう!
例:
*ptr++;
ポインタ(*)と、インクリメント(++)の優先順位は同じなので、この式が、(*ptr)++ と解釈されるか、*(ptr++) と解釈されるかは、処理系定義となる。