编程语言|C语言——C语言操作符的详细解释

这篇文章主要详细介绍了C语言的操作符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、基础

1.1 算数操作符

+   -   *   /   %   +=   -=  *=  /=  这些操作符是我们编程时候最常用的几个算数操作符

+ - * 等算数操作符就不用再多说了,与正常的数学用法相同,下面是一些常用但是初学者可能不太容易把握、易错的算数操作符

1.1.1 / 操作符

/:除法,除法在C语言中分为整数除法浮点数除法

整数除法:/d的两个操作数都为整数,计算方法是向下取整

得到结果为2

浮点数除法:储存值的变量必须是浮点数, 两个操作数中至少有一个为浮点数,但除数或者被数不一定要用浮点数存储,只需要在计算时进行转化即可

%.nlf也可以使结果自动四舍五入保留n位小数

1.1.2 %取余操作符

取余运算符得到的是余数,但取余操作符的两个操作数都要为整数

 c的值就等于8除以3的余数 2

1.1.3 +=  -=  *=  /=操作符

直接举例子:

a+=2就等同于a=a+2,将a的值加2再赋值给a

a-=2就等同于a=a-2,将a的值减2再赋值给a

*=、/=也是相同的道理

1.2 单目操作符

单目操作符,顾名思义,单目,就是操作数只有一个的操作符

1.2.1 !  操作符

! 逻辑反操作,将真变为假,将假变为真

在逻辑定义中,0表示假,非0则表示真

在这段代码中,先给i赋初值0,然后在while判断是否进入循环时,!0就是真,进入循环,但为了防止死循环,我们加上一个限制条件,保证只打印5次

同样,如果while判断条件只有一个0时,则说明为假,不进入循环,打印0次

1.2.2 sizeof 操作符

sizeof(类型名);sizeof()返回无符号的所计算的对象或者类型所占空间的大小,单位是字节

sizeof经常也用来计算数组元素的个数

1.2.3 ~操作符

~:按位取反操作符,对二进制位进行按位取反,将二进制补码每一位的0变1,1变0。注意,是对补码进行操作,负数要先将原码变为补码,同时取反得到的也是补码,看结果还得再变为原码

从图中可以看出,0在按位取反后应该是  -1,同样,在编译器上验证

1.2.4 ++、--操作符

前置++,前置--:先将变量+1或者-1,再作为表达式的值使用(先++,再使用)

后置++,后置--:先将变量的值作为表达式使用,再将变量+1或者-1(先使用,再++)

用上面的口诀想起来就容易多了

1.2.5 &  取地址操作符

&:取出某个变量、数组、函数等的地址,在比价复杂的代码中,我们经常用指针进行操作,&操作符就可以取出地址赋值给指针变量

1.2.6 *  间接访问操作符 

间接访问操作符,也称解引用操作符,操作数地址或指针,可以通过对地址的解引用,找到地址中存储的变量,对变量进行间接操作

1.2.7 ()强制类型转化

():将一种数据类型的变量强制转化为另一种数据类型

如参数需要一个无符号的整形变量,而你目前所有的是一个整形变量啊,就可以通过强制类型转化转化为组符号的整形,这个经常用于函数参数的优化部分

如:(unsigned int)a   即可将a转化为无符号的整形,同样,强制类型转化尽量要遵守由低到高转化,否则,也会丢失精度

1.3 逻辑操作符

&& 逻辑与 操作符:“同时都要满足”

||    逻辑或 操作符:“满足其中一个即可”

1&&2---->1       0&&1----->0   

1||2   ---->1       0||1----->1

1表示真,0表示假

例:找出1000---2000之间的闰年

闰年:如果year能够被4整除,并且不能被100整除,则year是闰年。或者如果year能够被400整除,则year是闰年,判断闰年就恰好用到了这两个操作符

int year = 0;
	for (year = 1000; year < 2000; year++)
	{
		if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
			//判断闰年
			printf("%d ", year);
 
	}

逻辑操作符这里有一个超级易错点

对于&&来说,如果表达式左边为0,则说明在逻辑上已经为了,那么右边全部的表达就不再进行计算,也不执行。

int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);

a++;---->是先将a的值使用,在对a加1。刚使用的表达式a的值为0,并且在&&的左边,所以后面++b,d++不再计算。

