命名空间
变体
操作

表达式

来自 cppreference.com
< c‎ | 语言

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

表达式求值可能会产生结果(例如,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 起)

[编辑] 转换

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

[编辑] 其他

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

[编辑] 基本表达式

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

基本表达式可以是以下任何一种

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

任何括号内的表达式也归类为基本表达式:这保证括号比任何运算符的优先级更高。

[编辑] 常量和字面量

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

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

[编辑] 未求值表达式

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

_Alignof 运算符的操作数,泛型选择的控制表达式以及作为 _Alignof 操作数的 VLA 的大小表达式也是不求值的表达式。

(自 C11 起)

[编辑] 参考文献

  • 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++ 文档 用于 表达式