名前空間
変種

提供: cppreference.com

式は計算内容を指定する演算子とその被演算子の並びです。

式は結果を生成したり (例えば 2+2 を評価すると結果 4 が生成されます)、副作用を生成したり (例えば x++ は変数 x の値を1増やします)、オブジェクトや関数を指定したりします。

一般

  • 値カテゴリ (左辺値、左辺値でないオブジェクト、関数指定子) はその値によって式を分類します
  • 引数や部分式の評価順序は中間結果が取得される順序を規定します

演算子

一般的な演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバアクセス その他

a = b a += b a -= b a *= b a /= b a %= b a &= b a |= b a ^= b a <<= b a >>= b

++a --a a++ a--

+a -a a + b a - b a * b a / b a % b ~a a & b a | b a ^ b a << b a >> b

!a a && b a || b

a == b a != b a < b a > b a <= b a >= b

a[b] *a &a a->b a.b

a(...) a, b (type) a ? : sizeof _Alignof (C11以上)

変換

  • 暗黙の変換は被演算子の型が演算子の期待と異なる場合に行われます
  • キャストは値をある型から別の型に明示的に変換するときに使うことができます

その他

  • 定数式はコンパイル時に評価可能でコンパイル時の文脈で使われます (VLAでない配列のサイズ、静的初期化など)
  • 総称選択を使うと引数の型に応じて異なる式を実行できます
  • 浮動小数点式は math_errhandling で指定されるように例外を発生したりエラーを報告する場合があります
  • 標準の #pragma である FENV_ACCESS, FP_CONTRACT, CX_LIMITED_RANGE および浮動小数点の評価精度丸め方向によって浮動小数点式の実行方法が制御されます。

一次式

任意の演算子の被演算子は他の式または一次式です (例えば 1+2*3 の場合、+演算子の被演算子は一次式 1 と部分式 2*3 です)。

一次式は以下のいずれかです。

1) 定数およびリテラル (例: 2, "Hello, world")
2) 適切に宣言された識別子 (例: n, printf)

括弧で囲まれた任意の式もまた一次式に分類されます。 これにより括弧が他のいかなる演算子よりも高い優先順位を持つことが保証されます。

定数とリテラル

一部の型の定数値はリテラル (左辺値の式の場合) や定数 (左辺値でない式の場合) と呼ばれる特別な式を使って C のプログラムのソースコード中に埋め込むことができます。

  • 整数定数は整数型の10進数、8進数または16進数の数値です
  • 文字定数は文字型、char16_t 型、char32_t (C11以上)または wchar_t 型に変換するのに適した int 型の個々の文字です
  • 浮動小数点定数float, double または long double 型の値です
  • 文字列リテラルはヌル終端文字列を表す char[] 型、char16_t[] 型、char32_t[] (C11以上) または wchar_t[] 型の文字の並びです
  • 複合リテラルはプログラムコードに埋め込まれた構造体、共用体または配列型の値です

未評価式

sizeof 演算子の被演算子_Alignof 演算子の被演算子および総称選択の制御式 (C11以上)は評価されない式です(VLAの場合を除きます) (C99以上)。 例えば、size_t n = sizeof(printf("%d", 4)); はコンソール出力を行いません。

参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 6.5 Expressions (p: 76-105)
  • 6.6 Constant expressions (p: 106-107)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.5 Expressions (p: 67-94)
  • 6.6 Constant expressions (p: 95-96)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.3 EXPRESSIONS
  • 3.4 CONSTANT EXPRESSIONS

関連項目