操作符(运算符)详解
创始人
2024-05-23 20:28:19
0

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰算数操作符:+    -    *    /    %

🐰移位操作符:<<    >>

🌸进制的定义 

🌸整数二进制表示形式

🌸<< 左移操作符

🌸>>右移操作符

🐰位操作符:&   |   ^   

🌸&(按位与)|(按位或) 

 🌸^(按位异或)

🐰赋值操作符:    =

🐰复合赋值符:+=    -=    *=    /=    %=    <<=    >>=    &=    !=    ^=

🐰单目操作符:!    -    +    &    *    ~    --    ++

🐰关系操作符:>    >=    <    <=    !=    ==

🐰逻辑操作符:&&      ||

🐰条件操作符:exp1?exp2:exp3(三目操作符)

🐰逗号表达式:exp1,exp2,exp3,…,expN

🐰下标引用操作符 [ ]

🐰函数调用操作符 ( )

🐰结构成员访问操作符

🐰运算符的优先级顺序表

🐰隐式类型的转换-整形提升


🐰算数操作符:+    -    *    /    %

/:除法——得到的是商。 除法操作符的两个的操作数都是整数的话,执行的是整数除法。 除法操作符的两个的操作数只要一个是浮点数,执行的是小数数除法。 例如:
9/2        就是整数除法
9/2.0或者9.0/2.0        就是小数除法
%:取模(取余)——得到的是余数 ‼️注:取模操作符的两个个操作数必须为整数

🐰移位操作符:<<    >>

移位操作符(移动的是二进制的位)<<:左移操作符    >>:右移操作符

🌸进制的定义 

10进制的数据中:都是0~9的数字组成 2进制的数据:0~1的数字组成 8进制的数据:0~7的数字组成 16进制的每一位:0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f (2进制,8进制,10进制,16进制只不过是数值的表达形式而已) 例如:数值10 1010    2进制 12        8进制 10        10进制 a           16进制

🌸整数二进制表示形式

整数的二进制表示形式有三种:原码、反码、补码,正数的原、反、补码是相同的,只有负数的原、反、补码需要转换。 转换规则 原码:把一个数按照正负直接翻译成二进制就是原码 反码:原码的符号位不变,其他位按位取反 补码:反码+1 ‼️注:原、反、补码的最高位是符号位
例如:5 -5是整数,一个整形变量是4字节32比特位
5
原码:00000000000000000000000000000101
反码:00000000000000000000000000000101
补码:00000000000000000000000000000101
-5
原码:10000000000000000000000000000101
反码:11111111111111111111111111111010
补码:11111111111111111111111111111011

‼️注:整数在内存中存储的是补码

🌸<< 左移操作符

<<左移操作符:左边抛弃,右边补0 例如:
int a=3;
int b=a<<1;
a:00000000000000000000000000000011(补码)
a<<1:00000000000000000000000000000110
b:00000000000000000000000000000110
int a=-3
int b=a<<1;
a:
原码:10000000000000000000000000000011
反码:111111111111111111111111111111111111111100
补码:111111111111111111111111111111111111111101
原码到补码:取反,+1(符号位不变)
补码到原码:-1,取反(符号位不变)和取反,+1(符号位不变)
a:111111111111111111111111111111111111111101
a<<1:111111111111111111111111111111111111111010
b:111111111111111111111111111111111111111010

🌸>>右移操作符

1:>>算术右移(左边用原来的符号位填充,右边丢弃) 2:   >>逻辑右移(左边直接用0填充,右边丢弃) 右移的时候,到底采用的是算术右移?还是逻辑右移,是取决于编译器的(常见的是算术右移) ‼️注:对于移位操作符,不要移动负数位,这个是标准未定义的 例: Int a=10; a<<-1(错误)

🐰位操作符:&   |   ^   

位操作符:&(按位与)    |(按位或)   ^(按位异或)   

‼️注:位是二进制位,操作数必须是整数

🌸&(按位与)|(按位或) 

&:相同为相同的数,相异为0

int a=3 b=-5 ;
a:00000000000000000000000000000011    3的补码
b:10000000000000000000000000000101    11111111111111111111111111111010 11111111111111111111111111111011    -5的补码
a&b:00000000000000000000000000000011 

|: 相同为相同的数,相异为1
a|b:11111111111111111111111111111011 
a^b:11111111111111111111111111111000

 🌸^(按位异或)

异或:相同为0,相异为1 规则(异或支持交换律的): a^a=0 0^a=a a^a^b=b a^b^a=b 例题 交换a和b的值,不能用第三个变量
#include
int main()
{int a=3;int b=5;a=a^b;//000000000011^000000000101=000000000110(6)b=a^b;//000000000110^000000000101=00000000011(3)//b=a^b^b=aa=a^b;//000000000110^00000000011=00000000101(5)//a=a^b^areturn 0;
}

🐰赋值操作符:    =

a=b=c+1;//连续赋值(可读性较低)

🐰复合赋值符:+=    -=    *=    /=    %=    <<=    >>=    &=    !=    ^=

🐰单目操作符:!    -    +    &    *    ~    --    ++

~:按位取反(二进制) 例:
int a=0
a:00000000000000000000000000000000
~a:11111111111111111111111111111111 补码11111111111111111111111111111110 反码10000000000000000000000000000001 原码
~a=-1

‼️注:While(~scanf(“%d”,&a)),scanf读取失败会返回EOF,就是-1,-1按位取反则是0

--:前置:先使用,再--,后置:先使用,再--

++:前置:先使用,再++,后置:先使用,再++

int a=10,b=0;//b=a++;//后置++:先使用,再++,先把a=10值赋给b,然后a再++,a=11,b=10;//b=++a;//前置++:先++,再使用,a先++,a=11,然后把a=11赋值给b,b=11;b=a--;b=--a;

