【C语言初阶】C语言操作符全攻略:提升编程效率的关键步骤
📝个人主页🌹:Eternity._
⏩收录专栏⏪:C语言 “ 登神长阶 ”
🤡往期回顾🤡:C语言数组
🌹🌹期待您的关注 🌹🌹
❀操作符
- 📒1. 算术操作符与赋值操作符
- 💧算术操作符
- 🔥赋值操作符
- 📙2. 移位操作符与位操作符
- 🎈移位操作符
- 🎩位操作符
- 📕3. 单目操作符
- 🍁单目操作符介绍
- 🍂sizeof 和 数组
- 📚4. 关系,逻辑,条件,逗号操作符
- 🌈关系操作符
- 🌞逻辑操作符
- 🌙条件操作符
- ⭐逗号操作符
- 📜5. 下标引用、函数调用和结构成员
- 📝6. 表达式求值
- 🌄隐式类型转换
- 🏞️算术转换
- ⛰️操作符的属性
- 📖7. 总结
前言:在编程的世界里,C语言如同一座巍峨的基石,奠定了无数编程语言与软件系统的基础。作为一门历史悠久且功能强大的编程语言,C语言以其高效、灵活和可移植性赢得了广泛的赞誉和应用。而在C语言的众多组成部分中,操作符无疑是其中最为基础且关键的一环
操作符,作为编程语言中的“行动指令”,负责数据的处理、转换与决策,是编写有效、高效代码不可或缺的工具。它们如同一把把精密的钥匙,能够解锁编程世界的无限可能。然而,对于初学者而言,C语言中的操作符繁多且功能各异,往往容易让人感到困惑和迷茫
本文旨在为读者提供一个全面、深入且易于理解的C语言操作符详解。从最基本的算术操作符、关系操作符、逻辑操作符,到更高级的位操作符、赋值操作符、条件操作符等,我们将一一剖析它们的语法规则、操作原理、使用场景以及注意事项。通过丰富的示例代码和实际应用场景,帮助读者更好地理解每个操作符的作用与价值,掌握它们在编程中的灵活运用
让我们一同踏上这段充满挑战与收获的C语言操作符之旅吧!
📒1. 算术操作符与赋值操作符
💧算术操作符
算术操作符就是简单的
加减乘除
,外加一个取模
+
-
*
/
%
- 除了
%
操作符之外,其他的几个操作符可以作用于整数和浮点数- 对于
/
操作符如果两个操作数都为整数,执行整数除法。只要有浮点数执行的就是浮点数除法%
操作符的两个操作数必须为整数。返回的是整除之后的余数
🔥赋值操作符
赋值操作符是C语言(以及许多其他编程语言)中极为基础和重要的一部分。它用于将右侧表达式的值赋给左侧的变量。在C语言中,最基本的赋值操作符是单个等号(=)
代码示例 (C语言):
int main()
{int weight = 120;//体重weight = 89;//不满意就赋值double salary = 10000.0;salary = 20000.0;//使用赋值操作符赋值return 0;
}
赋值操作符也可以和其他的操作符复合使用
+=
-=
*=
/=
%=
代码示例 (C语言):
int main()
{int a = 10;a = a * 10;a *= 10; // 复合赋值return 0;
}
📙2. 移位操作符与位操作符
🎈移位操作符
移位操作符是一种在二进制层面上对数字进行平移的运算方式。它们主要包括左移操作符(<<)和右移操作符(>>)。在部分编程语言中,还可能存在无符号右移操作符(>>>),但在大多数讨论中,我们主要关注左移和右移
<< // 左移操作符
>> // 右移操作符
注意:移位操作符的操作数只能是整数
左移操作符
移位规则:左边抛弃、右边补0
右移操作符
移位规则:
- 逻辑移位: 左边用0填充,右边丢弃
- 算术移位: 左边用原该值的符号位填充,右边丢弃
警告⚠:对于移位运算符,不要移动负数位,这个是标准未定义的
int num = 10;
num>>-1; // error
🎩位操作符
位操作符是用于在二进制位级别上操作数据的运算符。在C语言等编程语言中,位操作符允许开发者直接对整数类型的变量进行位级别的操作,如设置、清除、切换或移动特定位
& // 按位与
| // 按位或
^ // 按位异或
注意:它们的操作数必须是整数
按位与(&)
对两个操作数的每一位进行比较,只有两个数的二进制表示在该位上同时为1时,结果的该位才为1,否则为0
3 & 5
// 即 00000011
// & 00000101
// = 00000001,所以 3 & 5 的值为1
按位或(|)
对两个操作数的每一位进行比较,只要两个数中的一个在该位上为1,结果的该位就为1,否则为0
2 | 4
// 即 00000010
// | 00000100
// = 00000110,所以 2 | 4 的值为6
按位异或(^)
对两个操作数的每一位进行比较,如果两个相应位不同,则该位结果为1,否则为0
2 ^ 4
// 即 00000010
// ^ 00000100
// = 00000110,所以 2 ^ 4 的值为6
^
在用于交换两个数时
代码示例 (C语言):
int main()
{int a = 10;int b = 20;a = a ^ b;b = a ^ b;a = a ^ b;printf("a = %d b = %d\n", a, b);return 0;
}
注意:并不是直接进行两次异或就能完成的,而是需要一个中间步骤,比如 a = a ^ b; b = a ^ b; a = a ^ b;(实际上可以简化为 a = a ^ b; b = a ^ b; 因为此时 a 已经变成了 a ^ b,再次与 b 异或就能得到原始的 a 值)
移位操作符与位操作也能和赋值操作符复合使用
>>=
<<=
&=
|=
^=
📕3. 单目操作符
单目操作符,顾名思义,是指只有一个操作数的操作符。在C语言等编程语言中,单目操作符在运算时通常具有较高的优先级
🍁单目操作符介绍
! // 逻辑反操作
- // 负值
+ // 正值
& // 取地址
sizeof // 操作数的类型长度(以字节为单位)
~ // 对一个数的二进制按位取反
-- // 前置、后置--
++ // 前置、后置++
* // 间接访问操作符(解引用操作符)
(类型) // 强制类型转换
代码示例 (C语言):
int main()
{int a = -10;int* p = NULL;printf("%d\n", !2);printf("%d\n", !0);a = -a;p = &a;printf("%d\n", sizeof(a));printf("%d\n", sizeof(int));return 0;
}// printf("%d\n", sizeof a);//这样写行不行? true
// printf("%d\n", sizeof int);//这样写行不行? false
🍂sizeof 和 数组
代码示例 (C语言):
void test1(int arr[])
{printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{printf("%d\n", sizeof(ch));//(4)
}
int main()
{int arr[10] = { 0 };char ch[10] = { 0 };printf("%d\n", sizeof(arr));//(1)printf("%d\n", sizeof(ch));//(3)test1(arr);test2(ch);return 0;
}
注意:数组充当函数参数时,传递的是指针
++和–运算符
代码示例 (C语言):
// 前置++和--
int main()
{int a = 10;int x = ++a;//先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。int y = --a;//先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;return 0;
}// 后置++和--
int main()
{int a = 10;int x = a++;//先对a先使用,再增加,这样x的值是10;之后a变成11;int y = a--;//先对a先使用,再自减,这样y的值是11;之后a变成10;return 0;
}
📚4. 关系,逻辑,条件,逗号操作符
🌈关系操作符
>
>=
<
<=
!= // 用于测试“不相等”
== // 用于测试“相等”
注意:在编程的过程中== 和=不小心写错,导致的错误
🌞逻辑操作符
&& // 逻辑与
|| // 逻辑或
区分逻辑与和按位与
1&2----->0
1&&2---->1
区分逻辑或和按位或
1|2----->3
1||2---->1
🌙条件操作符
exp1 ? exp2 : exp3 // 三目操作符
(a > b) ? a : b;
// 如果a > b成立则结果返回a,否则返回b
⭐逗号操作符
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1); // 逗号表达式 c = 13
📜5. 下标引用、函数调用和结构成员
[ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
int arr[10]; // 创建数组
arr[9] = 10; // 实用下标引用操作符。
// [ ]的两个操作数是arr和9
( ) 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
代码示例 (C语言):
void test1()
{printf("hehe\n");
}
void test2(const char* str)
{printf("%s\n", str);
}
int main()
{test1(); //实用()作为函数调用操作符。test2("hello bit.");//实用()作为函数调用操作符。return 0;
}
访问一个结构的成员
.
结构体.
成员名->
结构体指针->
成员名
代码示例 (C语言):
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;
}
📝6. 表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型
🌄隐式类型转换
C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长
度
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算
char a,b,c;
...
a = b + c;
b和c的值被提升为普通整型,然后再执行加法运算,加法运算完成之后,结果将被截断,然后再存储于a中
如何进行整体提升呢?
//负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111//正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
//无符号整形提升,高位补0
代码示例 (C语言):
int main()
{char a = 0xb6;short b = 0xb600;int c = 0xb6000000;if(a==0xb6)printf("a");if(b==0xb600)printf("b");if(c==0xb6000000)printf("c");return 0;
}
a,b进行整体提升,但是c不需要整形提升,所以只有c==0xb6000000是真的
🏞️算术转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算,但是算术转换要合理,要不然会有一些潜在的问题
float f = 3.14;
int num = f;//隐式转换,会有精度丢失
⛰️操作符的属性
复杂表达式的求值有三个影响的因素
- 操作符的优先级
- 操作符的结合性
- 是否控制求值顺序
📖7. 总结
在结束这篇关于C语言操作符详解的深入探索之旅时,我们不禁感慨于C语言操作符的丰富与强大。这些看似简单的符号,在编程的舞台上扮演着举足轻重的角色,它们如同构建编程逻辑的砖石,一块块堆砌起复杂而精妙的程序大厦
通过本文的学习,我们不仅掌握了C语言中基本算术操作符、关系操作符、逻辑操作符、赋值操作符以及位操作符等的用法与特性,还深刻理解了它们在不同场景下的应用技巧和注意事项。我们学会了如何运用这些操作符来解决实际问题,从简单的数值计算到复杂的条件判断,再到高效的位级操作,每一步都见证了操作符在C语言编程中的不可替代性
因此,我们鼓励每一位读者在掌握基础知识的同时,保持对新知识的好奇心和学习热情。不断实践、不断思考、不断总结,将所学知识融会贯通,形成自己的编程风格和思维模式。只有这样,我们才能在编程的道路上越走越远,最终成为真正的编程高手
希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!
谢谢大家支持本篇到这里就结束了,祝大家天天开心!
相关文章:

【C语言初阶】C语言操作符全攻略:提升编程效率的关键步骤
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言数组 🌹🌹期待您的关注 🌹🌹 ❀操作符 📒1. 算术操作…...

2007-2023年上市公司金融化程度测算数据(含原始数据+计算代码+计算结果)
2007-2023年上市公司金融化程度测算数据(含原始数据计算代码计算结果) 1、时间:2007-2023年 2、指标:行业代码、行业名称、stkcd、year、证券简称、是否发生ST或ST或PT、是否发生暂停上市、股票简称、成立日期、交易性金融资产、…...

【时时三省】(C语言基础)操作符
山不在高,有仙则名。水不在深,有龙则灵。 ——csdn时时三省 算术操作符 这个时候打印出来的是整数 不会打印小数点后面的数字 因为它是int类型 只用把他换成浮点型并且它的两个数里面有一个必须是小数 才可以算出来小数 示例: %操作符的两个操作数必…...

常用API(三)
对于常见API的学习,主要学习了关于时间和日期的传统和新增APi 目录 1.Math 2.System 3.Runtime 4.日期和时间 (1)JDK8前传统时间API [1] Date [2] SimpledateFormat [3]Calendar (2)JDK8后新增时间API [1]代替…...

内存管理问题总结
内存管理 虚拟内存 我们程序所使⽤的内存地址叫做虚拟内存地址(Virtual Memory Address) 实际存在硬件⾥⾯的空间地址叫物理内存地址(Physical Memory Address) 操作系统引⼊了虚拟内存,进程持有的虚拟地址会通过 …...

