C语言中那些后知后觉的细节冷知识(二)typedef、死循环、位移、内存访问

系列文章目录

C语言中那些后知后觉的细节冷知识(一)static、const、volatile、数组、宏
C语言中那些后知后觉的细节冷知识(二)typedef、死循环、位移、内存访问
持续更新中… …


文章目录

  • 系列文章目录
  • 前言
  • 一、typedef
  • 二、死循环
  • 三、位移
  • 四、内存访问
  • 总结


前言

C语言诞生于1972年11月,由美国电话电报公司(AT&T)贝尔实验室的丹尼斯·里奇(Dennis Ritchie)发明,在1978年,美国电话电报公司(AT&T)贝尔实验室正式发布了C语言。C语言作为一种经典的编程语言,时至今日,仍然在许多领域仍然被广泛使用,并且仍然是一种强大、高效和灵活的编程语言。
学习C语言对于初学者来说可能有一定的难度,因为C语言是一种比较底层的编程语言,它提供了更接近计算机硬件的控制能力。与一些更高级的编程语言相比,C语言在语法和概念上可能更加复杂,需要更多的时间和精力来学习和掌握。
今天继续分享一些C语言的细节冷知识,主要涉及typedef、死循环、位移、直接内存访问等,希望对大家有所帮助。


一、typedef

在C语言中,typedef关键字用于为一个已经存在的类型创建一个新的名字。它通常用于帮助你简化代码、提高可读性,并为底层数据类型提供抽象。经常被用于为基本数据类型定义别名、为结构体定义别名、为枚举定义别名、为函数指针定义别名等。
与其比例类似的是宏定义#define,需要注意区别。比如以下例子:

#define dS struct s * typedef struct s * tS; 

以上两种情况的都是要定义dS 和 tS 作为一个指向结构s指针。哪种方法更好呢?答案是:typedef更好。思考下面的例子:

dS p1,p2;tS p3,p4;

第一个例子在宏定义展开替换后为“Struct s * p1, p2;”,定义p1为一个指向结构体的指针,而p2为一个实际的结构。而第二个例子正确的定义了p3和p4两个指向结构体的指针。
所以一般在用于为一个已经存在的类型创建一个新的名字时,应尽量使用typedef,而不是#define。

二、死循环

