一个表达式可以包含多个运算符。在这种情况下,运算符的优先级决定表达式的哪部分被处理为每个运算符的操作数。例如,按照运算规则,表达式中 *、/、以及 % 的优先级比 + 和 – 高。如下列表达式:

a - b * c相当于 a-(b*c)。如果想让操作数以不同的方式组合在一起,则必须使用括号:

(a - b) * c如果一个表达式中的两个操作数具有相同的优先级,那么它们的结合律(associativity)决定它们的组合方式是从左到右或是从右到左。例如,算术运算符和操作数的组合方式是从左到右,赋值运算符则是从右到左,如表 1 所示。

表达式结合律组合方式
a/b%c从左到右(a/b)%c
a=b=c从右到左a=(b=c)

表 2 列出优先级次序下,所有 C 语言运算符的优先级和结合律。

优先级运算符结合律
1后缀运算符:[]    ()    ·    ->    ++(后缀)– (类型名称){列表}从左到右
2一元运算符:++(前缀)    —    !    ~    +    –    *    &    sizeof_Alignof从右到左
3类型转换运算符:(类型名称)从右到左
4乘除法运算符:*    /    %从左到右
5加减法运算符:+    –从左到右
6移位运算符:<<    >>从左到右
7关系运算符:<<=    >>=从左到右
8相等运算符:==    !=从左到右
9位运算符 AND:&从左到右
10位运算符 XOR:^从左到右
11位运算符 OR:|从左到右
12逻辑运算符 AND:&&从左到右
13逻辑运算符 OR:||从左到右
14条件运算符:?:从右到左
15赋值运算符:
     =         +=        -=       *=       /=      %=       &=       ^=      |=   
   <<=      >>=
从右到左
16逗号运算符:,从左到右

表 2 中优先级最高的运算符中的最后一个(类型名称){列表} 是 C99 新增加的。

一些运算符记号在表 2 中出现了两次。例如,自增运算符 ++ 和自减运算符 –,在作后缀运算符(如表达式 x++)时,较其用作前缀运算符(如表达式 ++x)时,具有较高的优先级。

+、-、* 和 & 运算符记号不但可以当作一元运算符(unary operator,只需要一个操作数),也可以当作二元运算符(binary operator,需要两个操作数)。例如,* 只有一个操作数的时候,就是间接运算符(indirection operator),而有两个操作数的时候,就是乘号。

在这些例子中,一元运算符比二元运算符具有更高的优先级。例如,表达式 *ptrl**ptr2 等同于表达式(*ptrl)*(*ptr2)。

(转自http://c.biancheng.net/view/285.html)