C
C 语法

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)适当地声明的标识符(例如nprintf

3)通用选择

括号中的任何表达式也被分类为主要表达式:这保证括号的优先级高于任何运算符。

常量和文字

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

  • 整数常量是整数类型的十进制,八进制或十六进制数字。

未评估的表达式

sizeof 运算符的操作数,_Alignof 运算符和一般选择的控制表达式(自C11以来)是不被评估的表达式(除非它们是 VLA)(自C99以来)。因此,size_t n = sizeof(printf("%d", 4)不执行控制台输出。

参考

  • C11 standard (ISO/IEC 9899:2011):