深度探索 C 语言操作符:从基础到实战应用

前言:

    在 C 语言的编程体系中,操作符就像是一个个精密的齿轮,相互配合驱动着程序的运转。熟练掌握操作符的使用,不仅能编写出高效、简洁的代码,还能深入理解程序运行的底层逻辑。接下来,让我们一同深入探索 C 语言操作符的奥秘

目录

一、操作符的分类全景

二、算术操作符:数值运算的基石

三、移位操作符:二进制世界的舞者

四、位操作符:深入二进制的核心

五、赋值操作符:数据传递的纽带

六、单目操作符:功能强大的 “独行侠”

七、关系操作符和逻辑操作符:程序逻辑的导航仪

八、条件操作符和逗号表达式:灵活编程的秘籍

九、下标引用、函数调用和结构成员操作符:C 语言中的重要工具

1、下标引用操作符 []

2、函数调用操作符 ()

3、结构成员操作符 . 和 ->

十、表达式求值:背后的规则与陷阱

一、操作符的分类全景

     C 语言的操作符种类丰富,涵盖算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式,以及下标引用、函数调用和结构成员操作符等。它们各司其职,在不同的编程场景中发挥着关键作用

二、算术操作符:数值运算的基石

    算术操作符是编程中最常用的操作符之一,包括+(加法)、-(减法)、*(乘法)、/(除法)和%(取余)。除了%操作符仅适用于整数运算外,其他操作符对整数和浮点数均适用,在进行除法运算时,若两个操作数都是整数,执行的是整数除法,结果会舍去小数部分。例如:

    上述代码中,7 / 3的结果为2,因为整数除法会舍弃小数部分。

    若操作数中有浮点数,则执行浮点数除法,结果会保留小数部分:

    在这段代码里,7.0 / 3的结果为2.333333,这体现了浮点数除法的特性。

 %操作符用于计算两个整数相除后的余数,例如:

    这里7 % 3的结果是1,即7除以3的余数 。

三、移位操作符:二进制世界的舞者

    移位操作符分为左移操作符 <<和右移操作符 >>,它们直接对二进制位进行操作。左移操作符的规则是左边抛弃,右边补 0。例如,将整数5(二进制表示为:00000000000000000000000000000101)左移一位:

    执行代码后,shiftedLeft的值为10,因为左移一位后,二进制变成00000000000000000000000000001010,转换为十进制就是10

    右移操作符的移位规则较为复杂,分为逻辑移位和算术移位。

    逻辑移位:左边用 0 填充,右边丢弃;

  算数右移:左边用原数的符号位填充,右边丢弃。例如,对于负数-1(补码为11111111111111111111111111111111):

 警告: 对于移位运算符,不要移动负数位,这个是标准未定义的

四、位操作符:深入二进制的核心

     位操作符包括按位与&、按位或|和按位异或^,操作数必须是整数。这些操作符在处理二进制数据时非常有用。
    按位与操作可以用于判断一个数的某些位是否为 1。例如,判断一个整数的最低位是否为 1:

     在这段代码中,num & 1num的二进制表示与00000000000000000000000000000001进行按位与操作。如果结果不为 0,则说明num的最低位是 1。

练习1 :不能创建临时变量(第三个变量),实现两个数的交换

   

    这段代码利用按位异或的特性,巧妙地实现了两个数的交换,避免了使用额外的临时变量,提高了代码的效率

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

    

五、赋值操作符:数据传递的纽带

    赋值操作符=用于将右侧的值赋给左侧的变量,它还支持连续赋值。例如:

    在这段代码中,a = b = c = 10从右向左依次赋值,最终abc的值都为10

    此外,还有复合赋值符,如+=-=*=/=等,这些操作符可以简化代码。例如,a += 5等价于a = a + 5

    使用复合赋值符不仅代码更简洁,还能提高编程效率。 

六、单目操作符:功能强大的 “独行侠”

    单目操作符只需要一个操作数,功能多样。例如,逻辑反操作!可以将真(非 0)变为假(0),将假变为真:

     sizeof操作符用于计算操作数的类型长度(以字节为单位):

    这里sizeof(num)返回num所占用的字节数,sizeof(char)返回char类型占用的字节数。不同系统下,这些值可能会有所不同,但在常见的 32 位和 64 位系统中,int通常为 4 字节,char为 1 字节 

