C语言运算符优先级和结合性
优先级 | 运算符 | 含义 | 使用形式 | 结合性 | 操作数 |
---|---|---|---|---|---|
1 | [ ] | 数组下标 | 数组名[整型表达式] | 左结合性 | |
( ) | 圆括号 | (表达式) | |||
. | 成员选择(对象) | 对象.成员名 | |||
-> | 成员选择(指针) | 对象指针->成员名 | |||
++ | 后缀自增运算符 | 变量名++ | 单目运算符 | ||
-- | 后缀自减运算符 | 变量名-- | 单目运算符 | ||
2 | - | 负号运算符 | -表达式 | 右结合性 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | 单目运算符 | ||
++ | 前缀自增运算符 | ++变量名 | 单目运算符 | ||
-- | 前缀自减运算符 | --变量名 | 单目运算符 | ||
* | 取值运算符 | *指针表达式 | 单目运算符 | ||
& | 取地址运算符 | &左值表达式 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof 表达式 或 sizeof(类型) | 单目运算符 | ||
3 | / | 除法运算符 | 表达式/表达式 | 左结合性 | 双目运算符 |
* | 乘法运算符 | 表达式*表达式 | 双目运算符 | ||
% | 求余运算符 | 整型表达式%整型表达式 | 双目运算符 | ||
4 | + | 加法运算符 | 表达式+表达式 | 左结合性 | 双目运算符 |
- | 减法运算符 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移运算符 | 表达式<<表达式 | 左结合性 | 双目运算符 |
>> | 右移运算符 | 表达式>>表达式 | 双目运算符 | ||
6 | > | 大于运算符 | 表达式>表达式 | 左结合性 | 双目运算符 |
>= | 大于等于运算符 | 表达式>=表达式 | 双目运算符 | ||
< | 小于运算符 | 表达式<表达式 | 双目运算符 | ||
<= | 小于等于运算符 | 表达式<=表达式 | 双目运算符 | ||
7 | == | 等于运算符 | 表达式==表达式 | 左结合性 | 双目运算符 |
!= | 不等于运算符 | 表达式!=表达式 | 双目运算符 | ||
8 | & | 按位与运算符 | 整型表达式&整型表达式 | 左结合性 | 双目运算符 |
9 | ^ | 按位异或运算符 | 整型表达式^整型表达式 | 左结合性 | 双目运算符 |
10 | | | 按位或运算符 | 整型表达式|整型表达式 | 左结合性 | 双目运算符 |
11 | && | 逻辑与运算符 | 表达式&&表达式 | 左结合性 | 双目运算符 |
12 | || | 逻辑或运算符 | 表达式||表达式 | 左结合性 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1?表达式2:表达式3 | 右结合性 | 三目运算符 |
14 | = | 赋值运算符 | 变量 = 表达式 | 右结合性 | 双目运算符 |
/= | 除后赋值运算符 | 变量 /=表达式 | 双目运算符 | ||
*= | 乘后赋值运算符 | 变量 *=表达式 | 双目运算符 | ||
%= | 取模后赋值运算符 | 变量%=表达式 | 双目运算符 | ||
+= | 加后赋值运算符 | 变量+=表达式 | 双目运算符 | ||
-= | 减后赋值运算符 | 变量-=表达式 | 双目运算符 | ||
<<= | 左移后赋值运算符 | 变量<<=表达式 | 双目运算符 | ||
>>= | 右移后赋值运算符 | 变量>>=表达式 | 双目运算符 | ||
&= | 按位与后赋值运算符 | 变量&=表达式 | 双目运算符 | ||
^= | 按位异或后赋值运算符 | 变量^=表达式 | 双目运算符 | ||
|= | 按位或后赋值运算符 | 变量|=表达式 | 双目运算符 | ||
15 | , | 逗号运算符 | 表达式,表达式,表达式,... | 左结合性 |
运算符
在一个表达式中可能包含多个有不同运算符连接起来的或具有不同数据类型的数据对象,表达式有多种运算,不同的结合顺序可能得出不同结果或者出现运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结合,才能保证运算的合理性和结果的正确性和唯一性。
每种同类型的运算符都有内部的运算符优先级,不同类型的运算符之间也有相应的优先级顺序。一个表达式中既可以包括相同类型的运算符,也可以包括不同类型的运算符或者函数。当多种运算符出现在同一个表达式中时,应该先按照不同类型运算符间的优先级进行运算。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。括号内的运算总是最优先计算。
优先级
优先级与求值顺序无关。优先级高低从上到下依次递减,表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。
结合性
当一个运算对象两侧的运算符优先级别相同时,则按运算符的结合性来确定表达式的运算顺序。大多数运算符结合方向是左结合性,只有三类运算符的结合方向是右结合性,即:单目运算符、条件运算符、赋值运算符。结合性是针对两个相邻的优先级相同的运算符而言,而不是表达中的运算对象,运算符是决定左右的基准点,先以前面的运算符构造运算,就是左结合性,反之,就是右结合性 。
操作数
运算符是一种特殊的函数,它们具有一个或多个操作数并返回相应的值。运算符可以是一目、二目或三目的,有多少目就代表有多少个操作数。只有一个运算符的操作数是三目运算符,即:条件运算符。