惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
S
Schneier on Security
Blog — PlanetScale
Blog — PlanetScale
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
The GitHub Blog
The GitHub Blog
腾讯CDC
A
About on SuperTechFans
H
Help Net Security
The Register - Security
The Register - Security
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Vercel News
Vercel News
V
Visual Studio Blog
T
Tailwind CSS Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - Franky
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
D
DataBreaches.Net
I
InfoQ
L
Lohrmann on Cybersecurity
M
MIT News - Artificial intelligence
I
Intezer
博客园 - 聂微东
Webroot Blog
Webroot Blog
宝玉的分享
宝玉的分享
Scott Helme
Scott Helme
Microsoft Security Blog
Microsoft Security Blog
SecWiki News
SecWiki News
Hacker News: Ask HN
Hacker News: Ask HN
T
Troy Hunt's Blog
S
Security @ Cisco Blogs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
D
Docker
N
Netflix TechBlog - Medium
小众软件
小众软件
The Cloudflare Blog
WordPress大学
WordPress大学
N
News | PayPal Newsroom
C
Check Point Blog
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
C
Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
W
WeLiveSecurity
Schneier on Security
Schneier on Security

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派 万字剖析:千问App深度体验报告(2026) - 少数派 在2026年,如何真正防止别人抄袭你的作品 - 少数派 怎么用 50 块搭个 AI 语音助手?我踩了 3 天坑 - 少数派 YeeroAI:让 AI 对话真正成为知识管理的一部分 - 少数派 爬泰山 - 少数派 「旅图显影」 App 更新:这次,我们补上了一点「手感」 - 少数派 假期出门太折磨?我的 23 条经验帮你规划惬意旅行 - 少数派 工作流会变吗 - 少数派 Claude Opus 4.6 怎么用最省钱?我测了 5 种方案 - 少数派 GPT Image 2 让图文并茂不再稀罕 - 少数派 用户侧出发——什么是AI,我要不要学习? - 少数派 找片、转存、整理、播放一条龙!让你的付费网盘值回票价 - 少数派 欢迎试用!日课一问2.0插件 - 少数派 自己做的MDeditor,原本想购买 Typora 试了两次支付不成功,干脆自己做一个 - 少数派 vibe coding了一个 3MB 的小工具,让 ~/Downloads 彻底告别混乱 - 少数派 因为受不了 Mac 的风扇策略,我做了一个风扇控制工具 - 少数派 别只怪模型 - 少数派 Warp 终端的 AI 功能怎么用?我测了一周的体验 - 少数派 AI 写代码老是出 bug?这 5 个配置我后悔没早知道 - 少数派 「新玩意」苹果出相机可能就这样:Sigma BF + 45mm F2.8 DG Contemporary - 少数派 一个面向2030年的AI操作系统是什么样子的:浅谈cola这款有灵魂的Agent - 少数派 别只看写代码 - 少数派 每天解决10个问题,还是一口气攻坚解决400个? - 少数派 AI 交易机器人怎么搭?我用 Claude 跑了一周实盘 - 少数派 Maptoposter Online:把你爱的城市画成艺术海报 - 少数派 Function Calling 怎么用?我测了 3 个模型发现差距真大 - 少数派 Legend Talk:我做了个 AI 圆桌,让 160 位思想家围着你的问题转 - 少数派 如何找到自己的蓝方?在小县城寻找压力测试 - 少数派 语音输入与软件接口|2026年聊AI时,我们都聊些什么(上) - 少数派 混动已经卖爆,纯电又来补刀——钛7闪充版简直“不讲武德” - 少数派 本月玩什么|朋友收藏、识质存在、沙罗周期 - 少数派 为什么要每天坚持输出? - 少数派 Claude API 挂了好几个小时,你的项目有备用方案吗? - 少数派 Function Calling 没你想的复杂——我用它做了个有点用的工具 - 少数派 登录系统立即播放视频或者图片音乐的软件 - 少数派 我为什么创建 FlipHTML5 下载工具 - 少数派 残局没电?多品牌外设电量统一管理软件EasyBluetooth已支持RTSS游戏内显示以及AIDA64 - 少数派 前往通义路的路 - 少数派 太好看了,媲美Sun的个人导航页,NAS部署星云门户 - 少数派 乌黑嘴唇“一键检测”上线了 - 少数派 派早报:Claude AI 接入多个创意软件生态、FILCO 生产方接手品牌等 - 少数派 【更新】BearCLI、Claude 连接器与 MCP 服务器 - 少数派 记了上千条流水,还是看不懂财务?我做了一个让 AI 读懂账本的工作台 - 少数派 MINI R56 升级原厂 Sport 模式 - 少数派 新玩意 | 一棵柠檬树(仿真版) - 少数派 Momenta的“物理AI”野望,需迈过“含摩量”这道关 - 少数派 网页直接投屏控制手机!NAS一键部署PandaScrcpy,流畅丝滑可远程。 - 少数派 众测|邀你一同探索随身 AI 硬件入口 YoooClaw C·ONE - 少数派 2050大会:分享时间是真诚 参会记 - 少数派 iPad 赋能电影创作:国内首部宣纸手绘长片《燃比娃》的幕后故事 - 少数派 AI的审美:我用 8 个大模型给 100 张旅行照片打分 - 少数派 普通人如何破圈?去参加一个本地协会 - 少数派 把极空间的图标全换了,主题DIY全攻略打造你的专属NAS桌面 - 少数派 电子便签墙,帮你实现便签自由 - 少数派 我如何用三个 CLI 工具取代文档创建需求 - 少数派 原来真的有人可以玩一辈子 - 少数派 社区速递 139 | 派友热议三月买了啥、复古单反尼康 Df 体验 - 少数派 06 作品的赏析与评价 - 少数派 TDS REVIEW|索尼 WF-1000XM6 降噪真无线耳机体验 - 少数派 35.98万起售的第二代腾势D9,我看重的不是堆料,而是不凑合 - 少数派 鼠须管 Squirrel 皮肤配置指北 - 少数派 从watch ultra2换到redmi watch6 - 少数派 派早报:阿里巴巴发布视频生成模型 HappyHorse 1.0 等 - 少数派 别迷信1M - 少数派 家人们天塌了!网盘“大封杀”,多个渠道多条路,NAS部署PanHub - 少数派 AI与人勾心斗角!NAS一键部署AI狼人杀,假日休闲必备。 - 少数派 电商必备!Comfyui工作流批量生图插件,一次生成12张!支持Nano banana pro模型 - 少数派 Comfyui工作流配置Gpt-image-2模型教程,0.03/张 - 少数派 OpenClaw第三方APi怎么配置?可使用Gpt-image-2模型 - 少数派 会员社区话题精选 Ep. 103 - 少数派
一份给大一新生的 C 语言入门指南 - 少数派
2021-10-04 · via 少数派

