news 2026/10/19 2:03:08

我与C语言不能说的秘密——初绷

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
我与C语言不能说的秘密——初绷

初C,敬我们初相遇。

目录

1.你我的初相遇
2. main函数
3. 7. printf和库函数
5. 关键字介绍
6. 字符和ASCII编码
7. 字符串和\0
8. 转义字符
9. 语句和语句分类
10…注释是什么?为什么写注释?

()里的真是想到啥写啥,写的嘿嘿我都不好意思说,要不然咱别看了。[呜呜]
1.你我的初相遇

#include<stdio.h>intmain()//入口{printf("hello word\n");//打印return0;}

这想必很多人都很熟悉,甚至可能是我们第一个学习认识并敲过的代码,我们那时或许会激动,因为无知者无畏嘛,新世界的大门向我们推开,我们总会幻想会成为主角。(今天我也来推啦!嘿嘿)
在这里我分享我第一个遇到学习并最常用的快捷键:Ctrl+f5(希望可以帮到大家,嘻嘻,但虽然很可能大家都知道啦[桑心}{桑心})

2.main 函数
每个C语⾔程序不管有多少⾏代码,都是从 main函数开始执⾏的,main函数是程序的⼊⼝,main函数也被叫做:主函数。
main前⾯的 int表⽰ main函数执⾏结束的时候返回⼀个整型类型的值。所以在 main函数的最后写 return 0;正好前后呼应。
(就是给计算机个入口,不给口咋可以嘞,饭不从口入,难道……咳咳不说了,我才第一次写这个)
•main函数是程序的⼊⼝
• main函数有且仅有⼀个
•即使⼀个项⽬中有多个.c⽂件,也只能有⼀个main函数(因为程序的⼊⼝只能有⼀个,就像人只有一个口可进咳咳进食对,就是进食。哈哈[尴尬])
好了,言归正传,虽然这比较简单,可能也是我们一开始学的代码,但不代表就不会错,比如如下:
• main被写成了mian
• main后边的()漏掉了
•代码中不能使⽤中⽂符号,⽐如括号和分号
•⼀条语句结束后,有分号,这可不中类,加;成空语句不白写了嘛(看得见,,摸得着,运行不了,靓仔以哭晕在次所)

3.printf和库函数
.printf是什么
printf 是库函数,全称 print format(格式化打印)
作用:往屏幕(标准输出设备)输出内容。
标准输出设备默认就是电脑屏幕控制台。

printf("hello word");

比如这个运行结果就是打印出 hello word。

当然还有一些其他还有扩展的如下,想看嘛,不给,略略略,看玩笑,哈哈,好玩

intn=88;printf("%d\n",n);//printf打印整型printf("%c\n",'e');//printf打印字符printf("%lf\n",3.141592);//printf打印双精度浮点型

你以为没了,骗你的,收你来着

#include<stdio.h>//头文件intmain()//别加;加了别怪我爬网线过去shan你{inta=100;charch='A';floatf=3.14f;doubled=2.71828;chars[]="hello word";//这些都再告诉计算机这是啥类型,他好根据这些在内存开辟空间,避免浪费//补充;char 名字; → 单个字符,无[],用%c打印,单引号'a'//char 名字[容量]; → 字符数组/字符串,要有[],用%s打印,双引号"abc"printf("整数a = %d\n",a);printf("字符ch = %c\n",ch);printf("float = %f\n",f);printf("double = %lf\n",d);printf("字符串 = %s\n",s);//这(逗号后面)跟上面定义的是一个东西,神明代理人嘛,替身嘛有点中二[呜呜],其实跟数学里的换元差不多嘛return0;}//上面的\n是换行,你要说你不知道,想知道嘛,就不告诉你,就不告诉你,嘿哈哼。(哎,哎,哎,别生气嘛,多大了,还小孩子气,也别笑了,虽然我也绷不住了)//扩展汇总一下,嘿嘿%dint//打印十进制整数(最常用)%cchar//打印单个字符%schar[]///字符串 打印一串字符(字符串)%ffloat//打印单精度浮点数(小数,默认保留6位小数)%lfdouble//打印双精度浮点数(小数)%uunsignedint//无符号十进制整数(非负数)%ounsignedint//八进制整数%xunsignedint//十六进制(小写 a~f)%Xunsignedint//十六进制(大写 A~F)%p 指针// 打印内存地址%%-//打印一个百分号 %

这⾥的 %d ,%c等是占位符,会被后边的值替换。(寄生的可怜虫,白白为他人(逗号后面的)作嫁衣)
同时我们在使⽤库函数的时候,是需要包含头⽂件的,⽐如:printf函数需要包含的就是stdio.h这个头⽂件,具体的就是:

#include<stdio.h>//printf是他的兵,用人家之前不得跟人家首领打声招呼

那可能有人会疑问啥是头文件,我的回答是你猜(从头看过来的,应该也猜到了,哈哈)

那什么是库函数呢?(我还是太善良了,嘿嘿)
为了不再重复实现常⻅的代码,让程序员提升开发效率,C语⾔标准规定了⼀组函数,这些函数再由不同的编译器⼚商根据标准进⾏实现,提供给程序员使⽤。这些函数组成了⼀个函数库,被称为标准库,这些函数也被称为库函数。在这个基础上⼀些编译器⼚商可能会额外扩展提供部分函数(这些函数其他编译器不⼀定⽀持)。
⼀个系列的库函数⼀般会声明在同⼀个头⽂件中,所以库函数的使⽤,要包含对应的头⽂件。库函数⽐较多,后面在忽悠额不介绍给你,提前了解可参考链接:https://cplusplus.com/reference/clibrary/

5. 关键字介绍
C语⾔中有⼀批保留的名字的符号,⽐如:int if 这些保留字或者关键字。
关键字都有特殊的意义,是保留给C语⾔使⽤的
•程序员⾃⼰在创建标识符的时候是不能和关键字重复的(这跟你取了吴彦祖一样的名字,也不可能一样帅,而且这里也不允许一样,名字不一样,又不代表不帅,自定义关键词嘛也可以很好的,寒门出贵子[滑稽])
•关键字也是不能⾃⼰创建的。
C语⾔的32个关键字如下:

autobreakcasecharconstcontinuedefaultdodoubleelseenumfloatforgotoifintlongregisterreturnshortsignedsizeofstructswitchtypedefunionunsignedvoidvolatilewhilestaticextern

注:在C99标准中加⼊了 inline 、 restrict 、 _Bool 、 _Complex 、 _Imaginary 等关键
字。
⼀些关键字⼤家可以去了解⼀下,不过使⽤最多的还是上⾯的32个关键字。
注:https://zh.cppreference.com/w/c/keyword(C语⾔关键字的全部介绍)

6. 字符和ASCII编码
在键盘上可以敲出各种字符,如:a,q,@,#等,这些符号都被称为字符,C语⾔中字符是⽤单引号括起来的,如:‘a’,‘b’,‘@’。
我们知道在计算机中所有的数据都是以⼆进制的形式存储的,那这些字符在内存中分别以什么样的⼆进制存储的呢?如果我们每个⼈⾃⼰给这些字符中的每个字符编⼀个⼆进制序列,这个叫做编码,为了⽅便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个标准ASCII编码,C语⾔中的字符就遵循了ASCII编码的⽅式。

参考:https://zh.cppreference.com/w/cpp/language/ascii
我们不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,不过我们最好能掌握⼏组特殊的数据:
• 字符AZ的ASCII码值从6590
• 字符az的ASCII码值从97122
• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32(可以通过运算加减32进行运算大隐式转换)
• 数字字符09的ASCII码值从4857
• 换⾏ \n 的ASCII值是:10
• 在这些字符中ASCII码值从0~31这32个字符是不可打印字符,⽆法打印在屏幕上观察(不可打印你气不气,略略略)

转换示例

#include<stdio.h>intmain(){printf("%c\n",'Q');printf("%c\n",81);//这⾥的81是字符Q的ASCII码值,也是可以正常打印的 return 0;}

可打印字符打印示例

#include<stdio.h>intmain(){inta=0;for(a=32;a<=127;a++){printf("%c ",a);if(a%16==15)//如果a除以16,余数等于15 → 就换行。//意思:每打印16个字符,就输出换行\n,整齐排成16列,像ASCII码表。printf("\n");}return0;}

7. 字符串和\0
C语⾔中如何表⽰字符串呢?使⽤双引号括起来的⼀串字符就被称为字符串,如:“abcdef”,就是⼀个字符串。(串串烧,嘿嘿)
字符串的打印格式可以使⽤ %s(告诉计算机这是字符串)来指定,也可以直接打印如下:

#include<stdio.h>intmain(){printf("%s\n","abcde");printf("abcde");return0;}

运行结果

监视

对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个 \0的转义字符, \0是字符串的结束标志。所以我们在使⽤库函数 printf()打印字符串或者strlen()计算字符串⻓度的时候,遇到 \0的时候就⾃动停⽌了。(总得有刹车的东西吧,你吃也东西也不能一直吃吧,总得"刹车")
要没刹车咋办(看我干嘛,我是不会告诉你的。[抱手.jpg])