同样,对于||来说,如果表达式左边为非0则说明在逻辑上已经为了,那么右边全部的表达就不再进行计算,也不执行。

int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++||++b||d++;
	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);

a++这个表达式的值为0,继续执行,但是++b的值为3,在||操作符的左边,并且在逻辑上已经为真了,所以后面的d++不再计算 

1.4 条件操作符

条件操作符是C语言中唯一一个三目操作符

表达式1如果为真,即计算表达式2,同时表达式2的结果就是三目操作符的运算结果

表达式2如果为假,即计算表达式3,同时表达式3的结果就是三木操作符的运算结果

也可以在编译器里面运行来验证

int a = 0, b= 3, max1 = 0,max2;
	if (b > a)
		max1 = b;
	else
		max1 = a;
	//等同于
	max2 = (b > a) ? b : a;
	printf("%d %d", max1, max2);

运算结果当然是max1=3  max2=3

1.5 逗号表达式

逗号表达式,就是用逗号隔开的多个表达式。里面的表达式从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1)

从左向右一次算a=b+10=12 ; b=a+1=13;然后将这个逗号表达式整体的值(即b=a+1)赋给变量c

即 c=13; 

需要注意的是逗号表达式的每一个表达式都必须从左向右依次计算

1.6 下标引用,函数调用和结构体成员访问

1.6.1 下标引用操作符[]

arr[2]=2;//将2赋值给arr[2]

[ ]就是下标引用操作符,arr和2是[ ]的两个操作数,arr为数组名,2为索引值

1.6.2 函数调用操作符() 

()可以接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数,函数传参可以传多个参数

1.6.3 结构体访问操作符.->

用法:

结构体变量.结构体成员

结构体指针变量->结构体成员

#include <stdio.h>
struct Stu
{
 char name[10];
 int age;
 char sex[5];
 double score;
};
void set_age1(struct Stu stu)
{
 stu.age = 18;//结构体变量访问结构体成员
}
void set_age2(struct Stu* pStu)
{
 pStu->age = 18;//结构体指针变量访问结构体成员
}
int main()
{
 struct Stu stu;
 struct Stu* pStu = &stu; 
 
 stu.age = 20;//结构成员访问
 set_age1(stu);
 
 pStu->age = 20;//结构成员访问
 set_age2(pStu);
 return 0;
}

1.7 关系操作符 

>

>=

<

<=

== 用于测试“相等”

!=  用于测试“不相等”

二、进阶

2.1 二进制

2.1.1 二进制的计算

2.1.2 二进制的存储

2.2 移位操作符

移位操作符移动的是二进制的补码,且操作数只能为整数

<< 左移操作符:将二进制位整体向左移动,左边丢弃,右边补零

图为将-15左移1位

>> 右移操作符:将二进制位整体向右移动,右边丢弃,左边补符号位

图为将-15右移一位

负数学会了,整数就更简单了,因为整数的原码,反码,补码都一样,不用互相转化

2.3 位操作符

位操作符的操作数必须为整数 

& 按位与: a&b 对应的二进制补码 :有0则为0,同时为1才为1

| 按位或a|b 对应的二进制补码 :有1则为1,同时为0才为0

^ 按位异或:  a^b 对应的二进制补码 :相同为0,不同为1

实例1:不创建第三个变量,实现两个整数的交换

