C语言最全操作符详解,一文精通所有操作符!_c语言操作符 >> <<-程序员宅基地

技术标签: 操作符  c语言  C语言考研重制版  c语言快速入门  


前言

提示:本文主要面向对象为C语言新人,文章覆盖了所有C语言的操作符,对于C语言已经有一定掌握的同学也可作为复习的材料,预祝学习愉快!

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、除号“/”

除号作为C语言中最为简单的符号,也时常会有同学有着误区,对于“/”而言,除法操作中两边是整数,执行整数除法,除法操作中,两边有一边有浮点数,才执行浮点数除法。除法操作与操作数的类型无关

代码如下(示例):

#include<stdio.h>
int main()
{
    
	int ret1 = 9 / 2;
	double ret2 = 9 / 2;
	double ret3 = 9 / 2.0;
	printf("%d\n", ret1);//打印4
	printf("%lf\n", ret2);//打印4.000000
	printf("%lf\n", ret3);//打印4.500000
	return 0;
}

二、"%"除法取余数

以a%b为例,a/b=c…d 则a%b=d
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 9 % 2;// 9/2=4....1,a=1
	printf("%d", a);//打印出1
}

ps:%只能用于整型,其他类型不能使用


三、左移操作符“<<”和右移操作符“>>”

1.左移操作符

代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 5;
	//a的原码:00000000000000000000000000000101,最前面的一个0表示它是正数,如果是1则表示负数
	//a的反码:00000000000000000000000000000101
	//a的补码:00000000000000000000000000000101
	int b = a << 1;//a向左移动1位,移动的是二进制位
	//a向左移动一位:00000000000000000000000000001010-----左边丢一位,右边补0
	//pow(2,3)+pow(2,1)=8+2=10=b
	//对于整数的二进制有三种表示形式:原码、反码、补码
	//正整数-原、反、补相同
	//负整数
	//原码-直接按照数字的正负写出的二进制序列
	//反码-原码的符号位不变,其他位按位取反得到
	//补码-反码+1
	int c = -1;
	//c的原码:10000000000000000000000000000001
	//c的反码:11111111111111111111111111111110//符号位不变,其他位,按位取反
	//c的补码:11111111111111111111111111111111//反码+1
	int d = c << 1;
	//d的补码:11111111111111111111111111111110
	//d的反码:11111111111111111111111111111101
	//d的原码:10000000000000000000000000000010-对应十进制-2
	printf("%d\n", a);
	printf("%d\n", b);//ps:这里a向左移1位得到b,a并没有移位赋值给a,a的值任然是5
	printf("%d\n", d);//在内存中储存的是补码,计算时,用的是原码
	return 0;
}

2.右移操作符

右移操作符分两类
1.逻辑右移-右边丢弃,左边补0
2.算数右移-右边丢弃,左边补符号位
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 5;
	//a的原码:00000000000000000000000000000101
	//a的反码:00000000000000000000000000000101
	//a的补码:00000000000000000000000000000101
	int b = a >> 1;
	printf("%d", b);//00000000000000000000000000000010-打印出2——对于正数,右移,算数和逻辑是一样的
	int c = -5;
	//c的原码:10000000000000000000000000000101
	//c的反码:11111111111111111111111111111010
	//c的补码:11111111111111111111111111111011
	int d = c >> 1;
	//d的补码:11111111111111111111111111111101(算数右移)或01111111111111111111111111111101(逻辑右移)
	printf("%d", d);//打印出d=-3原码为:10000000000000000000000000000011 
	//                      对应反码为:11111111111111111111111111111100 
	//                      对应补码为:11111111111111111111111111111101,说明当前编译器用的是算数右移 (大多数编译器都是算数右移)
}

四、按位与“&”

&:全1为1
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 3;
	int b = -2;
	//a的补码:00000000000000000000000000000011
	//b的原码:10000000000000000000000000000010
	//b的反码:11111111111111111111111111111101
	//b的补码:11111111111111111111111111111110
	int c = a & b;//符号位也是要进行“与运算”的
	//11111111111111111111111111111110
	//00000000000000000000000000000011
	//按位与00000000000000000000000000000010=2
	//因为整数补码和原码一样,所以c=2
	printf("%d\n", c);
	return 0;
}

五、按位或“|”

