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=2if(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[],访问数组
.访问结构体结构体对象.结构体成员
->访问结构体指针结果题指针—>结构体成员
++后置+1a++=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语言进阶之旅操作符的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶之旅操作符

C语言进阶之旅(留下的足迹)

C语言进阶之旅(留下的足迹)

C语言进阶之旅(留下的足迹)

我的C/C++语言学习进阶之旅转载:实现一个在JNI中调用Java对象的工具类

我的C/C++语言学习进阶之旅C/C++编程笔记:C语言使用宏定义#define来处理通用的可抽取的代码块