方法1:

    int a = 2;
	int b = 3;
	printf("交换前:a = %d, b= %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("交换后:a = %d, b= %d", a, b);

这种方法在一般情况下可以,但是当a,b非常大时,a+b可能会超过存储范围(长度大于整形) 

方法2:用按位异或计算

int main()
{
	int a = 2;
	int b = 3;
	printf("交换前:a = %d, b= %d\n", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换后:a = %d, b= %d", a, b);
	return 0;
}

在解释原因前,先演示一下按位异或的几个规则

a^a=0 详细看图

a^0=a 详细看图

a^b^a=a^a^b,即按位异或运算满足交换律 详细看图

解释一下原因:a=a^b,然后 b=  (a^b)  ^b =a^0=a,即实现了将a的值赋给了b

同样:a=a^b,然后a=(a^b)^a=a^a^b=0^b=b,即实现了将b的值赋给了a

实例2:求一个整数存储在内存中的二进制中1的个数

一个数&1可以得到它的最低位(详细参考按位与操作符图解),如果a&1==1,说明a的最低位是1如果a&1==0,说明a的最低位是0,那么思路就清晰了,只需要将a的二进制位多次右移,每次右移后&1得到它的最低位,判断是否为1,为1的话,计数器就++,将32个二进制位尽皆遍历,即可知道共有多少个1

int main()
{
 
	int a = 31;//5个1
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if (a & 1 == 1)	//说明a的最低位是1
			count++;
		a >>= 1;
	}
	printf("%d", count);
}

三、同一操作符的不同类型操作数之间的转化

例如:将整形3存到浮点型变量中,没问题。但是,将一个浮点型的数字存到一个整形变量中去,就可能会出现精度丢失问题。这些转化需要我们在写代码的时候自行完成

四、操作符的优先级

C语言操作符的优先级

在使用这张表时需仔细核对运算符的符号和名称,但在大多数情况下,我们选择直接将需要优先计算的用圆括号括起来,不过最基本的顺序还是得知道的,总不能一份代码到处都是圆括号吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/503294.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】Redis 生产问题。如何确保缓存和数据库数据的一致性? 常见的缓存更新策略?

目录 缓存穿透 缓存穿透解决办法 缓存击穿 击穿解决办法&#xff1f; 缓存穿透和缓存击穿的区别&#xff1f; 缓存雪崩 雪崩解决办法&#xff1f; 如何确保缓存和数据库数据的一致性&#xff1f; 常见的缓存更新策略&#xff1f; 缓存穿透 定义&#xff1a;缓存穿透说…

[BT]BUUCTF刷题第11天(3.30)

第11天 Web&#xff08;共3题&#xff09; [网鼎杯 2018]Fakebook 打开是一个注册登录页面&#xff0c;包括用户、年龄和博客地址 查看题解知道存在robots.txt 访问http://c1392d44-63c3-4152-bf7e-89513eff1152.node5.buuoj.cn:81/robots.txt&#xff1a; User-agent: * D…

解决MySQL幻读?可重复读隔离级别背后的工作原理

什么是当前读和快照读 当前读&#xff1a;又称为 "锁定读"&#xff0c;它会读取记录的最新版本&#xff08;也就是最新的提交结果&#xff09;&#xff0c;并对读取到的数据加锁&#xff0c;其它事务不能修改这些数据&#xff0c;直到当前事务提交或回滚。"sele…

python统计分析——灵敏度、特异度和ROC曲线

参考资料&#xff1a;python统计分析【托马斯】 1、灵敏度和特异度 灵敏度&#xff1a;也叫作效能。被检验正确识别出来的阳性结果&#xff08;病人中有疾病且检验结果是阳性的概率&#xff09;。 特异度&#xff1a;被检验正确识别出来的阴性结果&#xff08;病人健康且检验结…

mysqldump备份数据库提示ERROR 1064 (42000): You have an error in your SQL syntax

在dos下备份数据库的时候提示上面的错误信息 1 错误详情 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near mysql-v at line 1错误示例图 2 解决办法 通过查资料…

vue2.0脚手架搭建

vue起步 文档 https://v2.cn.vuejs.org/ {{}} 变量、表达式渲染v-html html模板&#xff0c;渲染htmlv-model 绑定值&#xff08;双向绑定&#xff09;v-if 判断v-bind&#xff1a;href"地址" 简写&#xff1a;绑定属性 简写&#xff1a;href&#xff1a;"&qu…

OpenKylin安装Kafka

一、操作系统 openKylin 1.0.1 X86 二、下载安装包 # 安装依赖jdk sudo apt-get update sudo apt-get install default-jdk # 下载kafka mkdir -p /data/software/kafka wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.13-2.4.1.tgz三、解压安装 # 解压缩Kafka…

腾讯云2核2G服务器优惠价格,61元一年

腾讯云2核2G服务器多少钱一年&#xff1f;轻量服务器61元一年&#xff0c;CVM 2核2G S5服务器313.2元15个月&#xff0c;轻量2核2G3M带宽、40系统盘&#xff0c;云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图&#xff1a;…

【2023】kafka入门学习与使用(kafka-2)

目录&#x1f4bb; 一、基本介绍1、产生背景2、 消息队列介绍2.1、消息队列的本质作用2.2、消息队列的使用场景2.3、消息队列的两种模式2.4、消息队列选型&#xff1a; 二、kafka组件1、核心组件概念2、架构3、基本使用3.1、消费消息3.2、单播和多播消息的实现 4、主题和分区4.…

TypeScript编译器tsc的入门指南

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

货物摆放例题——(求n的所有因子+foreach循环+set集合应用)

这里写目录标题 例题引入题目分析解题方法1.暴力求解2.求n的所有的因子foreach循环 3.利用 set集合 参考文章 例题引入 题目分析 - n个都是 V1 的小正方体---》去拼成一个大的长方体---》满足nLWH - 也就是&#xff0c;在小于等于n的所有数中&#xff0c;任取3个数&#xff08…

vitess执行计划缓存 测试

打开执行计划器缓存&#xff1a; sysbench /usr/local/share/sysbench/oltp_write_only.lua --mysql-host127.0.0.1 --mysql-port15306 --mysql-userroot --mysql-password --mysql-dbcustomer --report-interval10 100s sysbench /usr/local/share/sysbench/oltp_read_only.l…

前端三剑客 —— HTML (上)

前端 前端是什么&#xff1f; 把我们的数据以各种方式&#xff08;如&#xff1a;表格、饼图、柱状图等&#xff09;呈现给用户&#xff0c;我们就可以称之为前端。 做前端需要的工具&#xff1f; notepad、editplus、notepad、VS code、webstorm等&#xff0c;一般用于前端开…

嵌入式硬件中常见的面试问题与实现

1 01 请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌) ▶电阻 美国:AVX、VISHAY威世 日本:KOA兴亚、Kyocera京瓷、muRata村田、Panasonic松下、ROHM罗姆、susumu、TDK 台湾:LIZ丽智、PHYCOM飞元、RALEC旺诠、ROYALOHM厚生、SUPEROHM美隆、TA-I大毅、TMT…

