Operator
算术操作符
+加法,一元正号-减法,取负*乘法,解引用/除法%取余++自增--自减==等于!=不等于<小于>大于<=小于等于>=大于等于&&逻辑与||逻辑或!逻辑非&位与,取地址|位或^位异或~位取反<<左移>>右移=赋值+=加后赋值-=减后赋值*=乘后赋值/=除后赋值%=取余后赋值&=位与后赋值|=位或后赋值^=位异或后赋值<<=左移位后赋值>>=右移位后赋值?:条件操作符,逗号操作符->结构体.结构体成员(expr)分组运算符,改变优先级func()函数调用运算符(type)expr类型转换运算符[]数组下标sizeof返回类型或对象的字节大小_Alignof返回类型对齐要求_GenericC11特性,类型泛化typecast强制类型转换
| 优先级 | 操作符 | 结合性 |
|---|---|---|
| 1 | (), [], ->, . | > |
| 2 | ++, --, +, -, !, ~, (type), *, &, sizeof | < |
| 3 | *, /, % | > |
| 4 | +, - | > |
| 5 | <<, >> | > |
| 6 | <, <=, >, >= | > |
| 7 | ==, != | > |
| 8 | & | > |
| 9 | ^ | > |
| 10 | | | > |
| 11 | && | > |
| 12 | || | > |
| 13 | ?: | < |
| 14 | =, +=, -=, *=, /=, %=, &=, !=, ^=, <<=, >>= | < |
| 15 | , | > |
优先级(Precedence)与 结合性(Associativity)
优先级决定了哪些运算先执行。优先级高的运算先于优先级低的运算
结合性决定了相同优先级的运算符如何分组
两种结合性
1.左结合(从左到右):大多数运算符 2.右结合(从右到左):赋值、单目、三元条件运算符
示例
// 左结合
int a = 10 - 5 - 2;
// 右结合
int x, y, z;
x = y = z = 5;
()
求值顺序
语法树结构
序列点
a += ++a;
- 赋值表达式本身有值
- 前自增与后自增的返回时机不同