|:有1为1
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 3;
	int b = -2;
	//a的补码:00000000000000000000000000000011
	//b的原码:10000000000000000000000000000010
	//b的反码:11111111111111111111111111111101
	//b的补码:11111111111111111111111111111110
	int c = a | b;
	//11111111111111111111111111111110
	//00000000000000000000000000000011
	//按位或得到补码:11111111111111111111111111111111
	//         反码:11111111111111111111111111111110
	//         原码:10000000000000000000000000000001=-1
	//反码变原码,符号位是不变的
	printf("%d\n", c);
	return 0;
}

六、按位异或“^”

^:相同为0,相异为1
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 3;
	int b = -2;
	//a的补码:00000000000000000000000000000011
	//b的原码:10000000000000000000000000000010
	//b的反码:11111111111111111111111111111101
	//b的补码:11111111111111111111111111111110
	int c = a ^ b;
	//11111111111111111111111111111110
	//00000000000000000000000000000011
	//按位异或得到补码:11111111111111111111111111111101
	//反码:11111111111111111111111111111100
	//原码:10000000000000000000000000000011=-3
	printf("%d\n", c);
	return 0;
}

七、赋值操作符“=”和复合赋值操作符

1.赋值操作符

赋值操作符“=”不能单单看作是等号,比如a=b,是要看成把b的值赋给a
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 10;
	int x = 0;
	int y = 20;
	a = x = y + 1;//连续赋值x=21,a=x=21,从右向左计算——最好拆开写
	printf("%d", a);
}

2.复合赋值操作符

复合赋值符+= -= *= /= >>= <<=等等
a+=b表示a=a+b,a * =b表示a=a * b
其他以此类推


八、逻辑非“!”

非0为真,默认1 非真为假,默认0,注意!!!:负数也是真
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 0;
	int b = !a;
	int c = -1;
	int d = !c;
	printf("b=%d,d=%d", b, d);//b=1,d=0
}

九、&取地址操作符和*解引用操作符

代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 10;
	int*pa = &a; //int*是pa的类型,表示pa是指向a的整形指针变量,pa里存放a的地址
	printf("%d\n", *pa);//通过解引用操作符*打开pa的地址,换句话说*pa=a
	*pa = 2;
	printf("%d", a);//打印出2,可以通过*pa改变a的值
}

十、sizeof操作符

sizeof是操作符,不是函数。
sizeof计算的是变量或类型创建变量的内存大小,和内存里存放什么数据没有关系!!!
代码如下(示例):

#include<stdio.h>
int main()
{
    
	char arr[10] = "abc";
	printf("%d\n", sizeof(arr));//计算整个数组的大小,该数组10个元素,每个元素1个字节,总大小=10*1=10
	printf("%d\n", strlen(arr));//计算的是字符串的长度,不包括\0,计算的是\0出现前的字符数
	int a = 10;
	printf("%d\n", sizeof(a));//a里面有一个元素,占四个字节1*4=4
	printf("%d\n", sizeof a);//因为sizeof不是函数,所以可以不带括号
	printf("%d\n", sizeof(int));//也是4
	//printf("%d\n", sizeof int);//这里是语法要求,int外的括号不能省
	return 0;
}

特殊案例:

int main()
{
    
	int a = 5;
	short s = 10;
	printf("%d\n", sizeof(s = a + 2));
	printf("%d\n", s);
	return 0;
}

在这里插入图片描述
解释:sizeof计算的是变量或类型创建变量的内存大小,和内存里存放什么数据没有关系,所以在编译阶段读到最后是计算s的大小,就直接是short的大小2了,后面a+2根本没有执行啊。
所以s也没有被赋值(如果其他情况这里会发生截断,因为是整形变成短整型),s仍然是哪个10


十一、按位取反操作符“~”

~所有位都取反,包括符号位
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 0;
	//00000000000000000000000000000000
	int b = ~a;
	//11111111111111111111111111111111 b的补码
	//11111111111111111111111111111110 b的反码
	//10000000000000000000000000000001 b的原码=-1
	printf("%d", b);//内存中存的是补码,打印时是原码
	return 0;
}

十二、强制类型转换操作符 (类型)

代码如下(示例):

#include<stdio.h>
int main()
{
    
	double a = 3.14;
	int b = (int)a;
	printf("%d", b);//打印出3
}

十三、双目操作符:逻辑与&& 逻辑或||

逻辑与&&:全真为真
逻辑或||: 一真为真
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 0;
	int b = 5;
	int c = a && b;
	int d = a || b;
	printf("%d\n", c);//0-全真为1,否则为0
	printf("%d\n", d);//1-有真为1,全假为0
	return 0;
}

&&特例:

int main()
{
    
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	printf("a=%d b=%d c=%d d=%d", a, b, c, d);
	return 0;
}