七、关系操作符和逻辑操作符:程序逻辑的导航仪

    关系操作符用于比较两个值的大小关系,包括>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、!=(不等于)和==(等于)。在使用时,要特别注意===的区别,避免因写错而导致逻辑错误。例如:

    这段代码通过关系操作符判断ab的大小关系,并根据判断结果执行相应的代码块。

    逻辑操作符包括逻辑与&&和逻辑或||,用于组合多个条件。逻辑与操作只有当所有条件都为真时,结果才为真;逻辑或操作只要有一个条件为真,结果就为真。例如:

     在这段代码中,&&||分别组合了多个条件,控制程序的执行流程

八、条件操作符和逗号表达式:灵活编程的秘籍

    条件操作符exp1? exp2 : exp3是一种简洁的选择结构,根据exp1的真假来决定执行exp2还是exp3。例如,求两个数中的较大值:

    这段代码使用条件操作符简洁地求出了ab中的较大值(如果a>b为真就执行a,反之,执行b)

    逗号表达式exp1, exp2, exp3, …expN从左向右依次执行,整个表达式的结果是最后一个表达式的结果。例如:

    在这段代码中,逗号表达式先执行a++b++,然后计算a + b的值并赋给c。最终c的值为5,因为a++b++执行后,a变为2b变为3a + b即为5

九、下标引用、函数调用和结构成员操作符:C 语言中的重要工具

    在 C 语言丰富的操作符家族中,下标引用、函数调用和结构成员操作符是进行数据访问和函数执行的关键元素,它们各自有着独特的功能和使用方式

1、下标引用操作符 []

    下标引用操作符用于访问数组中的元素。它的操作数为一个数组名和一个索引值。

    在 C 语言中,数组是一种重要的数据结构,用于存储多个相同类型的数据。通过下标引用操作符,可以方便地访问数组中的特定元素。例如:

    在上述代码中,[] 的两个操作数分别是数组名 arr 和索引值 9。需要注意的是,C 语言中的数组索引是从 0 开始的,这意味着对于一个长度为 n 的数组,合法的索引范围是 0 到 n - 1。如果使用了超出这个范围的索引,会导致未定义行为,可能引发程序崩溃或产生错误的结果。

    此外,下标引用操作符还可以与指针结合使用。在 C 语言中,数组名在很多情况下会被隐式转换为指向数组首元素的指针。因此,arr[i] 和 *(arr + i) 是等价的,它们都表示访问数组 arr 中索引为 i 的元素。例如:

2、函数调用操作符 ()

    函数调用操作符用于调用函数。它接受一个或者多个操作数,第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

    函数是 C 语言中实现模块化编程的重要手段,通过函数调用操作符,可以执行预先定义好的函数逻辑。例如:

    在上述代码中,add 是函数名,作为函数调用操作符 () 的第一个操作数,3 和 5 是传给 add 函数的参数。函数调用操作符会触发函数的执行,函数执行完毕后会返回一个值(在这个例子中,add 函数返回两个参数的和),可以将这个返回值赋值给变量或者进行其他操作。

    函数调用操作符的灵活性很高,不仅可以传递常量作为参数,还可以传递变量、表达式等。同时,函数也可以没有参数,例如:

     在这个例子中,printHello 函数没有参数,调用时只需要使用函数名和空的函数调用操作符 () 即可。

3、结构成员操作符 . 和 ->

    结构是 C 语言中用于将不同类型的数据组合在一起的一种自定义数据类型。结构成员操作符用于访问结构中的成员。

 '.' 操作符:当使用结构变量来访问成员时,使用 . 操作符。例如:

    在上述代码中,stu 是 struct Student 类型的变量,通过 . 操作符,stu.name 访问结构体中的 name 成员,stu.age 访问 age 成员 

 -> 操作符:当使用指向结构的指针来访问成员时,使用 -> 操作符。例如:

    在这个例子中,ptr 是指向 struct Student 类型的指针,通过 -> 操作符,ptr->name 和 ptr->age 分别访问结构体 stu 中的 name 和 age 成员。实际上,ptr->name 等价于 (*ptr).name-> 操作符提供了一种更简洁的方式来通过指针访问结构体成员。

    下标引用、函数调用和结构成员操作符在 C 语言编程中扮演着不可或缺的角色。熟练掌握它们的使用方法,能够帮助开发者更加高效地进行数据处理和函数调用,构建出结构清晰、功能强大的程序。

