目录
1、运算符的概念
什么叫运算符,运算赋就是进行计算,对比之类的符号。
运算对象可以是常量、变量、函数返回值
运算符分为单目运算符,双目运算符,三目运算符等
单目运算符:只需要一个运算对象的运算符为单目运算符。如:a++
双目运算符:需要两个运算对象的运算符为双目运算符。如:a+b
三目运算符:需要三个运算对象的运算符为三目运算符。如:a>b?c:d
2、算术运算符
算术运算符有:+、-、*、/、%、+=、-+、*=、/=、%=、=
2.1 +、-、* 运算符
+:加法
-:减法
*:乘法
2.2 / 运算符:取整运算符(或 除法)
2.2.1 运算对象为整数时,/ 代表取整的意思
2.2.2 运算符对象为实型时,/ 代表除法
2.3 % 运算符:取余运算符
%运算法一般用来判断是否能被整除,能被整除的数余数为0;
规律:n%2的余数范围:0~1
n%3的余数范围:0~2
n%4的余数范围:0~3
n%m的余数范围:0 ~ m-1
2.4 +=、-=、*=、/=、%= 运算符
2.5 = 赋值运算符
格式:变量名 = 值;
一般用来进行赋值操作的,将值放到变量名所代表的空间中
int data;
//赋值
data = 10;
注:在C语言中 等于 是 == ,而 赋值 是 = 。
3、关系运算符
关系运算符有:>、<、==、>=、<=、!=
>:大于
<:小于
==:等于
>=:大于等于
<=:小于等于
!=:不等于
注:关系运算符一般用于逻辑条件判断或者是循环语句条件判断
4、逻辑运算符
逻辑运算符有:&&、||、!
4.1 && 逻辑与
a | b | a && b |
真 | 真 | 真 |
真 | 假 | 假 |
假 | 真 | 假 |
假 | 假 | 假 |
注意:逻辑与的短路特性:a&&b 若a为真后,才执行b语句判断真假;若a为假,则a&&b就为假,不会执行b语句。
4.2 || 逻辑或
a | b | a || b |
真 | 真 | 真 |
真 | 假 | 真 |
假 | 真 | 真 |
假 | 假 | 假 |
注意:逻辑或的短路特性:a||b 若a为假后,才执行b语句判断真假;若a为真,则a||b就为真,不会执行b语句。
4.3 ! 逻辑非
!真 == 假 !假==真
在C语言中,只有0代表假,其他的都为真
例:!-10==0 !0==1 !1==0
5、位运算符
位运算符有:&、|、~、^、<<、>>
位运算符是用来计算二进制位的操作符。
5.1 & 按位与
规则:有0为0,全1为1
特点:和1与保持不变,和0与变为0
场景:将指定位清0
例:
0010 1100
1001 1010 &
--------------
0000 1000
5.2 | 按位或
规则:有1为1,全0为0
特点:和0或全为0,只要有1就为1
场景:将指定位清1
例:
0010 1100
1001 1010 |
--------------
1011 1110
5.3 ~ 按位取反
规则:1变0,0变1
1001 1010 ~
--------------
0110 0101
5.4 ^ 按位异或
规则:相同为0,不同为1
特点:和1异或取反,和0异或不变
场景:将至定位翻转
1100 0011
0000 1111 ^
---------------
1100 1100
5.5 位移运算符
5.5.1 << 左移运算符
向左边移动,右边补0,左边舍弃
注意:左移数必须小于等于自身位数
5.5.2 >> 右移运算符
向右边移动,右边舍弃,左边补0或1。
无符号数右移:右边舍弃,左边补0
有符号数右移:
正数:右边丢弃,左边补0(逻辑右移)
负数:右边丢弃,左边补1(算数右移)
问:什么时候是逻辑右移,什么时候是算数右移?
答:逻辑右移和算数右移是由编译器决定。
5.6 将指定位清0或置1(必看)
例1:定义unsigned char num;将num的第2,3位清0,其他位保持不变
num = num & 1111 0011
= num & ~(0000 1100)
= num & ~(0000 1000 | 0000 0100)
= num & ~(0000 0001 << 3 | 0000 0001<< 2)
= num & ~(0x01 << 3 | 0x01 << 2)
例2:定义unsigned char num;将num的第5,6位置1,其他位保持不变
num = num | 0110 0000
= num | (0100 0000 | 0010 0000)
= num | (0000 0001 << 6 | 0000 0001 << 5)
= num | (0x01 << 6 | 0x01 << 5)
例3: 定义unsigned char num,将num的第3 ,4位置1 ,7,8位清0,其他位保持不变
num = num | (0x01 << 2 | 0x01 << 4);//3,4位置1
num = num & ~ (0x01 << 7 | 0x01 << 8);//7,8位清0
6、三目运算符
格式: 表达式?值1:值2
含义:如果表达式为真,则执行值1;如果表达式为假,则执行值2
7、逗号运算符
格式:值1,值2,值3,值4
含义:先执行值1,然后执行值2,以此类推
注意:逗号运算符的优先级是最低的
8、自增自减运算符
自增自减运算符属于单目运算符。
格式:++ --
8.1 ++ --在变量后面
++ --在变量后面,表示先使用变量,后自增自减
8.2 ++ --在变量前面
++ --在变量前面,表示先自增自减,后使用变量
9、运算符的优先级
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | ----- |
() | 圆括号 | (表达式)/函数名(形参表) | ----- | ||
. | 成员选择(对象) | 对象.成员名 | ----- | ||
-> | 成员选择(指针) | 对象指针->成员名 | ----- | ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
(类型) | 强制类型转换 | (数据类型)表达式 | ----- | ||
++ | 前置自增运算符 | ++变量名 | 单目运算符 | ||
++ | 后置自增运算符 | 变量名++ | 单目运算符 | ||
-- | 前置自减运算符 | --变量名 | 单目运算符 | ||
-- | 后置自减运算符 | 变量名-- | |||
* | 取值运算符 | *指针变量 | 单目运算符 | ||
& | 取地址运算符 | &变量名 | 单目运算符 | ||
! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
sizeof | 长度运算符 | sizeof(表达式) | ----- | ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | 双目运算符 | ||
% | 余数(取模) | 整型表达式/整型表达式 | 双目运算符 | ||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 双目运算符 | ||
5 | << | 左移 | 变量 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 双目运算符 | ||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 双目运算符 | ||
< | 小于 | 表达式 | 双目运算符 | ||
<= | 小于等于 | 表达式 | 双目运算符 | ||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | 双目运算符 | ||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | ----- |
/= | 除后赋值 | 变量/=表达式 | ----- | ||
*= | 乘后赋值 | 变量*=表达式 | ----- | ||
%= | 取模后赋值 | 变量%=表达式 | ----- | ||
+= | 加后赋值 | 变量+=表达式 | ----- | ||
-= | 减后赋值 | 变量-=表达式 | ----- | ||
<<= | 左移后赋值 | 变量 | ----- | ||
>>= | 右移后赋值 | 变量>>=表达式 | ----- | ||
&= | 按位与后赋值 | 变量&=表达式 | ----- | ||
^= | 按位异或后赋值 | 变量^=表达式 | ----- | ||
|= | 按位或后赋值 | 变量|=表达式 | ----- | ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |
该表摘选自:运算符优先级_百度百科 (baidu.com)