次の方法で共有


評価の優先順位と順序

C の演算子の優先順位と結合規則は式のオペランドのグループと評価に影響します。演算子の優先順序が高くよりも優先順位の演算子がある場合にだけ有効です。優先順位の演算子を含む式が最初に評価されます。優先順位はバインドするときに「記述できます」。優先順位の演算子はハード バインディングのあると呼ばれます。

次の表はC の演算子の優先順位と結合規則 (オペランドが評価される順序) をまとめたものです。また高いものから低いものに優先順位の順に示します。一部の演算子を組み合わせて含める場合は同じ優先順位がありアセンブリの結合規則に従って評価されます。テーブルの演算子は 後置演算子 以降のセクションで説明します。このセクションの後半では優先順位と結合規則に関する一般情報を提供します。

C の演算子の優先順位と結合規則

Symbol1

操作の型

結合規則

[ ] ( ) .– > の 後置 ++ と後置 --

左から右

プレフィックス ++ とプレフィックス --  通常sizeof *  – ~ +!

単項式

右から左

型にキャストします

単項式

右から左

* / %

乗法

左から右

+ –

加法

左から右

<< >>

ビットごとの右

左から右

< > <= >=

関係

左から右

== !=

等価比較

左から右

&

ビットごとの AND

左から右

^

ビットごとの排他的 OR

左から右

|

ビットごとの含または

左から右

&&

論理 AND

左から右

||

論理 OR

左から右

?:

条件式

右から左

= *= /= %= 

+= – = <<= >>= =

^= |=

軽量で複合 assignment2

右から左

,

評価順序

左から右

1.演算子の優先順位は降順に一覧表示されます。一部の演算子が同じ行にまたはグループにある同じ優先順位があります。

2.すべての単純な剰余代入演算子と同じ優先順位があります。

式は同じ優先順位の一部の演算子を使用できます。一部のこのような演算子が式と同じレベルにある場合を評価して演算子の結合規則に従って右から左へと左から右に移動します。評価の方向が同じレベルで複数の乗算演算子 ()* 追加 +()またはバイナリ ビットごとの | ^() 演算子を含む式の結果には影響しません。操作の順序は言語によって定義されていません。コンパイラは一貫した結果を保証できる任意の順序でこのような式を評価できます。

評価順序 (**)**論理 AND ()論理 OR 演算子 (||)条件式だけ ( または。:)関数呼び出し演算子はシーケンス ポイントを構成してそのオペランドの評価の順序は保証されません。関数呼び出し演算子は関数の識別子の後にかっこの設定です。シーケンスの評価 演算子 () ではオペランドを左から右に評価することが保証されます。関数呼び出しのコンマ演算子が順次評価の演算子と同じではなくそのようことを保証しないことに注意してください)。詳細についてはシーケンス ポイント を参照してください。

論理演算子はそのオペランドの評価を左から右へとは限りません。ただし式の結果を確認するために必要なオペランドの最小の数値を評価します。これは「ショートサーキット」評価と呼ばれます。したがってある式のオペランドが評価されない場合があります。たとえば式は

x && y++

x が true の場合にのみ2 番目のオペランド y++ は評価されます (以外)。したがってy は x が false でインクリメントしません (0)。

次の一覧はコンパイラが自動的にいくつかのサンプル式をバインドする方法を示しています :

自動バインディング

a & b || c

(a & b) || c

a = b || c

a = (b || c)

q && r || s--

(q && r) || s––

最初の式にビットごとの AND 演算子 () では & より優先順位論理 OR 演算子 (||) ため a & b フォームを論理 OR 演算の 1 番目のオペランドがあります。

2 番目の論理 OR 演算子 () では || 単純な代入演算子 ()= より優先順位をグループ化 b || c ため代入の右側のオペランドとして格納されます。a に割り当てられた値が 0 または 1. であることに注意してください。

3 番目の式は予期しない結果が生じる可能性がある正しい形式の式を示します。()&& 論理 AND 演算子より優先順位論理 OR 演算子 ()|| ためグループ化 q && r をオペランドとして格納されます。論理演算子はオペランドの評価を左から右へとは限らないためq && r は s –– の前に評価されます。ただしq && r が以外の値に評価される場合s –– は評価されずs はカウントされません。s をデクリメントするとプログラムで問題が発生します s –– は式の 1 番目のオペランドとして表示されます s またはそのほかの操作でデクリメントする必要があります。

次の式は無効でありコンパイル時に診断メッセージが生成されます :

誤った式

既定のグループ

p == 0 ? p += 1: p += 2

( p == 0 ? p += 1 : p ) += 2

この式では等値演算子 () ではオペランドとして == 優先順位の最も高いためp == 0 をグループ化できます。条件式の演算子 () は次 ? : 最も高い優先順位があります。その 1 番目のオペランドは p == 0 で2 番目のオペランドは p += 1 です。ただし条件式の演算子の最後のオペランドは剰余代入演算子によりこの p の発生が条件式の演算子により近いにバインドするため p += 2 ではなく p と見なされます。構文エラーが += 2 に左のオペランドがないためです。この種類と読みやすいコードのエラーを防ぐためにかっこを使用する必要があります。たとえば前の例を修正しわかりやすくするために次に示すようにかっこを使用して :

( p == 0 ) ? ( p += 1 ) : ( p += 2 )

参照

関連項目

C の演算子