©
This document uses PHP Chinese website manual Release
表达式是一系列运算符及其操作数,用于指定计算。
表达式评估可能会产生一个结果(例如,2+2
产生结果的评估4
),可能会产生副作用(例如,printf("%d",4)
将字符发送'4'
到标准输出流的评估),并可能指定对象或函数。
值类别(左值,非左值对象,函数指示符)通过它们的值对表达式进行分类
参数和子表达式的评估顺序指定了获得中间结果的顺序
| Common operators |
|:----|
| assignment | incrementdecrement | arithmetic | logical | comparison | memberaccess | other |
| 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. | ab *a &a a->b a.b. | a(...) a, b (type) a ? : sizeof _Alignof (since C11). |
运算符优先级定义了运算符绑定到它们的参数的顺序
备选表述是一些运营商的备选拼写
隐式转换发生在操作数的类型与操作符的期望不匹配时
强制转换可用于将值从一种类型显式转换为另一种类型。
可以在编译时计算常量表达式并在编译时上下文中使用(非 VLA 数组大小,静态初始化器等)
通用选择可以根据参数的类型执行不同的表达式
浮点表达式可能会引发异常并报告 math_errhandling 中指定的错误
标准编译指示FENV_ACCESS
,FP_CONTRACT
和CX_LIMITED_RANGE
以及浮点评价精度和舍入方向控制浮点表达式的执行方式。
任何操作符的操作数可能是其他表达式,或者它们可能是主要表达式(例如,在1+2*3
,操作符的操作数是子表达式2*3
和主表达式1
)。
主要表达式有以下几种:
1)常量和文字(例如2
或"Hello, world"
)
2)适当地声明的标识符(例如n
或printf
)
3)通用选择
括号中的任何表达式也被分类为主要表达式:这保证括号的优先级高于任何运算符。
某些类型的常量值可以使用称为文字(用于左值表达式)和常量(用于非左值表达式)的专用表达式嵌入C程序的源代码中。
整数常量是整数类型的十进制,八进制或十六进制数字。
字符常数是int类型的单个字符适于转换为字符类型或类型char16_t
,char32_t
(因为C11)或wchar_t
浮动常数类型的值float
,double
或long double
字符串文字的类型的字符序列char[]
,char16_t[]
,char32_t[]
,或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