#include<stdio.h>intmain(){chararr1[]={'a','b','c'};//arr1数组中存放3个字符chararr2[]="abc";//arr2数组中存放字符串printf("%s\n",arr1);printf("%s\n",arr2);return0;}

这就是后果(不听老人言,吃亏在眼前[靓仔摇头.jpg])

我们可以看到,arr1字符数组在打印的时候,打印了 a、 b、 c后还打印了⼀些随机值,这就是因为 arr1在末尾的地⽅没有 \0字符作为结束标志,在打印的时候没有停⽌。(没刹车,兄弟你撞大运了)
但是 arr2的打印就是完全正常的,就是因为作为结束标志,打印可以正常停⽌。(可惜了,你没大运)
当然伟大的你可以手动让他停下来嘛(区区大运,小意思)
看看下面的,人定胜天嘛(看我大力出奇迹,额 ——哈)

#include<stdio.h>intmain(){chararr1[]={'a','b','c','\0'};chararr2[]="abc";printf("%s\n",arr1);printf("%s\n",arr2);printf("abc\0def");return0;}

运行结果

8. 转义字符
也许在前⾯的代码中你看到\n , \0很纳闷是啥(那就闷着呗)。其实在字符中有⼀组特殊的字符是转义字符,转义字符顾名思义:转变原来的意思的字符。(纵使是海誓山盟也亦会分开,所以你还愿意开始嘛)

#include<stdio.h>intmain(){printf("abcndef");printf("abc\ndef");printf("abc\0def");return0;}

结果

我们可以看到修改的前后代码输出的结果,截然不同的,那这是为什么呢?(因为为什么,所以为什么,懂了么,我这么通俗易懂的表述)

这就是转义字符的问题, \n 是⼀个转义字符表⽰换⾏的意思,我们可以简单的理解为 \ 让 n 的意思发⽣了转变, n 本来是⼀个普通的字符,被 \ 转义为换⾏的意思。(就像古代公公一手神刀,让一个普通的boy \后成为咳咳,从此转变了“意思”差不多,哈哈,差不多)

C语⾔中像这样的转义字符还有⼀些,具体如下:
• ? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
• ’ :⽤于表⽰字符常量’
• " :⽤于表⽰⼀个字符串内部的双引号
• \ :⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
• \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
• \b :退格键,光标回退⼀个字符,但不删除字符。
• \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于 \v 。
• \n :换⾏符。
• \r :回⻋符,光标移到同⼀⾏的开头。
• \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个4/8的倍数。
• \v :垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。

下⾯2种转义字符可以理解为:字符的8进制或者16进制表⽰形式
• \ddd :ddd表⽰1~3个⼋进制的数字。如: \130表⽰字符X
• \xdd :dd表⽰2个⼗六进制数字。如: \x30表⽰字符0
\0 :null字符,代表没有内容, \0 就是 \ddd 这类转义字符的⼀种,⽤于字符串的结束标志,其ASCII码值是0.

#include<stdio.h>intmain(){printf("%c\n",'\130');//130是8进制,转换成10进制是88,以88作为ASCII码值的字符是'X'printf("%c\n",'\x30');//x30中的30是16进制,转换成10进制是48,以48作为ASCII码值的字符是'0'printf("%c\n",'\'');// /也可以让一些有意义,正常打不出的打出来。return0;}

这些ASCII码值是可以⾃⼰写代码验证的,⼤家也可以⾃⼰验证。
关于转义字符我们⾸先要了解,然后要能在字符串中识别出来。多看多写几遍就行,别真背(今日背五篇,明日背十篇,然后得一夕安寝。
起来做题,而背诵又至矣。子子篇篇无穷尽也,而知识不加增,何苦能学会,到最后才发现根本没有学会的风险。哈哈,绷不住了)

转义字符参考:https://zh.cppreference.com/w/c/language/escape

9. 语句和语句分类(看看了解一下就行)
C语⾔的代码是由⼀条⼀条的语句构成的,C语⾔中的语句可为以下五类:
• 空语句
• 表达式语句
• 函数调⽤语句
• 复合语句
• 控制语句

空语句
空语句是最简单的,⼀个分号就是⼀条语句,是空语句。

#include<stdio.h>intmain(){;return0;}


空语句,⼀般出现的地⽅是:这⾥需要⼀条语句,但是这个语句不需要做任何事,就可以写⼀个空语句。(废物也是有废物的作用的,具体我不说,嘿嘿)
表达式语句
表达式语句就是在表达式的后边加上分号。如下所⽰:
(一句话结束后面也要加分号,但要在for 之类的后面加就废了,就成空语句,白写,说多了都是泪啊 泥肘(呜呜呜))

