Expressions
表达式
表达式是一系列运算符及其操作数,用于指定计算。
表达式评估可能会产生一个结果(例如,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). |
- 运算符优先级定义了运算符绑定到它们的参数的顺序
转换
- 隐式转换发生在操作数的类型与操作符的期望不匹配时
Other
- 可以在编译时计算常量表达式并在编译时上下文中使用(非 VLA 数组大小,静态初始化器等)
主要表达式
任何操作符的操作数可能是其他表达式,或者它们可能是主要表达式(例如,在1+2*3
,操作符的操作数是子表达式2*3
和主表达式1
)。
主要表达式有以下几种:
1)常量和文字(例如2
或"Hello, world"
)
2)适当地声明的标识符(例如n
或printf
)
3)通用选择
括号中的任何表达式也被分类为主要表达式:这保证括号的优先级高于任何运算符。
常量和文字
某些类型的常量值可以使用称为文字(用于左值表达式)和常量(用于非左值表达式)的专用表达式嵌入C程序的源代码中。
- 整数常量是整数类型的十进制,八进制或十六进制数字。
未评估的表达式
sizeof 运算符的操作数,_Alignof 运算符和一般选择的控制表达式(自C11以来)是不被评估的表达式(除非它们是 VLA)(自C99以来)。因此,size_t
n =
sizeof(printf("%d", 4)不执
行控制台输出。
参考
- C11 standard (ISO/IEC 9899:2011):