你知道吗,其实C语言近几十年来增加了不少好用的“新特性”
yuyutoo 2024-12-14 15:53 1 浏览 0 评论
基本上,每一个程序员都知道使用C语言可以写出可移植的程序。所谓“可移植”,无非就是在不同的设备平台,程序能够表现一致,具有相同的功能。
C语言标准
C语言代码是不可以直接被机器执行的,它在被执行之前,必须被编译器“翻译为”机器指令。一般来说,不同的设备平台上的C语言编译器在实现上都是有所差异的,为了确保这些“有差异”的编译器处理同一份C语言代码时,能够实现相同的功能,必须制定相应的标准,即所谓的Cxx 标准。
C语言这几十年来也是有所发展的,从前些年的C89标准到C90、C99,以及C11标准,C语言多多少少也增加了许多“新特性”。
事实上,C99标准已经推出20年了,但是对它的支持却来得很慢,所以即使在C11标准都已经推出的今天,相当多的C语言程序员依然在使用C89标准提供的C语言特性,因此在一些开源C语言代码中看到C99特性时,他们常常会感到惊讶。
现在大多数主流C语言编译器都已经支持C99,我觉得作为C语言程序员,应该知道C99标准中新增的一些比较好用的C语言“新特性”。当然了,本文不可能将所有的“新特性”一一列举,这里我仅将我个人认为一些比较好用的特性列出,希望能够抛砖引玉。
for()内部的变量声明
在C++程序开发中,程序员需要使用 for() 循环语句时,常常将循环遍历定义在 for() 内部,请看:
for (int i = 0; i < n; ++i) { ... }
这是一个相当好用的特性,变量 i 的作用域仅限于 for 循环体内,不会与外部的变量 i 冲突,C语言的C99标准也支持这样的写法。但是,如果使用了C99之前的编译器,程序只能像下面这样写:
int i; for (i = 0; i < n; ++i ) { ... }
新增标准头文件
C99 增加了若干标准头文件,我觉得比较好用的有两个:和,前者定义了诸如 int8_t,uint8_t 这样的整数类型,使得C语言程序员更容易写出不假定字宽的程序,这提高了程序的可移植性。而后者则为C语言引入了原生的“布尔类型”,下面是一段C语言代码示例:
#include <stdio.h> #include <stdbool.h> int main() { bool a = true; bool b = false; bool c = 3; printf("a,b,c = %d,%d,%d\n", a,b,c); return 0; }
编译这段C语言代码并执行,得到如下输出,C语言的布尔类型被读出时,只有0,1两种可能值。
# gcc t.c # ./a.out a,b,c = 1,0,1
“随机”赋值
在支持C99的编译器下,C语言程序员可以编写下面这样的代码,为特定的数组元素,或者特定的结构体成员赋值,请看下面这段C语言代码:
struct { int x, y; } a[10] = { [3] = { .y = 12, .x = 1 } };
这段代码定义了数组 a,a 中元素存放的是一个有 x 和 y 两个成员的结构体,后面的赋值语句则指定为数组 a 的第 3 个元素赋值,并且指定 y 为 12,x 为 1。当然了,这段C语言代码仅作为示例,用于说明C99更加灵活的赋值特性。
可见,C99允许C语言程序员随机初始化数组元素或者结构体成员,或许下面这个例子更能说明这一点,请看:
enum { Iron = 26, Aluminium = 13, Beryllium = 4, ... }; const char *element_names[] = { [Iron] = "Iron", [Aluminium] = "Aluminium", [Beryllium] = "Beryllium", ... };
“变长”数组
不少C语言教材在谈到数组时,往往都会强调定义数组必须使用“常量表达式”,而不能使用变量,例如下面这行C语言代码是违法的:
int len = 10; int arr[len]; // C99之前违法
在C99之前,如果需要申请一块由变量 len 指定长度的内存,只能借助动态内存分配。但是,C99标准允许使用“变量数组”,这大大方便了C语言程序开发,下面是一段合法的C语言代码示例:
int x; scanf("%d", &x); int a[x]; for (int i = 0; i < x; ++i) a[i] = i * i; for (int i = 0; i < x; ++i) printf("%d\n", a[i]);
显然,数组 a 的长度由变量 x 确定,这避免了动态内存分配,无需程序员再释放 a 了,减少了C语言程序的代码量,也降低了内存泄漏的风险。
这里应该指出,“变长数组”a依然存在于栈上。
小结
本节主要讨论了C99标准中新增的一些比较好用的“新特性”,应该明白,本文仅仅抛砖引玉,C99新增了相当多的好用特性,我之前的文章也有诸多讨论,为避免重复,这里就不再赘述了,感兴趣的读者可以再看看我之前的文章。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。
未经许可,禁止转载。
相关推荐
- 史上最全的浏览器兼容性问题和解决方案
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...
-
- 平面设计基础知识_平面设计基础知识实验收获与总结
-
CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...
-
2025-02-21 16:01 yuyutoo
- 写作排版简单三步就行-工具篇_作文排版模板
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- 写一个2048的游戏_2048小游戏功能实现
-
1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...
- 今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……
-
最近的天气暖和得让很多小伙伴们喊“热”!!! 昨天的气温到底升得有多高呢?你家有没有榜上有名?...
- CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
-
之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...
- 你的自我界限够强大吗?_你的自我界限够强大吗英文
-
我的结果:A、该设立新的界限...
- 行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?
-
行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...
-
- 让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
-
去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...
-
2025-02-21 16:00 yuyutoo
- 今年国家综合性消防救援队伍计划招录消防员15000名
-
记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...
- 一起盘点最新 Chrome v133 的5大主流特性 ?
-
1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...
- 竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使
-
style="text-align:center;"data-mce-style="text-align:...
- 学物理能做什么?_学物理能做什么 卢昌海
-
作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...
-
- 你不知道的关于这只眯眼兔的6个小秘密
-
在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...
-
2025-02-21 16:00 yuyutoo
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)