优先级:是表示运算符的优先程度,在没有括号的时候先算那个运算符。
结合性:在同等优先级的几个运算符的运算中,是从左到右运算还是从右到左运算。
在标准C语言的文档里,对操作符的结合性并没有作出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。1. C中有11级优先级;每一级优先级可能有多个运算符,但它们的结合性一样。结合性只有在同一优先级的运算中才有意义。
2. 这11级优先级分别为:(从高到低)
1) 圆括号() 方括号[] 箭头 -> 圆点 . 结合性:自左至右。
2) 单目运算符: 逻辑非! 按位反~ 自增++,自减-- 负- 正+ 类型转换 指向* 取地址& sizeof 结合性:自右至左
3) 算术:乘,除,取余, 结合性:自左至右
4) 算术:加,减, 结合性:自左至右
5) 位运算:<< >> 结合性:自左至右
6) 关系运算:>, >=,<,<=,= =,!= 结合性:自左至右
7) 按位:&,^, | , 结合性:自左至右
8) 逻辑:&&,||, 结合性:自左至右
9) 条件(三目运算符):?:, 结合性:自右至左
10) 赋值:=,+=,-=, *=,/=,>>=,<<=,&=,|=,^=, 结合性:自右至左
11) 顺序:逗号, 结合性:自左至右
3. 总体来讲:
1) 单目运算符优先级高于双目及三目运算符。
2) 顺序运算的优先级最低
3) 赋值运算符的优先级略高于顺序运算符
4) 逗号运算符的值是最右边操作数的值,逗号运算符结合性从左至右,因此又称为顺序求值运算符
5) 先函数,后运算。
6) 先算术,再位移,后关系,再按位逻辑,后逻辑,后赋值,最后顺序
7) 同级运算时,要看结合性。
8) x = f() + g() * h();乘法先于加法执行,但是g()和h()的调用可能以任何顺序出现。同样,f()可能在乘法之前调用,也可能在乘法之后调用
9) 优先级相同的操作符,它们的结合性也相同
10) 函数调用中,各个参数的计算顺序是不确定的
11) &&和||等,其操作数的计算顺序是确定的,它们使用短路原则(短路原则就是说如果在&&中一个为非,则整个结果为0,后面的运算就可以忽略不计了)