命名空间
变体
操作

表达式

来自 cppreference.cn
< c‎ | language

表达式是运算符及其操作数的序列,用于指定一个计算。

表达式求值可能会产生结果(例如,2 + 2 的求值产生结果 4),可能会产生副作用(例如,printf("%d", 4) 的求值将字符 '4' 发送到标准输出流),并且可能会指定对象或函数。

目录

[编辑] 概述

  • 值类别(左值、非左值对象、函数指示符)按其值对表达式进行分类
  • 求值顺序指定了参数和子表达式获得中间结果的顺序

[编辑] 运算符

常见运算符
赋值 递增
递减
算术 逻辑 比较 成员
访问
其他

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
a ? b : c
sizeof


_Alignof
(C11 起)
(直至 C23)

alignof
(自 C23 起)

[编辑] 转换

  • 当操作数类型与运算符期望的类型不匹配时,会发生隐式转换
  • 强制类型转换可用于显式地将值从一种类型转换为另一种类型。

[编辑] 其他

  • 常量表达式可以在编译时求值,并在编译时上下文中使用(非变长数组(C99 起)数组大小、静态初始化器等)
  • 泛型选择可以根据参数的类型执行不同的表达式
(C11 起)
(C99 起)

[编辑] 主表达式

任何运算符的操作数可以是其他表达式,也可以是主表达式(例如,在 1 + 2 * 3 中,运算符 + 的操作数是子表达式 2 * 3 和主表达式 1)。

主表达式可以是以下任何一种:

1) 常量和字面量(例如 2"Hello, world"
2) 适当声明的标识符(例如 nprintf
(C11 起)

任何加括号的表达式也被归类为主表达式:这保证了括号比任何运算符具有更高的优先级。

[编辑] 常量与字面量

某些类型的常量值可以使用称为字面量(对于左值表达式)和常量(对于非左值表达式)的专门表达式嵌入 C 程序的源代码中

  • 整型常量是整型的十进制、八进制或十六进制数字。
  • 字符常量int 类型的单个字符,适用于转换为字符类型,或是 char8_t(C23 起) char16_tchar32_t(C11 起) wchar_t 类型。
  • 浮点常量floatdoublelong double 类型的值。
(自 C23 起)
  • 字符串字面量char[]char8_t[](C23 起)char16_t[]char32_t[](C11 起) wchar_t[] 类型的字符序列,表示以 null 结尾的字符串。
  • 复合字面量是直接嵌入程序代码的结构体、联合体或数组类型的值
(C99 起)

[编辑] 未求值表达式

sizeof 运算符的操作数是未求值的表达式(除非它们是变长数组)(C99 起)。因此,size_t n = sizeof(printf("%d", 4)); 不会执行控制台输出。

_Alignof(C23 前)alignof(C23 起) 运算符的操作数、泛型选择的控制表达式,以及作为 _Alignof(C23 前)alignof(C23 起) 操作数的可变长数组的大小表达式也是未求值的表达式。

(C11 起)

[编辑] 引用

  • C23 标准 (ISO/IEC 9899:2024)
  • 6.5 表达式 (p: 待定)
  • 6.6 常量表达式 (p: 待定)
  • C17 标准 (ISO/IEC 9899:2018)
  • 6.5 表达式 (p: 55-75)
  • 6.6 常量表达式 (p: 76-77)
  • C11 标准 (ISO/IEC 9899:2011)
  • 6.5 表达式 (p: 76-105)
  • 6.6 常量表达式 (p: 106-107)
  • C99 标准 (ISO/IEC 9899:1999)
  • 6.5 表达式 (p: 67-94)
  • 6.6 常量表达式 (p: 95-96)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 3.3 表达式
  • 3.4 常量表达式

[编辑] 参阅

C++ 文档关于表达式