Matrix 首页推荐

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。

文章代表作者个人观点,少数派仅对标题和排版略作修改。


对于理工科的大一新生来说,C 语言是个绕不开的坎。由于在进入大学前,许多人都完全没有接触过编程相关的内容,导致对于这门课的接受能力普遍偏低,学起来也非常费劲。这里就总结一些可能在课堂上老师不会详细讲解,但是对于理解 C 语言个人感觉比较重要的一些内容,供大家参考讨论。本人不是计算机专业,也没有系统深入地学习过 C 语言,因此可能在某些方面会出现偏差或错误,希望读者能够指正,避免错误带来的误导。

首先我们来讨论一些基础的内容。由于学校教学时长是有限的,每节课的时间也比较短,因此在进入具体教学前的绪论环节,并不会花费过多的笔墨。很多时候,甚至只会告诉同学如何安装 IDE、如何新建文件、保存、编译并运行,但不会告诉同学们为什么要这么做,每一步背后到底都干了些什么。要搞清楚这些问题,首先需要知道一些编程语言的基本知识,我们从分类讲起。

编程语言怎么分类?

编程语言的分类其实有很多种分类方法,首先可以将其分为高级语言与低级语言,而高级语言之中又有着非常多的种类,这些将在下面进行介绍。

高级语言与低级语言

