Hello大家好!我们又见面啦!
给生活添点passion,开启今天的编程之路!
目录
1、算术操作符
算术操作符:+,-,*,/,%
以上操作符分别为加法,减法,乘法,整除,取余(一个数除以另一个数的余数)
相信大家在练习中已经用过很多次了,这里就不过多赘述了。
2、移位操作符
移位操作符:<<,>>
移位操作符已经下面要讲的位操作符都是针对二进制数来讲的。
在生活中,我们都使用十进制来表示数,也就是满十进一。类比一下,二进制就是满二进一。
这里我们主要目的是介绍操作符,对于二进制数就不过多介绍了
下面来看这串代码:
#include<stdio.h>
int main()
{
int n = 5;
int m=n << 1;
printf("%d", m);
return 0;
}
输出结果为10,为什么呢?
这里我们选择三十二位编码,那么5的二进制应该是00000000000000000000000000000101(第一位我们叫符号位,0为正数,1为负数)。<<向左移动一位,那么我们就丢弃最左边的一位,并且用0补上右边空缺的一位。现在我们的m应该是00000000000000000000000000001010。
现在我们把左移换成右移动,发现输出结果为2。
右移的规则是将二进制位右边的丢弃,左边用原数的符号位补充。(算术右移)
注意:(1)移位操作符不改变数的本身,这也就是上面代码为什么要定义变量m。
(2)移位操作符操作数只能是整数。
3、位操作符
位操作符:&,|,^,~
上面四个操作符分别为按位与,按位或,按位异或,按位取反。
我们通过这串代码的输出结果,来介绍位操作符。
#include<stdio.h>
int main()
{
int n = 5;
int m = -3;
printf("%d\n", n & m);//5
printf("%d\n", n | m);//-3
printf("%d\n", n ^ m);//-8
printf("%d\n", ~0);//-1
return 0;
}
(1)按位与
首先我们介绍原码,反码和补码。
内存中将数存储为补码的形式,所以我们的计算都要换成补码形式来理解。
首先,正整数的原码,反码,补码都是一样的。所以我们来看负整数的原码反码和补码,拿-3举例:
原码:-3:10000000000000000000000000000011(符号位是1表示负数)
反码:符号位不变,剩下所有位取反(0变1,1变0)
-3:11111111111111111111111111111100
补码:在反码的基础上加1
-3:11111111111111111111111111111101
好的,那么我们现在也写出5的补码:00000000000000000000000000000101
现在正是介绍按位与:我们知道-3和5都是32位,每对应的一位如果都是1,返回1;只要有一位不为1,返回0。那么我们输出数字的补码应该为00000000000000000000000000000101。那么输出结果就是-1。(因为计数位为正,补码原码相同,直接输出补码的结果。)
补充:我们把补码换成原码:先取反,再加一(也就是说,原码到补码和补码到原码的操作是一样的)
(2)按位或
同样的顺序变成补码,这里不再赘述。
按位或:每对应的一位如果都是0,返回0;只要有一位不为0,返回1。
现在我们很容易得到输出数的补码为:11111111111111111111111111111101
现在我们把补码换成原码:取反:10000000000000000000000000000010
再加一:10000000000000000000000000000011
输出结果为3。
(3)按位异或
按位异或:两个对应位置相反返回1,相同返回0。
输出结果为:11111111111111111111111111111000
换成原码:10000000000000000000000000001000
输出结果为-8。
(4)按位取反
顾名思义,每一位都取反:输出结果为-1
4、单目操作符
单目操作符:!,++,--,&(注意这里不是按位与),*,+,-,~,sizeof,(类型)
以上操作符中,我们只介绍几个不常见的以及没提到过的(&和*以后会讲)
(1)!操作符
表示把当前值的真假取反。
也就是说,操作数为真变成假的,假的变成真的。
(2)szieof
用于获取操作数在内存中占用的字节数。
#include<stdio.h>
int main()
{
int n = 5;
int m = sizeof(n);
printf("%d", m);
return 0;
}
int型占用四个字节,输出结果为4。
(3)(类型)
(类型)表示强制类型转换
#include<stdio.h>
int main()
{
int n = 5;
int m = sizeof(n);
printf("%lf", (double)m);
return 0;
}
这里我们将m强制转换成了double型
5、逗号表达式
逗号表达式,就是逗号隔开的多个表达式。逗号表达式从左向右依次执行,输出最后一个表达式的结果。
#include<stdio.h>
int main()
{
int n = 5;
int m = 6;
int c = (n++, m++, m + n);
printf("%d",c);//结果为13
return 0;
}
7、关系操作符
关系操作符:>,>=,<,<=,==,!=
大于,大于等于,小于,小于等于,等于,不等于相信这些大家都能熟练使用,这里不再介绍。
8、逻辑操作符
逻辑操作符:&&、||
逻辑与(并):我们可以理解成和,并且的意思。&&两边表达式须同时成立。
逻辑或:我们理解成或的意思,及||两边表达式只成立一个就可以。
9、? :操作符
#include<stdio.h>
int main()
{
int a = 5;
int b = 6;
int c = (a > b) ? 1 : 0;//如果a>b返回1,否则返回2
printf("%d", c);
//结果为0
return 0;
}
10、下标访问[],函数调用()
下标访问和函数调用在数组和函数章节分别使用过,相信大家不陌生了,这里不再过多赘述。
11、结构体访问操作符
现在我们先讲讲什么是结构体。比方说我们现在有一份档案,里面放着各个年级各个学生的个人资料。每个学生的个人信息包含年龄,姓名,性别......那么这份档案就是一个结构体。它包含的元素(每个学生)可以记录对象的多个信息。
(1)结构的声明
struct book
{
int age;//一个学生的年龄;
char name[100];//一个学生的名字 ;
};//注意分号不能少;
这里我们像是先把学生的档案打印出来,上面有姓名,年龄两个栏,但是还没填东西。
声明通常放到最上面。
(2)结构体的定义
#include<stdio.h>
struct stu
{
int age;//一个学生的年龄;
char name[100];//一个学生的名字 ;
};//注意分号不能少;
int main()
{
struct stu a = { 20,"lihua"}; //定义
struct stu b = { 19,"wangming" };
struct stu c = { 18,"zhanglei" };
return 0;
}
现在我们把栏目填上内容。
(3)结构体的使用
#include<stdio.h>
struct stu
{
int age;//一个学生的年龄;
char name[100];//一个学生的名字 ;
};//注意分号不能少;
int main()
{
struct stu a = { 20,"lihua"}; //定义
struct stu b = { 19,"wangming" };
struct stu c = { 18,"zhanglei" };
printf("%s:%d\n", a.name, a.age);
printf("%s:%d\n", b.name, b.age);
printf("%s:%d\n", c.name, c.age);//使用结构体
return 0;
}
实际上,结构体这一部分的内容很多,这里只是简单引入,简单使用,等后续会进一步介绍。
12、操作符优先级,结合性
注:本素材来源于网络
在编程时,如果不注意操作符优先级,有时会达不到想要的效果。
好了,今天的内容就分享到这,期待我们的下次见面!
标签:int,编程,补码,详解,按位,printf,操作符,原码 From: https://blog.csdn.net/2401_87995839/article/details/143617900