1、操作符的分类
算数操作符 | +、-、*、/、% |
移位操作符 | <<、>> |
位操作符 | &、|、^ |
赋值操作符 | =、+=、 -= 、*=、 /=、 %= 、>>= 、<<= 、&=、 |=、 ^= |
单目操作符 | ! 、- 、+ 、&、sizeof 、~、-- 、++ 、* 、(类型) |
关系操作符 | >、 >=、 < 、<=、 != 、== |
逻辑操作符 | &&、|| |
条件操作符 | exp1 ? exp2 : exp3 |
逗号表达式 | , |
下标引用、函数调用和结构成员 |
[ ]、( )、. 、-> |
1.1操作符的优先级
优先级 |
运算符 |
名称或含义 |
使用形式 |
结合方向 |
说明 |
1 |
[] |
数组下标 |
数组名[常量表达式] |
左到右 |
-- |
() |
圆括号 |
(表达式)/函数名(形参表) |
-- |
||
. |
成员选择(对象) |
对象.成员名 |
-- |
||
-> |
成员选择(指针) |
对象指针->成员名 |
-- |
||
|
|||||
2 |
- |
负号运算符 |
-表达式 |
右到左 |
|
~ |
按位取反运算符 |
~表达式 |
|||
++ |
自增运算符 |
++变量名/变量名++ |
|||
-- |
自减运算符 |
--变量名/变量名-- |
|||
* |
取值运算符 |
*指针变量 |
|||
& |
取地址运算符 |
&变量名 |
|||
! |
逻辑非运算符 |
!表达式 |
|||
(类型) |
强制类型转换 |
(数据类型)表达式 |
-- |
||
sizeof |
长度运算符 |
sizeof(表达式) |
-- |
||
|
|||||
3 |
/ |
除 |
表达式/表达式 |
左到右 |
双目运算符 |
* |
乘 |
表达式*表达式 |
|||
% |
余数(取模) |
整型表达式%整型表达式 |
|||
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
- |
减 |
表达式-表达式 |
|||
5 |
<< |
左移 |
变量<<表达式 |
左到右 |
双目运算符 |
>> |
右移 |
变量>>表达式 |
|||
|
|||||
6 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
>= |
大于等于 |
表达式>=表达式 |
|||
< |
小于 |
表达式<表达式 |
|||
<= |
小于等于 |
表达式<=表达式 |
|||
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
!= |
不等于 |
表达式!= 表达式 |
|||
|
|||||
8 |
& |
按位与 |
表达式&表达式 |
左到右 |
双目运算符 |
9 |
^ |
按位异或 |
表达式^表达式 |
左到右 |
双目运算符 |
10 |
| |
按位或 |
表达式|表达式 |
左到右 |
双目运算符 |
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目运算符 |
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目运算符 |
|
|||||
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
右到左 |
三目运算符 |
|
|||||
14 |
= |
赋值运算符 |
变量=表达式 |
右到左 |
-- |
/= |
除后赋值 |
变量/=表达式 |
-- |
||
*= |
乘后赋值 |
变量*=表达式 |
-- |
||
%= |
取模后赋值 |
变量%=表达式 |
-- |
||
+= |
加后赋值 |
变量+=表达式 |
-- |
||
-= |
减后赋值 |
变量-=表达式 |
-- |
||
<<= |
左移后赋值 |
变量<<=表达式 |
-- |
||
>>= |
右移后赋值 |
变量>>=表达式 |
-- |
||
&= |
按位与后赋值 |
变量&=表达式 |
-- |
||
^= |
按位异或后赋值 |
变量^=表达式 |
-- |
||
|= |
按位或后赋值 |
变量|=表达式 |
-- |
||
|
|||||
15 |
, |
逗号运算符 |
表达式,表达式,… |
左到右 |
-- |
2、算数操作符
+、-、*、/、%
+ 操作符将两个数相加
- 操作符将两个数相减
* 操作符将两个数相乘
/ 除法可分为:1、整数除法(除法两端都是整数) 2、浮点数除法(除号两端只要有一个是小数就执行小数除法)
int a = 5/2;
整数除法的结果也为整数,会自动舍弃小数点后的数字,上述代码运行的结果为:a=2;
double a = 5 / 2.0;
浮点数除法的结果可保留小数,上述代码运行结果为:a=2.500000
& 操作符两个操作数必须是整数,当c=a%b时,意思为,c为a除以b的余数
取模操作符的引用:可用除10与模10取出10进制数的每一位
3、移位操作符
这里我们需要明确的是位移操作符移动的是二进制,而我们生活中的一般用的是10进制
我们先来看一下什么是10进制,如下123,1代表的是1*10^2,2代表的是2*10^1;3代表的是3*10^0
二进制同理,比如我们看一下int a =15的二进制为:1111,分别代表的是:1*2^3+1*2^2+1*2^1+1*2^0
整数的二进制的表示形式有三种:原码;反码;补码
这里值得注意的是:正整数的原码、反码、补码是相同的;负整数的原码、反码、补码是需要计算的
我们这里用的是整型,而一个整形有4个字节=32bit位,所以二进制表示应为32位,第一位为符号位,1表示负数,0表示正数,中间用0补齐就好,正整数的原码、反码、补码表示如下
1. int a = 15; 2. //00000000000000000000000000001111 - 原码 3. //00000000000000000000000000001111 - 反码 4. //00000000000000000000000000001111 - 补码
负整数的原码、反码、补码是需要计算的,计算方法和原码、反码、补码表示如下
1. int b = -15; 2. //10000000000000000000000000001111 - 原码 3. //11111111111111111111111111110000 - 反码(原码的符号位不变,其他位按位取反得到的就是反码) 4. //11111111111111111111111111110001 - 补码(反码+1就是补码)
我们还需要明确的是整数在内存中存储的是补码,计算的时候也是使用补码计算的
3.1、左移操作符
移位移动的二进制序列,左移操作符 - 左边丢弃,右边补0,这里我们以int a =15;为例
3.2、右移操作符
右移我们这儿分为:
算数右移(右边丢弃,左边补齐原来符号位);逻辑右移(右边丢弃,左边直接补0)