十、表达式求值:背后的规则与陷阱

    表达式求值的顺序受到操作符优先级、结合性以及是否控制求值顺序等因素的影响。在进行表达式求值时,还可能涉及隐式类型转换和算术转换。
    隐式类型转换是为了保证整型运算的精度,会将字符和短整型操作数在使用前转换为普通整型。例如:

    字符 'A' 和 'B' 在参与 a + b 运算时,由于 C 语言的整型算术运算总是至少以缺省整型类型(通常为 int 类型)的精度来进行,所以会先进行整型提升。'A' 的 ASCII 码值是 65,'B' 的 ASCII 码值是 66 ,它们在进行整型提升时,会将其对应的 ASCII 码值按照 int 类型的长度进行扩展:

  • 对于有符号 char 类型(很多编译器下默认 char 是有符号的),如果 char 类型的最高位(符号位)为 0,就在高位补 0;如果最高位为 1,就在高位补 1(有符号位补符号位)。
  • 对于无符号 char 类型,无论原 char 类型数据的最高位是什么,都在高位补 0(没符号位补0)。

    这里 'A' 和 'B' 的 ASCII 码值对应的二进制最高位都是 0,所以整型提升后高位补 0,然后再进行加法运算,65 + 66 = 131,最终 result 的值为 131。

    如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换

    如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运 算

     但要注意,不合理的算术转换可能会导致精度丢失等问题。例如:

    在这段代码中,float类型的f转换为int类型时,小数部分会被截断,导致精度丢失。

    有些表达式由于操作符优先级和结合性无法确定唯一的计算路径,结果是不可预测的,属于有问题的表达式。例如:

    在不同的编译器中,这段代码的结果可能不同,因为i++++i的执行顺序无法通过操作符的优先级和结合性确定。在编写代码时,应尽量避免写出这样的表达式,确保程序的正确性和稳定性。

   C 语言操作符是编程中不可或缺的一部分,深入理解和熟练运用它们,能够帮助我们编写出更加高效、稳定的程序。希望通过本文的介绍,大家对 C 语言操作符有更全面、更深入的认识,在编程实践中能够灵活运用这些知识,解决各种实际问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始实现一个双向循环链表:C语言实战

文章目录 1链表的再次介绍2为什么选择双向循环链表&#xff1f;3代码实现&#xff1a;从初始化到销毁1. 定义链表节点2. 初始化链表3. 插入和删除节点4. 链表的其他操作5. 打印链表和判断链表是否为空6. 销毁链表 4测试代码5链表种类介绍6链表与顺序表的区别7存储金字塔L0: 寄存…

简单本地部署deepseek(软件版)

Download Ollama on Windows 下载 下载安装 winr 输入 cmd 然后输入ollama -v&#xff0c;出现ollama版本&#xff0c;安装成功 deepseek-r1 选择1.5b 输入 cmd 下面代码 ollama run deepseek-r1:1.5b 删除deepseek的代码如下&#xff1a; ollama rm deepseek-r1:1.5b 使用…

21.2.1 基本操作

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 Excel的基本操作步骤&#xff1a; 1、打开Excel&#xff1a;定义了一个Application对象&#xff1a; Microsoft.Office.Interop.E…

SGlang 专为大模型设计的高效服务框架

SGlang 是一种专为大型语言模型&#xff08;LLM&#xff09;和视觉语言模型&#xff08;VLM&#xff09;设计的高效服务框架&#xff0c;旨在提升模型的推理速度和灵活性。以下是关于 SGlang 框架的详细介绍&#xff1a; 1. 框架背景与目标 SGlang 是一种快速服务框架&#x…

基于SpringBoot+vue高效旅游管理系统

Spring Boot后端与Vue前端融合&#xff1a;构建高效旅游管理系统 目录 一、项目简介 二、开发技术与环境配置 2.1 SpringBoot框架 2.2 Java语言简介 2.3 Vue的介绍 2.4 mysql数据库介绍 2.5 B/S架构 三、系统功能实现 四、系统项目截图 登录页面 后台管理页面 用户…

visual studio安装

一、下载Visual Studio 访问Visual Studio官方网站。下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 在主页上找到并点击“下载 Visual Studio”按钮。 选择适合需求的版本&#xff0c;例如“Visual Studio Community”&#xff08;免费版本&#xff09;&#x…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)

目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…

Java中的object类

1.Object类是什么&#xff1f; &#x1f7ea;Object 是 Java 类库中的一个特殊类&#xff0c;也是所有类的父类(超类),位于类继承层次结构的顶端。也就是说&#xff0c;Java 允许把任何类型的对象赋给 Object 类型的变量。 &#x1f7e6;Java里面除了Object类&#xff0c;所有的…

manimgl安装

