C言語/演算子と式

演算子とは演算の内容を指示する記号です。 式とは定数、変数、関数の返却値などを演算子を使って結合したものです。
演算子には優先順位があります。 次の表の優先順位は、その演算子の優先順位を表しています。 演算子は優先順位が高いものから評価されます。 例えば「1+2*3」の場合は、「4.加減演算子」より「3.乗除演算子」の方が優先順位が高いので、「3.乗除演算子」が先に評価され、値は「7」となります。
演算子には結合規則(結合性)があります。 次の表の結合規則は、「→(左から右、左結合)」と「←(右から左、右結合)」とで結合の方向を表しています。 演算子の優先順位が同じ優先順位の場合は、結合規則の方向に演算が行われます。 例えば「a=b=1」の場合は、「14.代入演算子」は「←(右から左、右結合)」なので「b=1」が先に行われ、aとbの値はともに「1」となります。
数学と同様に()で囲むことにより優先させることができます。
オペランドとは、演算子が操作を行う対象のことであり、 定数、変数、関数の返却値、及びオペランドと演算子の組み合わせなどがオペランドとなりえます。
オペランドのデーター型は、より大きなオペランドのデーター型に変換されます(暗黙の型変換)。
算術演算子とは加減乗除などの算術的な計算を行う演算子です。 算術演算子には、加法を指示する+、減法を指示する-、 乗法を指示する*、除法を指示する/および剰余を指示する%があり、 また、-は符号の反転を指示するためにも用いられる。 代入演算子とは代入を指示する演算子です。 代入演算子には右辺の値を左辺が指す変数へそのまま代入するように指示する=があります。
比較演算子とは、左辺と右辺の比較を指示する演算子です。 比較演算子は左辺が右辺と比較して、 「<(より小さい)」、「>(より大きい)」「<=(以下)」「>=(以上)」 「==(等しい)」「!=(等しくない)」の場合は真(1)を、 それ以外の場合は偽(0)を、値として返す。
C99で、true や false など論理値定数とのbool(論理型)が追加されました。
論理演算子とは、論理値の計算を指示する演算子です。 論理演算子には否定を指示する!、 論理積を指示する&&、 論理和を指示する||があります。
否定とは論理値の真と偽を入れ替えることを表す。 論理積とは左右両方の論理値がともに真であるときのみ真(1)を、それ以外は偽(0)を値として返す。 論理和とは左右両方の論理値のうちいずれか一方でも真であるとき真(1)を、それ以外は偽(0)を値として返す。
&&演算子と||演算子とは、短絡評価を行う。 短絡評価とは、第1オペランドの値でその式の値が決まるとき、第2オペランドを評価しないことです。 &&演算子は第1オペランドの値が偽(0)の時、第2オペランドを評価しません。 ||演算子は第1オペランドの値が真(0以外)の時、第2オペランドを評価しません。 短絡評価は、第2オペランドに副作用を伴う式を指定したとき、特に注意が必要です。 つまり、第2オペランドに関数呼び出しの式を指定して、短絡評価が行われた時、 その関数呼び出しは実行されません。
C言語には、排他的論理和の論理演算子は定義されていません。 しかし、排他的論理和は、否定・論理積・論理和を用いて次のように記述できます。
排他的論理和とは、2つの論理値のいずれかただ1つのみが真であるとき真(1)を、それ以外は偽(0)を値として返す。
増分及び減分演算子とは、変数の値に1を加えたり、1を引いたりすることを指示する演算子です。 増分及び減分演算子には、それぞれ後置演算子と前置演算子とがあります。 後置演算子は変数の値を返した後に、増減を行う。 前置演算子は変数の値を返す前に、増減を行う。
増分及び減分演算子を単独で用いた場合、後置と前置との結果に違いはありません。
ただし、増分及び減分演算子を代入演算子とともに用いた場合、後置と前置との結果に違いがあります。
ISO/IEC 9899:2017§6.5.2.5 Compound literals
括弧で囲まれた型名の後に、ブレースで囲まれた初期化子並び( initializer lists )を続けた後置式( postfix expression)は、複合リテラル(ふくごう- 、Compound literals)です。
複合リテラルは、初期化子並びで与えられる値を持つ名前のないオブジェクトを与えます。 型名が未知のサイズの配列を指定している場合、そのサイズは初期化子並びによって決定され、複合リテラルの型は完成した配列の型になります。それ以外の場合(型名がオブジェクト型を指定している場合)は,型名で指定された型が複合リテラルの型となります。いずれの場合も結果は左辺値です。 複合リテラルの値は、初期化子並びで初期化された無名のオブジェクトの値です。複合リテラルが関数本体の外にある場合、そのオブジェクトは静的な保存期間を持ちますが、そうでない場合は、囲んでいるブロックに関連付けられた自動保存期間を持ちます。 初期化子並びに関するすべての意味的規則は、複合リテラルにも適用されます。 文字列リテラル、およびconst修飾された型を持つ複合リテラルは、異なるオブジェクトを指定する必要はありません。
関数の引数に定数として構造体を渡したいとき、変数を宣言して値を代入し、それを渡す必要があります。
sizeof演算子とは、オペランドの大きさ(バイト数: 型は size_t)を返す演算子です。
sizeof演算子はオペランドの大きさをバイト数で返す。
_Alignof演算子とは、オペランドのアラインメント要件(バイト数: 型は size_t)を返す演算子です。
_Alignof演算子はオペランドのアラインメント要件をバイト数で返す。 _Alignof演算子のオペランドには(sizeof演算子と異なり)式を指定できません。 <stdalign.h>ヘッダファイルが標準に追加された。
実行例(環境: Intel Xeon Processor (Cascadelake) 上の FreeBSD 13.0-STABLE #0 stable/13-6e405dd9e x clang version 11.0.1/llvmorg-11.0.1-0-g43ff75f2c3fe)
キャスト演算子とは、式の値を指定された型に型変換した値を返す演算子です。
型キャストとは、式の値を指定されたデーター型に変換します(明示的な型変換)。
各オペランドは整数型をもたなければなりません。 <<演算子の結果は、左オペランドを右オペランド分左にシフトした値です。 >>演算子の結果は、左オペランドを右オペランド分右にシフトした値です。
~演算子は右オペランドの各ビットを0なら1へ1なら0へ反転します。 右オペランドは整数型をもたなければなりません。 2項&演算子の結果は、オペランドのビット単位の論理積です。 つまり、対応するビットが両方ともセットされている場合ビットをセットし、それ以外の場合ビットをセットしません。 各オペランドの型は、整数型でなければなりません。 ^演算子の結果は、オペランドのビット単位の排他的論理和です。 つまり、対応するビットのいずれか一方だけがセットされている場合ビットをセットし、それ以外の場合ビットをセットしません。 各オペランドの型は、整数型でなければなりません。 |演算子の結果は、オペランドのビット単位の論理和です。 つまり、対応するビットの少なくとも一方がセットされている場合ビットをセットし、それ以外の場合ビットをセットしません。 各オペランドの型は、整数型でなければなりません。
条件演算子は、式1が0と比較して等しい場合式2を評価し、等しくない場合式3を評価します。 式2または式3の値を結果とします。
次のようなif文は、条件演算子を用いて、次のように書き換えることができます。
↓
形式E1 op= E2の複合代入は、 左辺値E1がただ一回だけ評価される点を除いて、 単純代入式E1 = E1 op (E2)と同じとします。
次のような代入文は、複合代入を用いて、次のように書き換えることができます。
コンマ演算子は、左オペランドをボイド式として評価し、次に右オペランドを評価しそれを結果として返す。
N2176 C17 ballot ISO/IEC 9899:2017 § Annex A (informative) Language syntax summary から、§6.5 Expressions:式に関連した部分を抜粋しました。 トークンはリンクになっています。