在这里插入图片描述
打印结果a=1 b=2 c=3 d=4
为什么只有a进行了+1呢?
因为第一个&&左边的a是a++也就是值为0,有0为0,
第一个且右边的,编译器根本就不管了,所以bcd还是原来的值

||特例:

int main()
{
    
	int i = 0, a = 0, b = 2,  d = 4;
	i = a++ || ++b || d++;
	printf("a=%d b=%d d=%d", a, b, d);
	return 0;
}

在这里插入图片描述
打印结果a=1 b=3 d=4
a很好理解,因为a++最后还是加了1

a++ || ++b因为“或”左边是0,所以还是要计算一下右边的++b,++b是2(在或这里是2,最终是3)
也就是说右边是真,那么这个整体(a++ || ++b)为真

到了第二个或
(a++ || ++b) || d++,因为左边为真,一真为真,编译器直接就判断为真了,右边的d++并没有执行
所以d还是4


十四、三目操作符(条件操作符)

三目操作符(条件操作符)
exp1?exp2:exp3
对语句1判断,为真则语句2,为假则语句3
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 3;
	int b = 5;
	int m = 0;
	m = (a > b ? a : b);
	printf("%d", m);//打印5,a>b不成立返回b
}

十五、逗号表达式

exp1,exp2,exp3,…
从左向右依次执行,整个表达式结果是最后一个表达式结果
代码如下(示例):

#include<stdio.h>
int main()
{
    
	int a = 1, b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);//a>b为真,a=b+10=12,a不做变换,b=a+1=13
	printf("%d", c);//13
}

总结

本文介绍了十五种C语言常用操作符,作为C语言编程的最基础工具,读者需要仔细研读,将来才能在C语言编程中得心应手,最后祝读者们学业有成、天天进步!
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_57180439/article/details/119807871

智能推荐

Linux系统硬盘挂载命令_linux磁盘挂载命令-程序员宅基地

文章浏览阅读2.3k次。6. 挂载网络共享目录(需要先安装samba客户端):mount -t cifs //192.168.1.2/share /mnt/share -o username=user,password=pass。7. 自动挂载命令(修改/etc/fstab文件):/dev/sda1 /mnt/data ext4 defaults 0 0。5. 挂载U盘命令(需要先插入U盘):mount /dev/sdb1 /mnt/usb。8. 强制卸载命令:umount -l /mnt/data。1. 挂载命令:mount。_linux磁盘挂载命令

python fpdf 中文加粗-程序员宅基地

文章浏览阅读585次。python fpdf中文加粗_python fpdf 中文

JedisPool的getResource()方法配置不当导致服务假死_jedispool.getresource()卡死-程序员宅基地

文章浏览阅读1.4w次。JedisPool的getResource()方法配置不当导致服务假死dubbo服务中使用jedis,在从JedisPool获取jedis时超时导致dubbo服务假死"DubboServerHandler-10.0.101.208:20880-thread-22" daemon prio=10 tid=0x00007f52f00b7800 nid=0x3d85 waiting on cond..._jedispool.getresource()卡死

WordPress安装简单详细教程(云服务器和轻量应用服务器搭建WordPress)_wordpress服务器部署教程-程序员宅基地

文章浏览阅读8.9k次,点赞4次,收藏61次。目录域名解析下面是WordPress网站具体搭建步骤:一、云服务器搭建wordpress二、轻量应用服务器搭建wordpress前言:不知道如何安装宝塔面板的朋友,可以先看下面的教程:1、轻量应用服务器安装宝塔面板(建站)2、云服务器安装宝塔面板(建站)3、阿里云服务器ECS搭建网站教程如何搭建一个wordpress网站呢?其实非常简单,你需要做的就是买一个域名和云服务器(或者轻量应用服务器)域名解析首先,进行域名解析,也就是将你的域名与服务器绑定_wordpress服务器部署教程

如何解决MathPage.wll或MathType.dll文件找不到问题-程序员宅基地

文章浏览阅读732次。如何解决MathPage.wll或MathType.dll文件找不到问题MathType 6.9简体中文版是一款功能很强大的数学公式编辑器,但是因为之前的卸载不完全,有时会出现找不到MathType.dll或者MathPage.wll文件找不到的错误窗口提示,而导致软件无法正常使用。 百度经验的方法很多是不靠谱的,本文将解决MathPage.wll或MathType.dll文件找不到的问题,亲测有_如何解决mathpage.wll或mathtype.dll文件找不到问题

