文章目录
C语言 运算符
一、概念
1.1运算符
具有一定的运算规则的符号,对数据的一种操作 2+3- 3*5= 5
1.2操作数
运算符要操作的数据就是操作数
1.3表达式
运算符跟操作数组合的式子就叫做表达式
1.3优先级
不同运算符组合在一起使用的时候,对数据的先后处理顺序
1.4结合性
在同一个优先级的情况下,对数据处理的先后顺序
二、运算符的分类
2.1赋值运算符
赋值运算符符号:=
a=b;
原理: 将右边的数据赋给左边的变量(左边必须是变量)
注意: 数据在做赋值运算的时候,要注意数据类型是一样的
如果两边的数据类型不一样,此时就会发生数据类型的转换
优先级 : 比逗号运算符的优先级高
结合性 :从右到左
2.2算数运算符
算数运算符符号: + - * / %(求余/取模)
除法 /
a) 当除号两边都是整数的时候,结果自动取整
10/3=3
b) 当除号两边只要有一边浮点型数据的时候,结果会取到准确值
10.0/3=3.333333
注意:验证的时候,注意数据类型的转换,结果用浮点型数据类型的变量接收
求余 %
a)原理:% 运算符两边必须是整数
如果不是整数,必须做数据类型的转换
b)用途: 用来做位数的分离
123
123%10 结果是3
123/10%10结果是2
123/100结果是1
d)优先级:* / % 高于 + -
算数运算符的优先级高于赋值运算符
e)结合性:从左往右
2.3关系运算符
关系运算符符号: > < >= <= != ==
对于数据:只要是非0值都是真值
a)由关系运算符组成的式子,叫做关系表达式
b)关系表达式的结果只有两种,0 或 1(逻辑结果真)
c)形式: 表达式1 关系运算符 表达式2
假如: 2<3
d)注意:判断两个表达式是否相等,用 ==
e)如果表达式里面有运算符的时候,注意,优先级,先执行优先级高的
f)优先级: > < >= <= 高于 != ==
从上往下,优先级降低:
算数运算符的优先级
关系运算符
赋值运算符
g) 结合性:从左往右
h) 用途:用在循环语句,条件语句,进行判断
2.4按位运算符
按位运算符符号: &(按位与) ^(按位异或) |(按位或) ~(按位取反)
<<(按位左移) >>(按位右移)
a)说明:在做按位运算的时候,需要将数据转换成二进制,再进行相关的运算
数据是以补码的形式保存在内存中的:
对于正数来说,它的补码就是它的原码
对于负数来说,它的补码就是它原码除了符号位之外,其他位取反加1
注意:凡是做按位运算的时候,必须将数据转换成二进制来进行运算
b)按位与 : &
形式: 表达式1 & 表达式2
规则: 全1为1,有0为0
c)按位异或: ^
形式: 表达式1 ^ 表达式2
规则: 相同为0,相异为1
d)按位或 : |
形式: 表达式1 | 表达式2
规则: 全0为0,有1为1
e)按位取反: ~
规则:0变1,1变0
注意: 按位取反是单目运算符
补充:单目运算符跟双目运算符的区别:
单目运算符:根据操作数的数目来区分
如果只有一个操作数:单目运算符
如果有两个操作数:双目运算符
如果有三个操作数:三目运算符
例子:
int a=0x34;
0000 0000 0000 0000 0000 0000 0011 0100
~a;
1111 1111 1111 1111 1111 1111 1100 1011
FFFFFFCB
char b=0x34
~b;
f)按位左移 <<
规则:整体左移,高位溢出,低位补零
方法:整体左移的时候,相对于乘以2,(必须符合数据的取值范围)
例:b左移n 相对于b*2^n
g)按位右移 >>
规则:整体右移,低位溢出,高位位补零
方法:整体右移的时候,相对于除以2,(必须符合数据的取值范围)
优先级:~ 高于 << >> 高于 & 高于 ^ 高于 |
结合性:单目运算符:从右往左
双目运算符:从左往右
2.5逻辑运算符
逻辑运算符符号:&& || !
1)逻辑与:&&
形式: 表达式1 && 表达式2
原理: 两个表达式的结果都是真值,则整体表达式的结果就是真值
注意:如果表达式1的结果是真值,则再去判断表达式2的结果
如果表达式1的结果是假值,不会去判断表达式2
2)逻辑或:||
形式: 表达式1 ||表达式2
原理: 两个表达式的结果有一个为真,则整体表达式的结果就是真值
注意: 如果表达式1的结果是真值,则不会再去判断表达式2的结果
如果表达式1的结果是假值,则再去去判断表达式2
3)逻辑非:!
形式:!表达式1
原理:真变假,假变真
注意:逻辑非 是单目运算符
4)优先级: ! 高于 && 高于 ||
结合性: 单目运算符:从右往左
&& || : 从左往右
2.6自增自减运算符
自增自减运算符符号: ++ –
原理:本身会自增1
分类:分为前置跟后置
前置:int a; ++a 在变量的前面
规则:变量先自增,后使用,
a=1, b=++a;
后置:a++ 在变量的后面
规则:变量先使用后自增
注意:只有变量才会发生自增自减,
不管是前置还是后置,变量最终都会加1
对于前置,变量先加在使用,int a, b=++a ;
对于后置,变量先使用在自增,变量只有在一条语句结束之后才会发生自增
b=a++; {b=a; a=a+1} a=1
b=(a++)+(b=a); //b=1+1 a=2
优先级:单目运算符
结合性:从右往左
补充:1)自增,自减,在printf函数里面,结合性是从右往左
printf(“a = %d b = %d\n”,a++, ++a); 先计算后面的,在计算前面的
2)在前置和后置同时出现的时候,前置会影响后置,后面在出现前置和后置的时候就不会发生变化了。
前置和前置同时出现的时候,也会受影响
解释:不同的编译器,所造成的影响是不同的,根据编译器而定
b=(a++)+(++a)+(a++)+(++a)+(a++);
//1+2+2+3+3=11 实际结果是12
//a=6
d=(++c)+(++c);
//2+3 实际结果是6
//c=3
2.7三目运算符
三目运算符符号 ?:
形式:(条件表达式)?表达式1:表达式2
原理:先判断条件表达式,如果条件表达式为真,则整体表达式的结果就是表达式去的结果;如果条件表达式为,则整体的表达式的结果就是表达式2的结果
本质: 三目运算符
优先级:单目运算符 高于 双目运算符 高于 三目运算符
结合性:从左往右
2.8复合赋值运算符
复合赋值运算符:
形式: += -= /= …
原理:a+=b; a=a+b
注意:!= >= <=
运算符本身带有赋值运算符的不是复合赋值运算符
优先级:跟赋值运算符的优先级一样
结合性:从左往右
2.9逗号运算符
逗号运算符:
形式:(表达式1,表达式2,…表达式n);
原理:先计算表达式1,然后在计算表达式2,一直到表达式n,
最终整个表达式的结果是表达式n的结果
优先级:最低
结合性:从左往右
三、运算符优先级(运算顺序)排序
运算符优先级的高低,从上往下,优先级依次降低
括号 : () {} [] . ->
单目运算符 : ~ ! ++ –
指针运算符 : * &
算数运算符: * / % + -
按位运算符: << >>
关系运算符:> < >= <= != ==
按位运算符:& ^ |
逻辑运算符:&& ||
三目运算符: ?:
(符合)赋值运算符 : = += -= %= …
逗号运算符 : ,