大家在日常写代码或做编程题时往往被运算符的优先级所困。这里我们来系统的了解运算符常见的类型和优先级关系。希望对大家有所帮助。
优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [ ] | 数组下标 | 数组名[常量表达式] | 左到右 | -- |
( ) | 圆括号 | (表达式)/函数名(形参表) | -- | ||
. | 成员选择(对象) | 对象.成员名 | -- | ||
-> | 成员选择(指针) | 对象指针->成员名 | -- | ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
~ | 按位取反运算符 | ~表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | |||
-- | 自减运算符 | --变量名/变量名-- | |||
* | 取值运算符 | *指针变量 | |||
& | 取地址运算符 | &变量名 | |||
! | 逻辑非运算符 | !表达式 | |||
(类型) | 强制类型转换 | (数据类型)表达式 | -- | ||
sizeof | 长度运算符 | sizeof(表达式) | 单目运算符 | ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | |||
% | 余数(取模) | 整型表达式%整型表达式 | |||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | |||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | |||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | |||
< | 小于 | 表达式<表达式 | |||
<= | 小于等于 | 表达式<=表达式 | |||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | |||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ? : ; | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- |
/= | 除后赋值 | 变量/=表达式 | -- | ||
*= | 乘后赋值 | 变量*=表达式 | -- | ||
%= | 取模后赋值 | 变量%=表达式 | -- | ||
+= | 加后赋值 | 变量+=表达式 | -- | ||
-= | 减后赋值 | 变量-=表达式 | -- | ||
<<= | 左移后赋值 | 变量<<=表达式 | -- | ||
>>= | 右移后赋值 | 变量>>=表达式 | -- | ||
&= | 按位与后赋值 | 变量&=表达式 | -- | ||
^= | 按位异或后赋值 | 变量^=表达式 | -- | ||
|= | 按位或后赋值 | 变量|=表达式 | -- | ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | -- |
简单记忆:优先级 单目运算符>双目运算符>三目运算符>赋值运算符>逗号运算符
常见十大运算符
1、算数运算符
算数运算符用于数值计算。常见的算数运算符如下:
双目运算符:加(+) 减(-) 乘(*) 除(/) 取模(或称取余%)
单目运算符:自增(++) 自减(--) 负号(-)
下面这篇文章来详细区分前置++和后置++的区别
文章:区分a++ , ++a
2、关系运算符
关系运算符用于比较运算。常见的关系运算符如下:
大于(>) 小于(<) 等于(==) 大于等于(>=) 小于等于(<=) 不等于(!=) (这些都为双目运算符)
3、逻辑运算符
逻辑运算符用于逻辑运算。常见的逻辑运算符如下:
非(!) 与(&&) 或(||)
优先级为非>与>或 (简单记忆为not and or)
4、位操作运算符
位操作运算符参与运算的量,按二进制位进行运算。常见的位操作符如下:
1)、按位与运算符(&相乘)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
这里简单记忆为两数相乘
2)、按位或运算符(|相加)
参加运算的两个数据,按二进制进行“或”操作。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
这里简单记忆为两数相加,且取最后一位
3)、 按位非运算符(~取反)
计算机在计算负数时引入了补码的概念,而负数的补码就是其反码+1
估按位非操作就是操作数的负值-1,即~x=x*(-1)-1=-(x+1)。
运算规则:转二进制补码,取反(即0变1, 1变0)
下面就对原码、反码、补码做个简单的解释:
正数的原码、反码和补码一致都为原数值的二进制数
下面以3为例
3的原码:0000 0011(第一个是符号位,0表示+,1表示-)
计算机里面存的3的样子: 3的补码:0000 0011(由于3是正数,正数的原码补码反码都是一样的)
则~3在计算机中的形式为: ~3的补码:1111 1100(就是把3的补码所有位数全部取反)
~3的反码:1111 1011(补码=反码+1)
~3的原码:1000 0100(符号位为1,不变,其他位取反,即-4)
负数的原码、反码和补码:
原码即原来的数值的二进制数第一位一般代表符号位
反码即原码各个位数取反
补码即在反码的基础上+1
下面以-7为例了解原码、反码和补码
-7的原码:1000 0111(第一个是符号位,0表示+,1表示-)
-7的反码:1111 1000(由于-7是负数,反码需要取反)
计算机里面存的-7的样子:-7的补码:1111 1001(补码=反码+1)
则~-7在计算机中的形式为: ~-7的补码:0000 0110(把-7的补码所有位数全部取反)
~-7的原码:0000 0110(补码符号位为0,正数的原码=反码=补码,即6)
4)、按位异或运算符(^)
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
这里简单记忆为各个位数相加逢2变0,不进位
5)、左移运算符(<<)
规则:
1.将操作数先转换为二进制数(补码);
2.二进制数各位左移若干位(移动位数);
3.在低位补若干个0;
4.高位左移后溢出,舍弃不起作用;
例如:
7 << 2
7转换为二进制:0000 0111,每位向左移动两位变为:0001 1100,转换为十进制数为28。
6)、右移运算符 (>>)
规则:
1.将操作数先转换为二进制数(补码);
2.二进制数各位右移若干位(移动位数);
3.移出的低位舍弃,并在高位进行补位;
注意:关于补位的问题
1.操作数若为无符号数,则在左边补若干个0;
2.操作数若为有符号正数,则在左边补若干个0;
3.操作数若为有符号负数,左边补1为算术右移,左边补0为逻辑右移;
例如:
-7 >> 2
7转换为二进制补码:1111 1001,每位向右移动两位变为:1111 1110,转换为十进制数为-2.这里值得注意的一点,当-7右移位数超过3位时,结果都为1111 1111,转换为十进制一直都是-1;
5、赋值运算符
赋值运算符用于赋值运算。常见的赋值运算符如下:
简单赋值(=)
复合算术赋值(+=,-=,*=,/=,%=)
复合位运算赋值(&=,|=,^=,>>=,<<=)以上均为双目运算符
6、条件运算符
条件运算符这是一个三目运算符,用于条件求值( ? : )
条件运算符优先级高于赋值、逗号运算符,低于其他运算符
条件运算符的一般使用形式:
表达式1 ? 表达式2 : 表达式3
举如下例子:
max = a < b? b: a;
等效如下条件判断语句:
if (a<b)
max = b;
else
max = a;
7、逗号运算符
逗号运算符用于把若干表达式组合成一个表达式( , )
C 语言中,逗号(,)也可以是运算符,称为逗号运算符(Comma Operator)。逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式,称为逗号表达式。其一般形式为:
子表达式1, 子表达式2, …, 子表达式n
8、指针运算符
指针运算符用于取内容(*)和取地址(&)二种运算。
&:取地址运算符,它返回运算对象的内存地址。
*: 指针运算符,也称为“间接引用操作符”,它返回指针指的变量的值。
9、长度运算符
长度运算符用于计算数据类型所占的字节数(sizeof)。
sizeof是c语言的一种单目操作符,如c语言的其他操作符++、--等。并且它并不是一个函数,sizeof的操作符以字节的形式给出了操作数的储存大小(操作数可以是一个表达式或括号里的类型名)并其储存的大小有操作数的类型决定,和本身无关系。
⑴用于数据类型
sizeof的使用形式:sizeof(char)
注意数据类型必须用括号。
⑵用于变量
sizeof使用形式:sizeof(a)或者sizeof a都是正确的形式,但是大多的人都会带上括号。
sizeof的操作符不能用于函数类型,不完全类型。不完全类型是指具有未知储存大小的数据类型,如未知储存大小的数组类型、未知内容的结构或联合类void类型。
10、特殊运算符
特殊运算符有括号(),下标[],指向运算符(->)与 成员运算符(.)等几种。