首先按照高级低级来区分,可以分为机器语言(汇编语言)和其他。高级语言的分类较多,这边先简单聊一聊低级语言。

机器语言仅由 01 组成,是计算机硬件能够直接理解的语言。不同的架构——如我们熟知的 ARM,x86,RISC-V 等架构——都有着不同的机器语言。机器语言能够直接操作处理器,其操作码在计算机内都有着对应的电路来完成。

汇编语言是在机器语言的基础上诞生的一种语言,每一条语句都与机器语言中的操作码一一对应,能够直接翻译到机器语言。其存在的意义就是能够方便程序员理解。

汇编语言与机器语言对比

举一个简单的例子:如果想要让两个数进行加法运算,例如计算 2+3,那么使用机器语言可能就是 00000011 00000010 00000011(这里为了方便加入了空格,实际的机器语言中不存在空格,只有 01,且该机器码为个人杜撰,仅作为例子使用,并非某一架构实际所使用的机器码),而用汇编语言写起来则是 ADD 2, 3 这样较为便于理解的方式。当然,汇编语言可不止这么简单,不过由于本文并非主要介绍汇编语言,因此就不进行深入讨论了,如果感兴趣也可以看看阮一峰大佬的 汇编语言入门教程 这篇文章。

尽管如此,汇编语言依然非常复杂,而且限制颇多,一旦需要写一些复杂功能,或是算法运算,很容易写完后连自己都读不懂。我在学习微机原理时,写过一个课程项目,要求是用汇编为 89C51 单片机写一段摇一摇计数的代码,剔除驱动 LCD 屏的代码,总共不过四五百行,却又写了近三百行注释以便理解。虽然其中有我对于汇编不够熟练的缘故,但其繁复程度可见一斑。

由此可见,显然不太可能用机器语言或是汇编语言来进行复杂代码的编写。这时高级语言就应运而生。下面就简单介绍一下高级语言以及其分类。

编译型、解释型与混合型

接下来介绍通过语言的翻译方式来进行的分类,以三种目前非常流行的语言为例,分别为 C 语言,Python 以及 Java。

由于所有写的代码最终都会变成机器语言才能执行,因此不同的语言最终也会殊途同归,翻译回汇编和机器语言,只是不同类型的语言翻译的方式不同而已。这边首先介绍 C 语言为代表的编译型语言。

编译型语言,顾名思义,就是通过编译将代码翻译到机器语言,再进行执行,因此执行前会首先将代码进行编译,这一步在老师教学的时候,会告诉同学们必须要先点击编译再点击执行,或点击编译并执行,其原因就在这里。编译会调用现成的编译器对代码进行分析,优化,处理,其中的过程在这里由于篇幅原因也不过多赘述了,总之最后会将所写的 .c 代码编译为以 .exe (Windows 下)或 .out (macOS 下)结尾可执行文件。

C 语言编译前
C 语言编译后

这里可以控制编译器生成汇编语言文件,可以看一下两者的差距

C 语言与对应汇编语言

显然 C 语言的版本更容易理解。

编译型语言虽然在会在执行前进行分析优化,运行起来速度也非常快,但对于大型程序来说,编译耗时也会非常长。那么能否不进行编译而直接运行呢?答案显然是可以的,这就是解释型语言,如 Python。

对于解释型语言,将不会使用编译器进行翻译,最终生成机器语言的可执行文件,再进行执行。它会调用解释器,逐行翻译源文件,将每一行实时翻译到机器码并执行。如此一来,就不需要进行编译,执行前的准备时间大大减少。但是由于解释器并不会对代码进行优化,而且每次运行时都需要从头解释一遍,导致执行效率不如编译型语言。

编译型语言还存在另一个问题。根据前文所提到的,每种架构都有独特的机器语言,而编译的过程就是将代码翻译为机器语言的过程,这就导致每次编译生成的文件都只能在特定平台上运行。那能不能做到一次编译,就能在全平台运行呢?显然这也是可以的。这就是混合型语言,如 Java。