#include<stdio.h>intmain(){inta=2;intb=6;b+=a;printf("%d",b);return0;}


函数调⽤语句

函数调⽤的时候,也会加上分号,就是函数调⽤语句。比如printf等

复合语句

复合语句其实就是代码块,成对括号中的代码就构成⼀个代码块,也被称为复合语句。(复合呗)

控制语句
控制语句⽤于控制程序的执⾏流程,以实现程序的各种结构⽅式(C语⾔⽀持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语⾔有九种控制语句。
可分成以下三类:

  1. 条件判断语句也叫分⽀语句:if语句、switch语句;
  2. 循环执⾏语句:dowhile语句、while语句、for语句;
  3. 转向语句:break语句、goto语句、continue语句、return语句。

10…注释是什么?为什么写注释?

注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。注释是给程序员⾃⼰,或者其他程序员看的。好的注释可以帮我们更好的理解代码,但是也不要过度注释,不要写没必要的注释。当然不写注释可能会让后期阅读代码的⼈抓狂。(就跟你必须看英文论文之类的,没注释,没翻译,不得跟天书一样。)
第一种形式/**/的形式
第⼀种⽅法是将注释放在 /…/ 之间,内部可以分⾏。

intfopen(char*s/* file name */,intmode);

上⾯⽰例中, /* file name */ ⽤来对函数参数进⾏说明,跟在它后⾯的代码依然会有效执⾏。这种注释⼀定不能忘记写结束符号 */ ,否则很容易导致错误。而且也不能嵌套使用。

第二种形式//的形式
第⼆种写法是将注释放在双斜杠 // 后⾯,从双斜杠到⾏尾都属于注释。这种注释只能是单⾏,可以放在⾏⾸,也可以放在⼀⾏语句的结尾。这是C99标准新增的语法。

不管是哪⼀种注释,都不能放在双引号⾥⾯。
双引号⾥⾯的注释符号,会成为字符串的⼀部分,解释为普通符号,失去注释作⽤。

printf("// hello /* world and hello c*/ ");

这里要注意一下,编译时,注释会被替换成⼀个空格。(腻害的嘞,竟然能坚持看到这,为自己点个赞)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 2:03:07

4.2 drm_gem_dma_object:基于 CMA 的物理连续后备

4.1 概述里我们把轻量后备分成了两支&#xff1a;需要物理连续的走 drm_gem_dma_object&#xff0c;可换出的走 drm_gem_shmem_object。本章从更简单的那一支讲起——drm_gem_dma_object。它是整个第四章里结构最小、流程最短的后备方案&#xff0c;很适合用来先把「一个 GEM 对…

作者头像 李华
网站建设 2026/10/19 2:02:01

biliTickerBuy B站会员购抢购辅助工具怎么用:上手实操手册

biliTickerBuy B站会员购抢购辅助工具怎么用&#xff1a;上手实操手册 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 限量商品发售时&#xff0c;你得在开售的那一秒守在页面&#xff0c;差一…

作者头像 李华
网站建设 2026/10/19 2:00:34

当 MySQL 学会“读懂业务“:从底层原理到生产落地的完整指南

重要前置说明&#xff1a;原生 VECTOR 列类型是 MySQL 9.0 社区版​ 即可使用的&#xff1b;而库内 LLM 推理、ML_RAG 检索生成、ML_TRAIN AutoML 等完整 AI 流水线&#xff0c;属于 MySQL HeatWave GenAI / 企业本地 MySQL AI​ 的能力。下文分层讲解&#xff0c;你可以按自己…

作者头像 李华
网站建设 2026/10/19 2:00:17

ABAP Cloud 中的 OLAP 分析应用,从 CDS 多维模型到 InA 服务与实时业务决策

SAP 官方的航班预订分析教程里,一份预订记录不只用来显示航班号、客户和票价。它还可以回答各航空公司的预订量有多少、不同旅行社贡献了多少收入、客户分布是否发生变化。教程把航空公司、客户、航线和旅行社建成分析维度,把预订数据组织成分析模型,再通过 InA 服务交给 SA…

作者头像 李华
网站建设 2026/10/19 1:59:51

从姜公胆的连击看 ABAP,怎样让一次业务指令完成两次可靠处理

一张销售订单刚保存,仓库需要收到发货准备指令,财务还需要收到信用占用信息。业务人员只按了一次保存,后台却有两件事要办。这种「一次指令,连续产生两次效果」的画面,很容易让人想到《轩辕剑叁外传天之痕》里的姜公胆。不过,真正值得类比的并非简单地把同一段代码执行两…

作者头像 李华