C语言进阶之旅操作符
Posted 一个正直的男孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶之旅操作符相关的知识,希望对你有一定的参考价值。
思维导图
算数操作符
+ - * / %
- (+)和(-)不在多说这个都懂
- (*)这个符号是数学中的✖️这个也不多说用法和数学中一样
- (/)这个是数学中的➗,取商
- (%)模,取余
(/)和(%)用法
(/)
int a =6;
int b =4;
int c=a/b;
--------------
(%)
int a =6;
int b =4;
int c=a%b;
运行结果(/)他是取的商
列子:6/2=商3余0
运行(%)他取的是余数,就是除了后省下来的数,俩边都是整数
拓展
- 如果你除的时候是想要和数学一样的话,那么除的数中必须有一个浮点型,俩个最好
列子
//错误示范
float c=1/2;
printf("%f",c);
return 0;
---------------------
//正确示范(1)
float c=1.0/2;
printf("%f",c);
return 0;
//(2)
float c=1.0/2.0;
printf("%f",c);
return 0;
错误示范
正确示范
移位操作符
- (<<)左移操作符
- (>>)右移操作符
- 俩操作,都是在二进制中(>>) 右移一位,(<<)同理得
- 移位是移二进制位
左移
int a=2;
a=a<<1;
2在内存中的存储
运行流程
运行结果
左移,就是二进制位中往左移,舍去最高位,低位补0
右移
int a =2;
a=a>>1;
运行流程
结果
- 这里为啥是补0或1呢
- 右移其实是算数右移/逻辑右移动
- 算数补符号位
- 逻辑补0
这里正数看不出来
int a=-1;
a=a>>1;
负1的二进制位是这样,高位是符号位(1代表是负数数,0就是正的),低位是2^0次方(原码)
他右移(这里是补码)
这里其实是逻辑右移(补符号位),不是算数右移,如果是算数的换,那个这个值emmmm,你自己看看吧,231+…………20
右移,舍去地位,高位补符号位
拓展
- 一个数存在内存中都是二进制的那二进制
- 二进制算法
- 负数存在内存中是补码
- 负数(原,反,补)
- 正数没原反补
位操作符
- (&)按位与
- (|)按位或
- (^)按位异或
- 操作数必须是真数
- 移位不会改变原来的值
(&)
int a=1;
int b =0;
if(a&b)
{
printf("hehe");
}
else
printf("hahah");
结果:
为啥是这样呢,他判断数中一个假的就是假的
(|)
int a=1;
int b =0;
int c=a|b;
if(c)
{
printf("hehe");
}
else
printf("hahah");
运行结果:
俩个只有一个真的就是真的
(^)
int a = 2;
int b = a ^ 4;
printf("%d", b);
return 0;
运行结果:
向同不变,向异变1
(&)他判断数中一个假的就是假的
(|)判断一个是真的就是真的
(^)二进制中, 向同不变,向异变1
拓展
- 题目
- 不创变量交换俩个数字
常规的写法
int a =1;
int b=2;
int c=1;//a的值给c
a=b;
b=a;//不符合题意
---------------------------
int a =1;
int b =2;
a=a+b;//总和
b=a-b;//和-b=a的值
a=a-b;//-b
//这个如果数字大会溢出,不够优
——————————————————————————————————————————————————
int a= 1;
int b =2;
a=a^b;
b=a^b;
a=a^b;
//这里不会溢出,因为只是在交换二进制位,所以不会溢出
____________________________________
赋值操作符
- (=)赋值
- 给类型赋值
int a=10;
char a=10;
float a=10.0;
double a=10.0;
short a=10;
拓展
这样写比较简洁和
int a=10
//结果一样
a=a+10;
a+=10;
关系操作符
单目操作符
- 就是有一个操作数
(!)
int a=1;
printf("%d",!a);
结果:
逻辑反a=2,(!)a=0,真为1,假为0
(&)和(*)
int a= 1;
int *p =&a;//这里就是吧a的地址给了p
*p=2;//*p找到a,该变a的值
(sizeof)
- sizeof不是函数(算这个数的类型所占多少个字节)
int main()
{
int a=1;
char a1=1;
printf("%d\\n",sizeof(a));//int型
printf("%d",sizeof(a1));//char
}
运行结果:
(++)和(–)
- 前置++、–
- 后置++、–
- 前置在本条语句执行
- 后置这条语句后结束
int a=0;
int b =++a;
printf("%d",b);
printf("%d",a);
int c=a++;
printf("%d",c);
printf("%d",a);
运行结果
拓展
- (32平台),(62就是下面类型*2)
- char(1)字节
- short (2)字节
- int (4)字节
- float (4)字节
- double(8)字节
逻辑与,逻辑或
- &&(逻辑与)
- (||)逻辑或
就是并且和或者
区分开按位与和按位或
三目操操作符
- 三目就是三个就是三个有三个
- a>b?a:b
比大小,输出大的值
(1)
int a=1;
int b=2;
if(a>b)
printf("%d",a);
else
printf("%d",b);
------------------------------
(2)
int a=1;
int b=2;
a=a>b?a:b;
运行结果
对比起来还是下面那个比较简洁
逗号表达式
- 从左往右依次计算
- 结果只取最后一位
- 前面会影响后面的值
俩对比就,就可以看出
操作符优先级
- 就是谁先执行吗
- 就像数学中四则运算,1+1*2,先算乘除在算加减
- 编程也同理
int a =1+1*2;
结果
下面的表格,从上往下,优先级从高到低
操作符 | 描述 | 例子 |
---|---|---|
() | 集合元素 | (1,2,3) |
( ) | 函数调用 | add() |
[] | 下标引用操作符 | arr[],访问数组 |
. | 访问结构体 | 结构体对象.结构体成员 |
-> | 访问结构体指针 | 结果题指针—>结构体成员 |
++ | 后置+1 | a++=a+1(语句结束执行) |
- - | 后置– | a–=a-1 (语句结束执行) |
! | 逻辑反 | !a(1,2,3,4,0),!1,2=0,0=1,真为假,加为真 |
~ | 按位取反 | 一个数二进制全部取反符号位也反 |
+ | 加,正 | a+,+a |
- | 减,负 | a-,-a |
++ | 前置++ | ++a=1+a(本条语句执行) |
- - | 前置- - | –a==1-a (本条语句) |
* | 解引用,代表他是指针 | *p=a,(int *p) |
& | 取地址 | 取除这个变量的地址 |
sizeof | 求类型型长度 | sizeof(类型/数组) |
( 类型 ) | 强制类型转换 | (int)char类型的变量 |
* | 乘法 | a*b |
/ | 除 ,取商 | a/b |
% | 模,整数取于 | a%b |
+ | 加 | a+b |
- | 减 | a-b |
<< | 左移 | a<<1 |
>> | 右 | a>>1 |
> | 大于 | a>b |
>= | 大于=/用于判断 | if(a>=b) |
< | 小于 | a<b |
<= | 小于= /用判断 | if(a<=b) |
== | 等于 /用于判断 | if(a==b) |
!= | 不等于/用于判断 | if(a!=b) |
& | 按位与 | a&b, |
^ | 按位异或 | a^b |
| | 按位或 | c|b |
&& | 逻辑与(并且),俩都位真成立 | c&&b// |
|| | 逻辑或(或者),一个真成立 | a||b |
?: | 条件操作符 | a>b?a:b |
= | 赋值 | |
+= | 加等 | b+=a(==)b=b+a |
-= | 减等 | a-=b(==)a=a-b |
*= | 乘等 | a*=b(==)a=a*b |
/= | 除等 | a/=b(==)a=a/b |
%= | 模等 | a%=b(==)a=a%b |
<<= | 向什么左移 | a<<=b(==)a=a<<b |
>>= | 向什么右移 | a>>=b(==)a=a>>b |
&= | 与……与 | a&=b(==)a=a&b |
^= | 与……异或 | a^ =b(==)a=a^ b |
|= | 与……或 | a|=b(==)a=a|b |
, | 逗号 | a,b,c |
- 优先级有时候也会出错
- 避免
int a=2;
int b =a+1+a/2*a
结果
每个平台结果不一,避免这样,一会多条就分开写,你不知道他这a是事先准备好的,还是算了后在赋值进去的
整型提升
- cpu计算的时候最小操作长度一般int类型(4个字节)
- 达不到这个长度就会整型提升
- char/short都需要整形提升(char 1字节)(short 2字)
- 运算完截断(这个类型所能存下的空间,char 1==8bit)
例子:
//1
char a=3;
char b=127;
//2
char c=a+b;
//3
printf("%d\\n",c);
运行结果
图解:
- 对应上面的代码
(1)
(2)
- (整型提升)其实就是变回原来的样子罢了
(3)
整型提升大致就这些,short其实也一样,是俩个字节的,截断16,位补的时候和上述例子一样
总结
- 最近稍微有些不在状态(带改正)
- 操作符需要多用,用多了就理解了
本篇文要是那里有错,请大胆指出(评论区或加我QQ(1696912943,给我留面哈哈哈)),博主,钱包不厚,不过脸皮厚,所以不会伤到博主自尊心,你提出错误,博主就涨知识,涨知识钱包就变厚哈哈哈哈
持续跟新中……………………
以上是关于C语言进阶之旅操作符的主要内容,如果未能解决你的问题,请参考以下文章