计算机组成原理——wsdchong_机器补码浮点运算-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏10次。计算机组成原理一、基本概念二、浮点数的加法运算121写出x、y的机器数(尾数、阶码都为补码)2计算x+y;例题:26.按机器补码浮点运算步骤,计算[x+y]补.(1)x=2-011× 0.101 100,y=2-010×(-0.011 100)[x]补=1,101;0.101 100, [y]补=1,110;1.100 100[Ex]补=1,101, [y]补=1,110, [Mx]补=0.101 100, [My]补=1.100 100 1)对阶:[.._机器补码浮点运算

随便推点

linux之通过挂载iso镜像去安装文件_mount 挂载 iso 后,把文件拷贝到别的目录能安装么-程序员宅基地

文章浏览阅读2.2w次,点赞3次,收藏28次。我们首先需要知道什么是DNS?  DNS全名是Domain Name System,翻译成中文就是域名系统,它主要的作用就是将人们容易记忆的域名和不方便记忆的ip地址做转换,比如,当我们访问百度的时候,我们知道www.baidu.com就可以直接访问,但是却不知道它的ip地址,DNS就是将我们不容易记忆的ip地址转换成域名的方式查看内核是否开启路由功能sysctl -a|grep..._mount 挂载 iso 后,把文件拷贝到别的目录能安装么

拜占庭容错的三个基本理论(CAP/FLP/DLS)_容错理论-程序员宅基地

文章浏览阅读2.2k次,点赞4次,收藏5次。拜占庭容错的三个基本理论1) CAP理论 - "如果网路发生阻断(partition)时,你只能选择资料的一致性(consistency)或可用性(availability),无法两者兼得"。论点比较真观:如果网路因阻断而分隔为二,在其中一边我送出一笔交易:"将我的十元给A";在另一半我送出另一笔交易:"将我的十元给B "。则此时系统要不是,a)无可用性,即这两笔交易至少会有一笔交易不会被接受..._容错理论

R语言中如何选择线性回归模型以及如何降维_r语言anova函数比较两个线性模型好坏-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏26次。一、模型比较的二中方式(1)使用anova()函数比较二个模型fit1 Frost, data = states)fit2 anova(fit2, fit1)Model 1: Murder ~ Population + IlliteracyModel 2: Murder ~ Population + Illiteracy + Income + Frost _r语言anova函数比较两个线性模型好坏

CANoe中的离线回放+Trace回放_canoe数据回放-程序员宅基地

文章浏览阅读2.6k次,点赞28次,收藏42次。必须要说明的是,在实际工作中,有很多工程师将ReplayBlock当做一种报文回放功能使用。其实这是一种错误的用法。如果只想实现报文回放,有两种方式1:offline模式下,在Measurement配置窗口,使用数据回放功能。2:在trace窗口,使用import命令,也可直接导入数据文件,并显示在Trace窗口显示。如果文本很大,需要注意可能显示的数据会产生溢出和被覆盖。比较 1和2两种方式,建议在文件比较小的时候,直接在trace窗口添加。文件较大时使用offline模式下的数据回放。_canoe数据回放

论文关于mysql数据库文献_数据库论文参考文献-程序员宅基地

文章浏览阅读8.5k次,点赞4次,收藏18次。数据库论文参考文献论文的最后部分是由参考文献组成的,有时也会有附录。参考文献在论文中是有一些要求的,大都都是来源格式的要求。小编这次整理的是有关数据库论文的参考文献,大家可以参考参考。[1]基于关系数据库的关键词查询[J]. 林子雨,杨冬青,王腾蛟,张东站. 软件学报. 2010(10)[2]S-CBR:基于数据库模式展现数据库关键词检索结果[J]. 彭朝晖,张俊,王珊. 软件学报. 2008(0..._mysql文献

IDEA出现闪退或打不开的解决方法_idea重新安装后进入总是闪退-程序员宅基地

文章浏览阅读1.8k次。本身项目比较大,为了打开这个软件,可调节IDEA中安装的bin目录下有个。打开IDEA的时候过一会便闪退,可以再IDEA的右下角看到如下提示。(如果没有该提示,软件右下角也会有个红色感叹号,点开查看原因即可)闪退的多数原因大致是out of memory,内存溢出。查看任务管理器中的进程:(发现内存随时有溢出的情况)但也需要注意,该参数并不是越大越好,适中即可。只有个别原因是需要管理员权限就可执行!可以尽量减少软件的启动。_idea重新安装后进入总是闪退

推荐文章

热门文章

相关标签