十七、Intellij IDEA2022.1.1下载、安装、激活
目录 🌻🌻 一、下载二、 安装三、激活 一、下载 官网下载地址 本地直接下载 目前Intellij IDEA的最新版本已经更新到了 2024.1.4,由于最新版本可能存在不稳定的问题,此处选择其他版本进行下载,此处以2022.1.1为例进行下…...

【Material-UI】Button Group 中的 Disabled Elevation 功能
文章目录 一、Button Group 组件概述二、什么是 Elevation?三、为什么需要禁用 Elevation?四、使用 disableElevation 属性五、属性解析1. disableElevation 属性2. variant 属性3. aria-label 属性 六、应用场景1. 表单操作2. 工具栏3. 导航按钮 七、样…...
Java RESTful API 测试:使用 RestAssured
Java RESTful API 测试:使用 RestAssured 简介 在现代软件开发中,RESTful API扮演着至关重要的角色。API的测试同样重要以确保它们按预期工作。Java中的RestAssured库提供了一种简单直观的方式来测试RESTful Web服务。本文将介绍RestAssured的基本概念…...
将nestjs项目迁移到阿里云函数
注意:长耗时,高内存 的应用,定时任务 不适合迁移。 根据模板创建项目 一、模板配置修改 1.node版本修改 由于我的nestjs项目是node18的需要修改 pre-deploy项目: 改成 resources:framework:component: fc3actions:pre-deploy:-…...
边缘计算×AI:绘制未来实时智能的宏伟蓝图
引言:时代的召唤 随着物联网技术的飞速发展,数以亿计的传感器和智能设备正不断涌入我们的生活和工作空间,它们生成的数据量级之大,远非传统的集中式云处理所能高效应对。因此,一种新兴的数据处理模式——边缘计算&…...