一、环境 笔记本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy二、安装miniconda3 manimgl基于python开发&#xff0c;为了防止将笔记本中已有的python环境破坏&#xff0c;因此…

c++中priority_queue的应用及模拟实现

1.介绍 priority_queue 是一种数据结构&#xff0c;它允许你以特定的顺序存储和访问元素。在 C 标准模板库&#xff08;STL&#xff09;中&#xff0c;priority_queue 是一个基于容器适配器的类模板&#xff0c;它默认使用 std::vector 作为底层容器&#xff0c;并且默认使用最…

【技术追踪】DiffMIC:用于医学图像分类的双引导扩散网络(MICCAI-2024)

似乎是第一个用于医学图像分类的扩散模型嗷~ 论文&#xff1a;DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification 代码&#xff1a;https://github.com/scott-yjyang/DiffMIC 0、摘要 扩散概率模型最近在生成式图像建模中表现出了显著的性能&#xf…

Deepseek v3R1 学习笔记

o1 o1 模型在训练过程中混合了多种奖励函数的设计方法&#xff0c;并且尝试从结果监督转向过程监督&#xff0c;在中间过程进行打分 使用的搜索策略&#xff1a;基于树的搜索和基于顺序修改的搜索 R1 R1-Zero 是从基础模型开始&#xff0c;完全由强化学习驱动&#xff0c;不…

技术书籍写作与编辑沟通指南

引言 撰写技术书籍不仅仅是知识的输出过程&#xff0c;更是与编辑团队紧密合作的协同工作。优秀的技术书籍不仅依赖作者深厚的技术背景&#xff0c;还需要精准的表达、流畅的结构以及符合出版要求的编辑润色。因此&#xff0c;如何高效地与编辑沟通&#xff0c;确保书籍质量&a…

DeepSeek+Ollama+AnythingLLM 本地部署完全指南,打造专属知识库

DeepSeekOllamaAnythingLLM 本地部署完全指南&#xff0c;打造专属知识库 1 Ollama 本地化部署DeepSeek R1 Ollama 是一个用于本地运行大语言模型&#xff08;LLMs&#xff09;的开源工具&#xff0c;提供简单的界面和优化的推理引擎 &#xff0c;使用户能够在个人设备上高效…

更换IP属地会影响网络连接速度吗

在数字化时代&#xff0c;网络连接速度对于个人用户和企业来说都至关重要。无论是日常浏览网页、观看视频&#xff0c;还是进行在线办公、游戏娱乐&#xff0c;网络速度都直接影响着我们的体验。而IP属地&#xff0c;作为网络连接中的一个重要元素&#xff0c;其变动是否会引发…

2025 持续防范 GitHub 投毒,通过 Sharp4SuoExplorer 分析 Visual Studio 隐藏文件

在2024年底的网络安全事件中&#xff0c;某提权工具被发现植入后门&#xff0c;攻击者利用 .suo 文件作为隐蔽的攻击方式。由于 .suo 文件是 Visual Studio 项目的隐藏配置文件&#xff0c;通常不为安全研究人员所关注&#xff0c;因此为攻击者提供了潜在的攻击渠道。 初步调查…

每日Attention学习19——Convolutional Multi-Focal Attention

每日Attention学习19——Convolutional Multi-Focal Attention 模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Convolutional Multi-Focal Atte…

【自然语言处理(NLP)】NLP实战:IMDB影评情感分析项目

文章目录 介绍IMDB影评情感分析项目数据集项目实现1. 导包2. 加载IMDB数据3. 查看部分数据4. 分词5. 加载数据整合6. 构建模型7. 词嵌入8. 初始化模型和权重9. glove词向量10. 训练和评估11. 预测 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 介…

企业高效管理策略中的关键一环:WorkWin 监控上网时间的软件的效能剖析

在企业日常运营体系中&#xff0c;员工工作效率与网络资源的合理配置&#xff0c;始终是企业管理者重点关注的核心议题。伴随互联网的广泛普及&#xff0c;员工在工作时段内的网络使用行为日益常态化。然而&#xff0c;若缺乏行之有效的上网时间管控机制&#xff0c;极易导致员…

Spring AI 智能体通过 MCP 集成本地文件数据

作者&#xff1a;刘军 Model Context Protocol&#xff08;MCP&#xff09;简介 模型上下文协议&#xff08;即 Model Context Protocol&#xff0c;MCP&#xff09; [ 1] 是一个开放协议&#xff0c;它规范了应用程序如何向大型语言模型&#xff08;LLM&#xff09;提供上下…