🐰关系操作符:>    >=    <    <=    !=    ==

‼️注:=(赋值操作符)和==(关系操作符)

🐰逻辑操作符:&&      ||

逻辑操作符关注真假(1和0),&&(逻辑与)和||(逻辑或)

例:

int i=0,a=0,b=2,c=3,d=4;i=a++&&++b&&d++;//如果左边为假,后面就不需要算了printf("a=%d b=%d c=%d d=%d i=%d\n",a,b,c,d,i);
结果为:a=1 b=2 c=3 d=4 i=0,因为a++,是后置++,所以此时a值为0,则后后面的不需要计算,就为初始值i=a++||++b||d++;//如果左边为真,后面就不需要算了printf("a=%d b=%d c=%d d=%d i=%d\n",a,b,c,d,i);
结果为:a=1 b=3 c=3 d=4 i=0,因为++b前置++,此时b值不为0,所以后面的d不会进行计算。

🐰条件操作符:exp1?exp2:exp3(三目操作符)

int a=5,b=3,c=0;c=a>b?a:b

🐰逗号表达式:exp1,exp2,exp3,…,expN

例如两数中求最大值
#include
int main()
{int a=3,b=5;int max=a>b?a:breturn 0;
}

🐰下标引用操作符 [ ]

数组里常用,arr[ ],arr[ i ]...

🐰函数调用操作符 ( )

Int len=strlen(“abc”);Int Add(3,5)//3,5就是( )的操作数

🐰结构成员访问操作符

(1).    结构体变量.结构体成员名

(2)->    结构体指针->结构体成员

struct  S{int num;char c;};void test(struct S* ps ){printf(“%d”,(*ps).num);printf(“%c”,(*ps).c)printf(“%d”,ps->num);//只有结构体指针才能使用->printf(“%c”,ps->.c)}int main(){struct S s={100,’b’};printf(“%d\n”,s.num);printf(“%c\n”,s.c);test(&s)return 0;}

🐰运算符的优先级顺序表

优先级 操作符(运算符) 名称 使用原型 结合规律 注释
  • 1
[ ] 数组下标 数组名[常量表达式] 从左到右
( ) 小括号 (表达式)/(强制转换类型)
. 成员选择(对象) 对象.成员名
-> 成员选择(指针) 指针->成员名
  • 2
! 逻辑反操作符(逻辑非) !表达式 从右到左 单目运算符
- 负值 -表达式
+ 正值 +表达式
& 取地址运算符 &变量名
* 间接访问操作符(解引用操作符) *指针变量
~ 按位取反操作符 ~表达式
-- 自减运算符 --变量名/变量名--
++ 自加运算符 ++变量名/变量名++
sizeof 长度运算符 sizeof(表达式)
(类型) 强制类型转换 (数据类型)表达式
  • 3
/ 表达式/表达式 从左到右 双目运算符
* 表达式*表达式
% 取模(取余) 整形表达式%整形表达式
  • 4
+ 表达式+表达式
- 表达式-表达式
  • 5
<< 左移 变量<<表达式
>> 右移 变量>>表达式
  • 6
> 大于 表达式>表达式 从左到右 双目运算符
>= 大于等于 表达式>=表达式
< 小于 表达式<表达式
<= 小于等于 表达式<=表达式
  • 7
== 等于 表达式==表达式
!= 不等于 表达式!=表达式
  • 8
& 按位与 表达式&表达式 从左到右 双目运算符
  • 9
^ 按位异或 表达式^表达式
  • 10
| 按位或 表达式|表达式
  • 11
&& 逻辑与 表达式&&表达式
  • 12
|| 逻辑或 表达式||表达式
  • 13
?: 条件运算符 表达式1?表达式2:表达式3 从右到左 三目运算符
  • 14
= 赋值运算符 变量=表达式 从右到左
/= 除后赋值 变量/=表达式
*= 乘后赋值 变量*=表达式
%= 取模后赋值 变量%=表达式
+= 加后赋值 变量+=表达式
-= 减后赋值 变量-=表达式
<<= 左移后赋值 变量<<=表达式
>>= 右移后赋值 变量>>=表达式
&= 按位与后赋值 变量&=表达式
^= 按位异或后赋值 变量^=表达式
|= 按位或后赋值 变量!+表达式
  • 15
, 逗号运算符 表达式,表达式... 从左到右

‼️注:同一优先级的运算符,顺序由结合规律所决定

🐰隐式类型的转换-整形提升

整形提升是按照变量的数据类型的符号来提升的

(1)负数的整形提升

char c1=-1;

变量c1的二进制位(补码)中只有8个bit位;

11111111

因为char为有符号的char

所以整形提升的时候,高位补充符号位,即为1

提升之后的结果是:

111111111111111111111111111111111

(2)正数的整形提升

char c2=1;

变量是c2的二进制(补码)中只有8个bit位;

00000001

因为char为有符号的char

所以整形提升的时候,高位补充符号位,即为0

提升之后的结果是:

00000000000000000000000000000001

(3)无符号整型提升,高位补0

例题:
 

int main()
{char a=3;//00000000000000000000000000000011-都是补码//000000111-截断char b=127;//00000000000000000000000001111111//01111111-截断char c=a+b;//00000000000000000000000000000011//00000000000000000000000001111111//00000000000000000000000010000010//运算时整形提升//10000010//赋值给c时又发生截断printf("%d\n",c);//10000010//11111111111111111111111110000010-补码//11111111111111111111111110000001-反码//10000000000000000000000001111110-原码//所以打印出的值为10000000000000000000000001111110(二进制),-126(十进制)//%d打印整型提升return 0;
}

​​​​​​​

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...