实现关系运算符的重载
全局函数的实现法: 成员函数实现法:...

【css】使用CSS绘制奥运五环--巴黎奥运
使用CSS绘制奥运五环 在2024年巴黎奥运会期间,本文来使用 CSS 来画一个奥运五环。奥运五环由五个相互交叠的圆环组成,分别代表五大洲。 奥运五环是相互连接的,因此在视觉上会产生重叠效果,这也是实现五环最有挑战性的部分 HTML结…...
【Python数据处理】MatplotlibNumpyPandas常用API整理
目录 Matplotlib 1. 导入 Matplotlib 并创建图布 2. 实现基础绘图 2.1 折线图 2.2 柱状图 2.3 散点图 2.4 直方图 3. 完善绘图辅助功能 3.1 添加标题和标签 3.2 添加网格线 3.3 添加图例 4. 在一个坐标系下绘制多个图像 5. 在一个图形窗口创建多个子图 5.1 使用 a…...
Nacos是阿里巴巴开源的一款分布式服务注册中心和配置中心
Nacos是阿里巴巴开源的一款分布式服务注册中心和配置中心,旨在帮助开发人员更轻松地构建和管理微服务架构。以下是关于Nacos的详细介绍: 一、概述 Nacos是Dynamic Naming and Configuration Service(动态命名和配置服务)的缩写&a…...

条形码与二维码报表
概述 条形码与二维码:演示条形码与二维码,条形码数据将来自于关联的字段值。支持各种常用的条形码与二维码。 应用场景 如下图所示,简单展示数据 示例说明 数据准备 在数据面板中添加数据集,可选择Json数据集和API服务数据…...
数据采集工具之Flume
本文主要实现数据到datahub的采集过程 1、下载 Index of /dist/flume/1.11.0 datahub插件下载 https://aliyun-datahub.oss-cn-hangzhou.aliyuncs.com/tools/aliyun-flume-datahub-sink-2.0.9.tar.gz 2、安装 $ tar aliyun-flume-datahub-sink-x.x.x.tar.gz $ cd aliyun-…...

【24年最新】AI大模型零基础入门到精通学习资料大全,学完你就是LLM大师!
零基础如何学习大模型 AI 领取方式在文末 为什么要学习大模型? 学习大模型课程的重要性在于它能够极大地促进个人在人工智能领域的专业发展。大模型技术,如自然语言处理和图像识别,正在推动着人工智能的新发展阶段。通过学习大模型课程&am…...
使用RabbitMQ死信交换机实现延迟消息
文章目录 什么是死信交换机?死信交换机实现延迟消息的思路实现过程配置类消费者监听死信队列发送延迟消息 注意事项总结 在开发过程中,我们常常会遇到需要延迟处理某些消息的场景,例如订单的支付超时处理、短信的定时发送等。本文将介绍如何使…...

