1 | 圆括号,下标,指向结构成员,结构成员 | 自左而右 | ||
2 | 逻辑非,按位取反,自增,自减,负号,类型转换,指针,取地址,长度 | 1 | 自右而左 | |
3 | 乘法,除法(整除),求余 | 2 | 自左而右 | |
4 | 加法,减法 | 2 | 自左而右 | |
5 | 左移,右移 | 2 | 自左而右 | |
6 | 关系 | 2 | 自左而右 | |
7 | 等于,不等于 | 2 | 自左而右 | |
8 | 按位与 | 2 | 自左而右 | |
9 | 按位异或 | 2 | 自左而右 | |
10 | 按位或 | 2 | 自左而右 | |
11 | 逻辑与 | 2 | 自左而右 | |
12 | 逻辑或 | 2 | 自左而右 | |
13 | 条件 | 3 | 自右而左 | |
14 | 赋值 | 2 | 自右而左 | |
15 | 逗号 | 自左而右 |
第二列本来应该列出运算符的,但因为笔者自己也是初学者,部分符号还未曾了解过,暂时不知道如何输入,所以先不展示出来。讲到对应运算符的时候,再把符号展示出来。
表格中优先级自上而下降低,相同优先级的符号根据结合方向来确定运算顺序。大多数运算符的结合方向是自左而右,例如加减法,所以在没有括号的情况下,加减混合运算按从左往右计算。注意少部分运算符是按从右往左运算的。
表达式
这里毕竟不是正规的科研或教学,所以不给严格定义。粗略讲,可以看成分号(;)前面的一大串就是一个表达式。或者再粗略一点,类似于数学整式或等式的形式的一块是表达式。
为什么这里非要讲表达式呢?因为每个表达式都有一个值,值由表达式的运算决定。一般对于只含加、减、乘、除、求余的表达式,表达式的值就是运算的结果。即使不使用“=”,“1+1”与“2”依然被视为等价的、一模一样的,printf("%d",2);与printf("%d",1+1);输出的结果是一样的。
那些含非数学运算的运算符的式子同样也有值,包括函数也有值(就是上一篇文章讲到的回归值),这些会在后面的文章中逐一讲,这里先知晓其存在。