这类语言同样需要编译,但是编译后生成的并非机器码,而是字节码。通常这类语言在运行时会再转换成机器码执行,或直接由虚拟机解释执行。由于编译到字节码而非机器码,因而编译得到的执行文件是全平台通用的。

指定数据类型

许多同学在学习 C 语言的时候可能会疑惑,数据类型到底有什么用?要理解这个问题,我们先来看看数据是怎么存储的。

数据类型的意义

在内存中,所有数据都会被以二进制进行存储,即 01001001 等形式。这些数据仅仅只是 01 而已,所表达的意义都是人为规定的。

通常,第一位会被视为符号位,即 0 位正,1 为负。然而,如果我希望第二位来表示符号位,也完全是符合规定的,只是所有涉及到运算的代码都要重写罢了。而数据类型就是用来规定每一位所代表的意义。

举个例子,在 32 位系统中,对于 int 类型而言,第一位表示符号,后 31 位表示具体的值。而对于 float 类型而言,尽管第一位也表示符号,但剩下的 31 位与 int 类型所表示的意义就不同了。紧接着的 8 位是指数位,剩下的是尾数,即使用科学计数法表示为 尾数 * (2 ^ 指数)。这里是 2 的原因是计算机中所有数据都是二进制存储的,而非十进制。

float 类型存储方式

这里用 0 10000010 00010000 00000000 0000000 来展示一下 float 类型的具体计算。理解这段需要会一些简单的进制转换,如果不会建议自学一下。通过二进制计算器,可以很容易得到它对应的十进制数是 1094975488

对于 float 类型来说,其指数为 10000010,即 129,再根据规定减去 127,最终得到其指数为 2。对于尾数而言,由于一定由 1 开头,因此最开始的这位 1 会被省略,因此其尾数实际为 10001000 00000000 00000000,即为 1.0001 * (2 ^ 2),换算成十进制为 4.25

如果希望对这两个类型的数据进行简单的加法运算,而不指定数据类型,汇编中会直接进行对位相加,即对应的每一个 01 相加,并加上前一位的进位。这样计算会得到 10000010 00010000 00000000 00000000,显然不是我们想要的 1094975492.25

如果不指定数据类型,计算就会得到错误的答案。由此可见,在内存中无意义的一串二进制数,我们可以通过规定每一位的意义,来得到不一样的结果。

想要深入了解的,同样推荐阮一峰大佬的 浮点数的二进制表示 一文,这里仅将其作为指定数据类型的重要性的一个例子。

为什么要指定这么多数据类型

很多同学可能也有这样的疑惑,为什么光一个整数就有 shortintlang 三种,浮点数也有 floatdouble 两种,甚至还有与 int 类型对应的 char 类型呢?只需要intdouble 不就够用了么?

由于现在的计算机内存普遍充裕,不太会遇到内存空间不足的问题,因此可以直接选用高精度的数据类型进行存储与计算。然而,在多年以前,或是在嵌入式领域,这类存储空间非常紧张的条件下,不同数据类型的差距就显现出来了。

由于在这些条件下,每一个 bit 都显得弥足珍贵,因此程序员会想方设法地优化存储空间的使用,能够用低精度的就不会用高精度。

而浮点数根据上文对存储方式的解释可以看出,精度越高,其所能表示的大小越小,因此在表示较大的,对精度要求高的数据时,就必须使用高精度的数了,反之则可以用低精度的节省空间。由于 float 所能表示的精度实在是非常低,因此建议在学校编写 C 程序时,如无特殊要求,一律使用 double 类型。

char 类型则较为特殊,可以与整数类型进行相互转换。在单片机等环境中,由于存储空间有限,因此更倾向于使用 char 这一只消耗一字节的数据类型,而不是 int 等更大的。另外,char 一般用来表示字符,因此如果要表示例如 'A' 这种字符型的数据时,一般用 char 类型。char 类型在后文有关字符串的部分还会提到。

然而,short 类型不一定就比 int 类型消耗的空间少,long 也不一定就比 int 表示的精度高,一切由编译器决定(只需要遵守 2 <= short <= int <= long 就是符合规定的)。因此如果真的有需要,可以用 char 来降低消耗,而不是使用 short