数据结构 - 算法效率|时间复杂度|空间复杂度

目录 1.算法效率 2.时间复杂度 2.1定义 2.2大O渐近表示法 2.3常见时间复杂度计算举例 3.空间复杂度 3.1定义 3.2常见空间复杂度计算举例 1.算法效率 算法的效率常用算法复杂度来衡量&#xff0c;算法复杂度描述了算法在输入数据规模变化时&#xff0c;其运行时间和空间…

路径规划——搜索算法详解(五):Dynamic A Star(D*)算法详解与Matlab代码

昨天休息了一天&#xff0c;今天继续学习搜索算法&#xff01;前几天已经分别介绍了Dijkstra算法、Floyd算法、RRT算法、A*算法&#xff0c;无独有偶&#xff0c;上述算法都只适用于静态环境下两点规划的场景&#xff0c;但是大部分场景是实时变化的&#xff0c;这对规划算法提…

阿里云4核8G服务器ECS u1实例租用优惠价格955元一年

阿里云4核8G服务器优惠价格955元一年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R) Platinum处理器&#xff0c;阿里云活动链接 aliyunfuwuq…

手写红黑树【数据结构】

手写红黑树【数据结构】 前言版权推荐手写红黑树一、理论知识红黑树的特征增加删除 二、手写代码初始-树结点初始-红黑树初始-遍历初始-判断红黑树是否有效查找增加-1.父为黑&#xff0c;直接插入增加-2. 父叔为红&#xff0c;颜色调换增加-3. 父红叔黑&#xff0c;颜色调换&am…

相机标定学习记录

相机标定是计算机视觉和机器视觉领域中的一项基本技术&#xff0c;它的主要目的是通过获取相机的内部参数&#xff08;内参&#xff09;和外部参数&#xff08;外参&#xff09;&#xff0c;以及镜头畸变参数&#xff0c;建立起现实世界中的点与相机成像平面上对应像素点之间准…

WPF中继承ItemsControl子类控件数据模板获取选中属性

需求场景 列表类控件&#xff0c;如 ListBox、ListView、DataGrid等。显示的行数据中&#xff0c;部分内容依靠选中时触发控制&#xff0c;例如选中行时行记录复选&#xff0c;部分列内容控制显隐。 案例源码以ListView 为例。 Xaml 部分 <ListView ItemsSource"{Bi…