overleaf上latex表格的使用,latex绘制三线表
三线表需要的包、代码及其示例解释。 一般需要用到的包: \usepackage{tabu} % 表格插入 \usepackage{multirow} % 一般用以设计表格,将所行合并 \usepackage{multicol} % 合并多列 \usepackage{m…...

聚焦光热型太阳光模拟器助力多晶硅均匀加热
晶圆均匀加热技术综述 晶圆均匀加热是半导体制造过程中的关键技术之一,直接影响着晶圆上各种加工工艺的质量和稳定性。晶圆加热的目的在于化学气相沉积、退火、氧化等工艺中,通过对晶圆进行必要的热处理,以促进或优化后续工艺步骤。不均匀的…...
Hadoop复习(二)
部署Hadoop 考试不考部署,就复习选择和大题 问题 1 单项选择 2 / 2 分 下面哪个是MapReduce的核心配置文件 core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml 问题 2 单项选择 2 / 2 分 下面哪个是HDFS的核心配置文件 core-site.xml hdf…...

《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡
《Discuz! X3.5开发从入门到生态共建》第1章 Discuz! 的前世今生-优雅草卓伊凡 第一节 从康盛创想到腾讯收购:PC时代的辉煌 1.1 Discuz! 的诞生:康盛创想的开源梦想 2001年,中国互联网正处于萌芽阶段,个人网站和论坛开始兴起。…...

【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解
【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解 一、前言:移动开发声明式 UI 框架的技术变革 在移动操作系统的发展历程中,UI 开发模式经历了从命令式到声明式的重大变革。 根据华为开发者联盟 2024 年数据报告显示,HarmonyOS 设备…...
Node.js 项目调试指南
Node.js 项目调试指南 🧭 一、调试工具和方式总览 方式难度场景说明console.log 调试★简单问题定位最常见,但效率低debug 模块★★模块化输出日志支持命名空间的调试日志VSCode 断点调试★★★跟踪函数调用、变量状态推荐使用node inspect / ndb★★★…...

【笔记】Windows 下载并安装 ChromeDriver
以下是 在 Windows 上下载并安装 ChromeDriver 的笔记: ✅ Windows 下载并安装 ChromeDriver 1️⃣ 确认 Chrome 浏览器版本 打开 Chrome 浏览器 点击右上角 ︙ → 帮助 → 关于 Google Chrome 记下版本号,例如:114.0.5735.199 2️⃣ 下载…...

AI入门——AI大模型、深度学习、机器学习总结
以下是对AI深度学习、机器学习相关核心技术的总结与拓展,结合技术演进逻辑与前沿趋势,以全新视角呈现关键知识点 一、深度学习:从感知到认知的技术革命 核心突破:自动化特征工程的范式变革 深度学习通过多层神经网络架构&#x…...

LangChain-结合GLM+SQL+函数调用实现数据库查询(一)
业务流程 实现步骤 1. 加载数据库配置 在项目的根目录下创建.env 文件,设置文件内容: DB_HOSTxxx DB_PORT3306 DB_USERxxx DB_PASSWORDxxx DB_NAMExxx DB_CHARSETutf8mb4 加载环境变量,从 .env 文件中读取数据库配置信息 使用 os.getenv…...

数字创新智慧园区建设及运维方案
该文档是 “数字创新智慧园区” 建设及运维方案,指出传统产业园区存在管理粗放等问题,“数字创新园区” 通过大数据、AI、物联网、云计算等数字化技术,旨在提升园区产业服务、运营管理水平,增强竞争力,实现绿色节能、高效管理等目标。建设内容包括智能设施、核心支撑平台、…...

搭建基于VsCode的ESP32的开发环境教程
一、VsCode搜索ESP-IDF插件 根据插件处搜索找到ESP-IDF并安装 安装完成 二、配置安装ESP-IDF 配置IDF 按照如下配置,点击安装 安装完成 三、使用案例程序 创建一个闪光灯的例子程序,演示程序编译下载。 选择blink例子,闪烁LED的程序 选…...
【Go-6】数据结构与集合
6. 数据结构与集合 数据结构是编程中用于组织和存储数据的方式,直接影响程序的效率和性能。Go语言提供了多种内置的数据结构,如数组、切片、Map和结构体,支持不同类型的数据管理和操作。本章将详细介绍Go语言中的主要数据结构与集合…...