数据类型在不同操作系统下的大小

由此可见,虽然常用的数据类型就这么几个,但是其他的类型也都有其存在的意义,可以不用,但不能没有。数据类型一旦确定,该变量在内存中所分配的大小,以及每一位所代表的意义,也就随之确定下来了。

数组与指针

明白数据类型,接下来就可以定义数组了。一个数组是由一定数量的,相同数据类型的变量组成的一种数据结构,也就是说,一个数组可以由一定数量的其他数组组成,而这些数组也可以由数组组成,形成套娃。

在 C 语言中,数组在定义时必须显式指定其长度与数据类型,而在一些其他语言——如 Java、 Python 中——可以不断扩展数组的长度,但 C 语言中却不能这样做。这又是为什么呢?这需要从如何在内存中生成一个数组说起。

数组的生成

我们在 C 语言中创建数组时,会指定数组的数据类型和长度,而编译器可以根据 数据类型 * sizeof(数据类型) 推算出这一数组具体需要占据多大的内存空间,进而在程序运行到这一步,需要创建数组时,为其在内存中申请符合要求的,连续的一段空间进行数组的生成。但为什么要连续的空间,而不能断断续续呢?

数组在访问时,会首先找到其内存地址。数组在创建时的变量名,实际也是一个指向数组第一项的一个指针(后面会讲到)。随后,根据具体访问哪一项,如第 n 项,就会将这一地址加上 n * sizeof(数据类型),就能直接找到这一项的内存地址。因此数组在生成时需要申请连续的内存地址,否则就无法做到这么高效的访问速度。

C 语言中的数组与其他语言的数组

那么问题来了:为什么别的语言能做到扩展数组长度,通过变量来初始化数组,而不是通过常数来指定呢?

事实上,在最底层的实现中,它们也是会指定一个具体的值来生成数组,其原理与 C 语言完全相同。但是在需要更长的数组时,会申请一段更长的连续内存空间来存放新数组,并将原来的旧数组完全复制一份过去。当然,各种语言会存在一定的优化,申请的空间会比所需的空间略大一些,防止重复不断的复制降低运行效率。

数组动态扩容

由于 C 语言的数组是最原始的数组,语言本身不会自行进行申请新地址,复制旧数组等操作,因此需要在初始化时就指定好长度。

指针的作用

另外一个初学时难以理解的概念就是指针了。 先来看下指针到底是什么。指针是一个存放内存地址的变量,也就是说可以直接访问并操作内存。

指针示意图

图中 a 表示一个整数类型的变量,值为 100,在内存中存放在 0x0010 这一地址中。因此可以定义一个指针 x 指向这一地址。可以理解为 x 中存放了 0x0010 这一地址,访问这一指针就相当于访问这一地址。这就引出了一个问题:既然指针存放的是地址,访问的也是地址,那么为什么还要定义一个类型呢?

原因很简单,因为要取出该地址具体存放的值。前面说过,数据类型决定了该数据所占的大小,以及每一位具体所代表的内容。因此,要取出该地址具体存放的值,必须要知道其数据类型才行。这就是为什么 C 语言中定义指针时要指定数据类型,指明该内存地址存放数据的具体数据类型。

指针与数组的关系

指针与数组的关系也非常紧密。定义数组时取的名称就是指向数组第一个元素的指针,也就是说,要访问数组 a 中的 a[0],可以直接访问 *a。以此类推,可以通过访问 *(a+1), *(a+2) 来访问 a[1], a[2]。这是因为在定义数组时已经指定了数据类型,因此这里的 +1 就不是简单的加法,而是在指针存储的地址的基础上,加上 sizeof(a[0])(这里的 sizeof 用来获取某一变量在存放时使用的内存大小)。从上图可以看出,每个 int 类型如果占了 4 个字节,那么每次 +1 都会将内存地址 +4 再访问。

