C语言:C运算符优先级
元素单目乘除余,
加减移位大小等,
位与异或逻与或,
条件赋值组合逗。
元素: () [] -> .
单目: ! ~ ++ -- (type)类型转换 * & sizeof
乘除余:* / %
加减: + -
移位: << >>
大小: < <= > >=
等: == !=
位与: &
位异或:^
位非: |
逻与: &&
逻或: ||
条件: ?:
赋值: =
组合: += /= -= *=
逗: ,
★单目运算符、赋值是“自右向左”,所以*p++会被解释成*(p++),而不是(*p)++。
其他运算符结合性都是“自左向右”,所以a,b,c等价于 (a,b),c 而不是a,(b,c)。
★单目运算符低于元素运算符,所以定义一个函数指针p,要写成 (*p)(),如果写成*p(),会被解释成*((p))。
★类型转换也是单目运算符,优先级与其他单目一致,注意单目是“自右向左”结合的。
★与或异或并不同级:与>(异或)>或。
★赋值运算符不能保证任何求值顺序,所以 y[i]=x[i++] 是不可预测的,y[i]中的i可能是自增后的,也可能是自增前的。同理 y[i++]=x[i]也是不可预测的