死循环即无限循环,其实是普通的循环结构,但是没有退出循环的条件,即实现了无限循环。C语言中一般有以下几种方式实现死循环:
1、while(1){ … … }
2、for(;😉{ … … }
3、结合goto,如:
Loop:
… …
goto Loop;

推荐使用第一种while(1);如果使用第二种for(;😉,你也要了解为什么这样写for语句代表无限循环(其实就是第二个“;”语句中未填写退出for循环的条件造成的);第三种比较少用,可能经常写汇编语言的程序员会使用这种方式,但是不推荐。在C语言中,goto语句是一种控制流语句,允许程序无条件地跳转到程序中的另一个位置,但是很多的编码标准都谈及了避免或限制使用goto,主要原因是使用goto会降低代码的可读性、破坏程序的结构化、增加调试难度等。

三、位移

在C语言中,位移操作被广泛应用于各种场景,主要是由于其能够高效地操作二进制数据。位移操作通常比乘法和除法操作更快,因此在对性能有要求的计算场景中,可以使用位移来替代乘法和除法(左移N位相当于乘以2的N次幂,右移N位则相当于除以2的N次幂)。
在C语言中使用位移操作符(左移 << 和右移 >>)时,需要注意以下几点:
1、操作数的类型:位移操作符通常应用于整数类型(如short 、int、long等)的操作数。对浮点数应用位移操作符是未定义的行为(各位可以查一查浮点数在内存中的存储方式,就知道为什么了);
2、符号位:对于有符号整数,位移操作可能会涉及到符号位(最高位)。左移时,符号位会被“推出去”,并从另一端补入新的位(通常是0,但取决于具体的实现)。右移时,符号位的行为取决于编译器:算术右移(保留符号位)或逻辑右移(不保留符号位);
3、位移量:位移量应该是非负整数,并且小于或等于被操作数类型的位数。例如,对于32位整数,有效的位移量范围是0到31。超出这个范围的位移量可能导致未定义的行为。在实际编程中,通常会使用无符号类型(如 unsigned int)的变量来存储位移量,以避免负值;
4、无符号整数与有符号整数的区别:对于无符号整数,位移操作通常是逻辑移位,即左移时补0,右移时也补0。而对于有符号整数,右移可能是算术移位(保留符号位)。

四、内存访问

C语言主要运用于嵌入式系统中,而嵌入式系统经常会要求程序员去访问某特定的内存位置,主要的方式就是采用将绝对地址的整型数强制转换为指针,从而进行内存访问。比如:

int *ptr;
ptr = (int *)0x123456;
*ptr = 0xAABB;
//或者
*(int *)(0x123456) = 0xAABB;

上述代码可以实现对绝对地址为0x123456的内存赋值为0xAABB的目的。


总结

以上都是一些C语言的基础,但却又是平时编程中很容易因为疏忽出现问题的地方。更多的细节冷知识将在后续系列文章中持续更新,希望对大家有所帮助。

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

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

相关文章

Qt之漂亮的地球

这个画的是一个东西围绕着中心的地球不停的旋转&#xff0c;可以放在界面的中部&#xff0c;增加美感。 展示 界面展示 设计过程 标题在之前的博客有写过&#xff0c;这里不再重复 下面是关于地球旋转的相关 1.资源文件添加 先将相关的资源文件添加&#xff0c;三个图片 2…

【lesson32】MySQL用户管理

文章目录 用户管理介绍用户用户信息创建用户 删除用户修改用户密码数据库的权限给用户授权回收权限 用户管理介绍 用户 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 //操作语法 mysql> use mysql; Database changed mysql> select host,use…

微信小程序封装wx.request以及小程序登录

1.封装wx.request const GET GET; const POST POST; const PUT PUT; const FORM FORM; const DELETE DELETE;const baseURL https://alimini.ck9696.com/wxmall; // const baseURL http://192.168.0.17:8601/wxmall; var app getApp(); function request(method, url…

VR全景技术可以应用在哪些行业,VR全景技术有哪些优势

引言&#xff1a; VR全景技术&#xff08;Virtual Reality Panorama Technology&#xff09;是一种以虚拟现实技术为基础&#xff0c;通过360度全景影像、立体声音、交互元素等手段&#xff0c;创造出沉浸式的虚拟现实环境。该技术不仅在娱乐领域有着广泛应用&#xff0c;还可…

ABAC模型简单介绍——通过casbin进行简单举例

ABAC模型简单介绍——通过casbin进行简单举例 文章目录 ABAC模型简单介绍——通过casbin进行简单举例定义相关术语Casbin实现ABAC&#xff08;Python版&#xff09;假设情境定义对象定义静态模型模板测试代码最终结果 相关链接 定义 Attribute Based Access Control (基于属性…

Git使用命令大全

命令大全参考阮一峰的博客&#xff0c;根据自己的使用习惯作了调整。 Git常用命令 其他常用的命令 配置Git # 显示当前的Git配置 $ git config --list# 编辑Git配置文件 $ git config -e [--global]# 设置提交代码时的用户信息 $ git config [--global] user.name "[nam…

第14章_视图

第14章_视图 1.常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c; 程序员通常不…

MDK Keil uVision5 cannot read project file 解决办法

MDK Keil uVision5 cannot read project file 解决办法 问题描述 我的系统重装过后是英文版的Windows 10&#xff0c;在打开别人/以前中文系统环境下保存的Keil Project文件&#xff08;uvprojx文件&#xff09;会报错&#xff0c;内容大致是 Cannot read project file D:\xx…

JAVA生成Word文档

第一步&#xff1a;导入依赖 <!--生成word文档--> <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.3</version> </dependency> <!--数字转为汉字大写--> <depend…

《代码之丑》学习笔记18——写代码是一件可以一生精进的事

结束语 | 写代码是一件可以一生精进的事 文章目录 结束语 | 写代码是一件可以一生精进的事代码的敏感度 在很多人心目中&#xff0c;程序员是一个辛苦的职业&#xff0c;一方面&#xff0c;各种新东西层出不穷&#xff0c;程序员们要努力追随&#xff0c;另一方面&#xff0c;业…

十、VTK创建圆锥体vtkConeSource 带颜色

为圆锥体的每一面,添加一种颜色: 上述效果的代码: #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkLine.h> #include <vtkPolyData.h> #include <vtkPolyDataWriter.h> #include <vtkPolyDataMapper.h> #incl…

机器学习复习(6)——numpy的数学操作

加减法运算 # 创建两个不同的数组 a np.arange(4) #list(0,1,2,3 b np.array([5,10,15,20]) # 两个数组做减法运算 b-a 运行结果&#xff1a; 计算数组的平方 #b*2代表数组b每个元素乘以2 #b**2代表数组b每个元素的2次方 b**2 运行结果&#xff1a; 计算数组的正弦值 #…

Java 数据结构 二叉树(二)红黑树

目录 数据结构图-树 简介 规则 旋转 重新着色 红黑树构建过程 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#xf…

UnityShader(十五)纹理的属性

目录 面板属性&#xff1a; 多级渐远纹理技术&#xff08;mipmapping&#xff09; Filter Mode&#xff08;滤波模式&#xff09; 面板属性&#xff1a; 在Unity中导入一些纹理资源后可以在它的材质面板上调整其属性 如图&#xff1a; 在这个面板上有许多可以调整的属性&am…

Python的作用域

Python中的作用域是用来确定变量和函数的作用范围和生命周期的规则。在Python中&#xff0c;有四种类型的作用域&#xff1a;局部作用域、外层作用域、全局作用域和内置作用域。 一&#xff1a;局部作用域 在函数内部定义的所有变量都属于局部作用域。这些变量只能在该函数内…

西瓜书学习笔记——核化线性降维(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 核化线性降维是一种使用核方法&#xff08;Kernel Methods&#xff09;来进行降维的技术。在传统的线性降维方法中&#xff0c;例如主成分分析&#xff08;PCA&#xff09;和线性判别分析&#xff08;LDA&#xff09;&#xff0c;数据被映…

C++学习Day03之构造函数的调用规则

目录 一、程序及输出1.1 编译器会给一个类 至少添加3个函数1.2 自己提供了 有参构造函数1.3 自己提供了 拷贝构造函数 二、分析与总结 一、程序及输出 1.1 编译器会给一个类 至少添加3个函数 编译器会给一个类 至少添加3个函数 默认构造&#xff08;空实现&#xff09; 析构函…

QCoro: Qt C++ 20 协程库介绍

C20 推出了协程的实现&#xff08;coroutines&#xff09;。虽然开发一个支持协程特性的类库还是要花很多功夫的&#xff0c;但是使用一个开发好的类库则是非常嗨。这也是C 委员会一贯的原则&#xff1a; 如果你是类库开发者&#xff0c;必须足够有耐心学习拗口的特性。但如果…

MySQL分区的优缺点

前言 数据库中的分区技术为处理大规模数据提供了一种有效的手段&#xff0c;通过将数据划分成更小的可管理单元&#xff0c;我们能够提高查询性能、简化数据维护并更灵活地管理存储空间。然而&#xff0c;在采用分区时&#xff0c;我们必须认真考虑分区键的选择和实施细节&…

vue封装滚动表格

1.组件的使用 <div style"height:93%; overflow: hidden;"> <autoScroll :data"shortageList" :speed"0.5" :waitTime"500" :singleHeight"100" v-if"shortageList.length>0"><el-row v-for…