需要注意的是,通过这种方式访问数组会有数组越界的问题。也就是说,如果定义了一个长为 n 的数组,但是通过 *(a+n) 来访问第 n+1 位,C 语言并不会有任何的错误提示,只会返回一个存储在该内存地址的,根据定义的数据类型来计算得出的值。很多情况下无法分辨到底是否越界,因此使用这种方式访问需要小心谨慎。

另外,虽然数组名是一个指针,但是是一个常量,因此不能给其赋值。

字符与字符串

之前提到,char 类型多用于表示字符。字符串是由字符组成的,其底层是一串由 char 类型的变量组成的数组,因此可以通过 char* 或是 char[] 来生成字符串。赋值时,可以通过数组一个一个字符赋值,也可以通过双引号直接赋值。

在一些其他编程语言中,会专门有一个数据类型 String 来表示字符串,但在 C 语言中并没有。因此对字符串的处理就等价于对字符数组的处理。

在处理字符串时需要注意,数组长度是包含最后的 \0 的,而 strlen 函数则不会。另外,如果通过数组的方式一个个添加字符,且在最后没有加上 \0,那么则由于数组越界进而使得字符串中的数据出现错误。为了防止出现这一错误,最好直接通过双引号进行赋值。另外,不论字符数组有多长,第一次出现 \0 就代表着字符串的结束。

由于 char 实际就是一个数字,因此在解决如 大小写转换 之类的问题时,可以通过 +- 32 来解决。这里的 32 来自于 ASCII 码表,每一个数字都对应着一个字符。码表 可以在网上轻松找到。如果不记得具体的大小,可以通过格式化输出 %d 直接查看对应的数字,如果记不得大小写间差了 32,可以用 'a' - 'A' 来临时凑合使用一下。

一些要注意的语法格式

老师可能不会着重提语法格式,但是实际上良好的格式能够显著提升代码的可读性,方便理解与找错。

main 函数

首先,根据 C99 标准,main 函数应当定义为 int main(void) {...} 或是 int main(int argc, char *argv[]) {...}。前一种在现在学习的阶段更为常用,其中的 void 一般是可以省略的。但是,最后的 return 0; 是可以被省略的,如果不写将会默认返回 0。有些老师或者书上可能会写成 void main() {...},或是说一定要显示地写出 return 0;。这些都是错误的。具体标准可以参考 标准文档

main 函数定义
main 函数返回值

缩进

缩进与换行的使用也是很重要的。{} 应当独占一行,其中所包裹的内容应当进行一次缩进。另外,尽管 if 语句或是 for 语句等,如果大括号内只包含一条语句,很多老师会去掉大括号,并写在一行内。这并不是一个好习惯,应当照样换行,加上大括号与缩进,方便阅读与之后的修改。

可以使用在线格式化,或是 astyle 等格式化软件来进行代码格式化。

其他一些小 tips

除了以上的这些老师可能会一笔带过的内容外,还有一些我在编程中所学到的一些小 tips:

  1. 千万不要忘了先编译再运行,否则由于没有编译,执行的还是上一次编译过的内容,导致执行结果错误。
  2. 发现编译失败了不要慌,多看看报错的信息,很多时候只要一读报错信息都可以很快解决。
  3. 谨记中文输入法输入的符号,除非用在字符串中,否则是不能通过编译的。每行结尾的分号也千万不能忘记。
  4. 虽然有 Warning 也能成功编译,但最好还是注意一下,防止程序在日后出现问题。
  5. 教材上所写的内容并不一定完全是正确的,或者在过去正确,但现在是错误的(包括这篇文章中的内容)。

希望所有看到这篇文章的、需要学习 C 语言的同学们能够顺利学好这门课,取得一个好成绩。

附注

题图,数据类型在不同操作系统下的大小两图来自 Wikipedia。

汇编语言与机器语言对比,float 类型存储方式两图来自阮一峰的网络日志。

Main 函数定义、main 函数返回值两图来自 ISO/IEC 9899:2018 (C17/C18), Draft。

其余图片来自终端及编辑器截图,或本人手绘。

> 下载少数派 客户端 、关注 少数派公众号 ,了解更妙的数字生活 🍃

> 想申请成为少数派作者?冲!