news 2026/9/29 14:59:17

C语言介绍(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言介绍(一)

一、C语言的概念

1.C语言是什么?

答:C语言是一种计算机语言,其他的计算机语言还有C++/Java/GO/Python等。

2.C语言的历史

答:C语言最初是作为Unix系统开发工具而发明的。

3.编译器的选择-VS2022

3.1编译和链接

C语言是一门编译型语言,源码都是文本文件,文本文件本身无法执行,必须通过编译和链接,生成二进制的可执行文件,可执行文件才能执行。 C语言代码是放在.c为后缀的文件中,要得到最终的可执行程序,要经过编译和链接。 编译→**编译器cl.exe**→.obj(目标文件) 链接→**链接器 link.exe**→.exe(二进制可执行文件) 每个.c文件都会单独经过编译器处理生成对应的目标文件,多目标文件和库文件经过连接器处理生成可执行文件。
#include<stdio.h>intmain(){printf("hello world!");}

3.2编译器的对比

c语言是一门编译型的计算机语言,需要以来编译器将计算机语言转换成机器语言能够执行的机器指令。
常见的编译器:msvc、clang、gcc
集成开发环境(IDE):VS2022、XCode、CodeBlocks、DevC++、Clion等。
集成开发环境=编辑器+编译器+调试器+图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。
几种编译器的对比:
• VS2022 集成了MSVC(安装包较⼤⼀些,安装简单,⽆需多余配置,使⽤起来⾮常⽅便)
• XCode 集成了clang(苹果电脑上的开发⼯具)
• CodeBlocks 集成了gcc(这个⼯具⽐较⼩众,需要配置环境,不太推荐)
• DevC++ 集成了gcc(⼩巧,但是⼯具过于简单,对于代码⻛格的养成不好,⼀些竞赛使⽤)
• Clion 是默认使⽤CMake,编译器是可以配置的(⼯具是收费,所以暂时不推荐⼤家使⽤)
注意:VSCode是编辑器,可以安装插件,搭建C/C++的开发环境,但是比较麻烦。

3.3VS2022的优缺点

优点:主流的开发环境、企业使用普遍、包含编辑器+编译器+调试器、可直接安装不用配置环境、上手容易、界面是中文。
缺点:安装包大、占用空间大。

3.4创建项目文件三步走

step1:创建项目(创建空项目→起名字:有意义、用英文、无空格→加路径:固定位置)
step2:创建.c文件(源文件)右键添加新建项→显示左右模板→C++文件(名称+.c)
step3:写代码

VS项目和源文件、头文件介绍

在VS上写代码,直接创建项目,在项目中添加头文件(.h)和源文件(.c)。

5.第一个C程序

#include<stidio.h>//包含标准库的头文件intmain(){printf("hello C\n");}

代码运行快捷键:Ctrl+F5

6.main函数

①每个C程序无论多少行代码都是从main函数开始执行的。
②main函数式程序的入口。
③main函数也被称为主函数。
④main前面的int表示函数结束后返回一个整型的值,程序结尾的return 0;与之前后呼应。
⑤main函数有且只有一个(因为程序入口只能有一个)。

常见错误:
①关键字拼写错误
②函数()不能不能漏掉
③代码中不能使用中文符号
④一条语句结束后必须加上;

注意:C语言中默认返回0表示正常返回,返回非0表示异常返回。
main函数的返回类型只能是int。

7.printf和库函数

printf函数是在标准输出设备(一般只屏幕)上进行信息的打印。
printf函数可以直接打印字符串,也可以打印指定类型的数据。

intn=100;printf("%d\n",n);//printf打印十进制整型printf("%u\n",n);//printf打印十进制无符号整型printf("%c\n",'q');//printf打印字符printf("%lf\n",3.14);//printf打印双精度浮点型

这里的%d等都是占位符,会被后面输入的值替换。

在使用库函数的时候,是需要包含头文件的,比如:printf函数就需要包含stdio.h函数(标准输入输出函数standard input output)。

What’s 库函数?
答:为了不再重复实现常见的代码,提升开发效率,一个系列的库函数一般会声明在一个头文件中,所以库函数的使用要包含对应的头文件。

8.库函数

C语言中有一批保留的名字的符号,比如:int、if、return等,这些符号被称为保留字或关键字。
·关键字都有管特殊的意义
·自己创建的标识符不能和关键字重复
·关键字不能自己创建

C语言的32个关键字:

autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile注:在C99标准中加⼊了inline、 restrict 、_Bool、_Complex、_Imaginary等关键 字

C语⾔关键字的全部介绍可参考如下链接:
C语言的关键字

9.字符和ASCLL编码

在键盘上可以敲出各种字符,这些符号都被称为字符,C语言中是用单引号括起来的,如:‘a’ ‘b’ '@'等。

我们知道,在计算机中所有的数据都是以二进制的形式储存的,那这些字符在内存中分别以什么样的二进制进行储存呢?

为了方便大家相互通信,不造成混乱,美国国家标准学会(ANSI)出台了一个标准ASCLL编码,C语言中的字符就遵循ASCLL编码。
参考:https://zh.cppreference.com/w/cpp/language/ascii

我们不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,不过我们最好能掌握⼏组特殊的数据:

• 字符 A~Z 的ASCII码值从65~90
• 字符 a~z 的ASCII码值从97~122
• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32
• 数字字符0-9的ASCII码值从48~57
• 换⾏ \n 的ASCII值是:10
• 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察。

单个字符的打印可以使用%c来占位指定格式。

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

字符打印展示:

#include<stdio.h>intmain(){inti=0;for(i=32;i<=127;i++){printf("%c ",i);if(i%16==15)printf("\n");}return0;}

打印结果:

10.字符串和\0

C语言中使用双引号括起来的一串字符表示字符串,如"abcdefg",就是一个字符串。

字符串的打印格式可以使用%s来指定,也可以直接打印,演示如下:

intmain(){chara[]="abcdef";printf("%s\n",a);printf("%s\n","hello C");printf("hello c");return0;}

C语言字符串中有一个特殊的知识,就是在字符串的末尾隐藏放着一个\0字符,这个\0是是字符串的结束标志。

可以调试观察。
调试步骤:F10调试起来→调试→窗口→监视随便点开一个→名称中输入要监视的量

调试结果如下:可以看到字符串展开结尾会有一个\0。

\0是字符串的结束标志,在使用printf()打印字符串和strlen()计算字符串长度的时候遇到\0就会停止。

C语言也可以把一个字符串放在一个字符数组中,如下所示:

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



我们可以看到, arr1 字符数组在打印的时候,打印了 a 、 b 、 c 后还打印了⼀些随机值,这就是因为 arr1 在末尾的地⽅没有 \0 字符作为结束标志,在打印的时候没有停⽌。
但是 arr2 的打印就是完全正常的,就是因为 arr2 数组是使⽤字符串常量初始化的,数组中有 \0。作为技术标志,打印可以正常停⽌。

如果我们在arr1数组中单独放⼀个 ‘\0’ 字符会怎么样呢?

看到三次打印的结果是⼀样的了,都是打印到 \0 的时候就停⽌了,那从上述的例⼦我们确实能够观察到 \0 的作⽤和重要性的。

11.转义字符

在字符中有⼀组特殊的字符是转义字符,转义字符顾名思义:转变原来的意思的字符。
⽐如:我们有字符 n ,在字符串中打印的时候⾃然能打印出这个字符,如下:

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


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

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

#include<stdio.h>intmain(){printf("%c\n",'\'');printf("%s\n","\"");printf("c:\\test\\code\\test.c\n");printf("\a");printf("%c\n",'\130');//130是8进制,转换成10进制是88,以88作为ASCII码值的字符是'X'printf("%c\n",88);printf("%c\n",'\x30');//x30中的30是16进制,转换成10进制是48,以48作为ASCII码值的字符是'0'return0;}


转义字符可自行测试。
关于转义字符我们⾸先要了解,然后要能在字符串中识别出来。
转义字符参考

12.语句和语句分类

C语言代码是由一条条语句构成的,C语言的语句可以分为以下五类:
①空语句
②表达式语句
③函数语句
④复合语句
⑤控制语句

12.1空语句

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

#include<stdio.h>intmain(){;//空语句return0;}

空语句,一般出现的地方是:这里需要一条语句,但是这个语句不需要做任何事情,就可以写一个空语句。

12.2表达式语句

表达式语句就是在表达句的后边加上分号,如下所示:

#include<stdio.h>intmain(){inta=20;intb=0;b=a+5;//表达式语句return0;}

12.3函数调用语句

函数=库函数+自定义函数
函数调用的时候,也会加上分号,就是函数调用语句,如下所示:

#include<stdio.h>intAdd(intx,inty){returnx+y;}intmain(){printf("hehe\n");//函数调⽤语句intret=Add(2,3);//函数调⽤语句return0;}

12.4复合函数(代码块)

复合函数其实就是代码块,成对的括号就构成一个代码块,也被称为复合语句。

#include<stdio.h>voidprint(intarr[],intsz)//函数的⼤括号中的代码也构成复合语句{inti=0;for(i=0;i<sz;i++){printf("%d ",arr[i]);}}intmain(){inti=0;intarr[10]={0};for(i=0;i<10;i++)//for循环的循环体的⼤括号中的就是复合语句{arr[i]=10-i;printf("%d\n",arr[i]);}return0;}

12.5控制语句

C语言是结构化的程序设计语言。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序、分支、循环),它们由特定的语句定义符组成,C语言有九种控制语句。

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

13. 注释是什么?为什么写注释?

注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。
注释是给程序员⾃⼰,或者其他程序员看的。
好的注释可以帮我们更好的理解代码,但是也不要过度注释,不要写没必要的注释。
当然不写注释可能会让后期阅读代码的⼈抓狂。
写注释⼀定程度上反应了程序作者的素质,建议⼤家写必要的注释,在未来找⼯作的时候,写代码时
留下必要的注释也会给⾯试官留下更好的印象。

13.1注释的两种形式

C语言有两种表示方法。

13.1.1 /**/形式

第⼀种⽅法是将注释放在 /…/ 之间,内部可以分⾏。
这是C语言早期的注释方式。

/* 注释 *//* 这是⼀⾏注释 */

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

printf("a ");/* 注释⼀ printf("b "); printf("c "); /* 注释⼆ */printf("d ");

上⾯⽰例的原意是,第⼀⾏和第三⾏代码的尾部,有两个注释。
但是,第⼀⾏注释忘记写结束符号,导致注释⼀延续到第三⾏结束。
/**/ 的这个注释也不⽀持嵌套注释, /* 开始注释后,遇到第⼀个 */ 就认为注释结束了。

/* printf("a "); printf("b "); printf("c "); /* 注释⼆ */printf("d ");*/
13.1.2 //形式

第⼆种写法是将注释放在双斜杠 // 后⾯,从双斜杠到⾏尾都属于注释。这种注释只能是单⾏,可以放在⾏⾸,也可以放在⼀⾏语句的结尾。这是 C99 标准新增的语法。
注释快捷键:Ctrl+K+C
取消快捷键:ctrl+K+V

// 这是⼀⾏注释intx=1;// 这也是注释

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

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

上⾯⽰例中,双引号⾥⾯的注释符号,都会被视为普通字符,没有注释作⽤。

13.2注释会被替换

编译时,注释会被替换成⼀个空格,所以 min/* 这⾥是注释*/Value 会变成 min Value ,⽽不
是 minValue 。

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

回形针最大化器:AI目标错位与防失控清单

如果你跟我一样长期在生产环境里调模型、改策略、定KPI&#xff0c;大概早就发现一个魔咒&#xff1a;凡是挂在后台的指标&#xff0c;最后都会被系统以各种方式"顶着涨"。我每次被这种问题折磨的时候&#xff0c;脑子里都会蹦出一个词&#xff1a;paperclip。准确地…

作者头像 李华
网站建设 2026/9/29 14:45:41

Qwen3.8 27B本地部署实战:从硬件评估到C++开发辅助

本地跑大模型&#xff0c;很多人的第一反应是&#xff1a;跑是能跑&#xff0c;但顶多写点打油诗、做个翻译&#xff0c;真让它干活就露馅了。这种印象在过去两年里被反复验证——7B、8B模型在通用对话上勉强够用&#xff0c;可一旦涉及 C 多文件工程、3D 建模脚本、完整小游戏…

作者头像 李华
网站建设 2026/9/29 14:43:31

多模态DeepSeek实战:图片理解、批量OCR与成本核算全解析

“多模态版 DeepSeek 长眼了&#xff0c;1000 张图只要 1 块钱”——这两天这个话题在各个技术群里传得比较快。先说结论&#xff1a;多模态不是玄学&#xff0c;它指的是模型能直接吃图片、截图、图表、文档&#xff0c;而不是只能读文字。对开发者来说&#xff0c;这意味着以…

作者头像 李华
网站建设 2026/9/29 14:40:36

从零手写LoveLive主题活动页:原生HTML/CSS/JS打造夏日人鱼狂欢节

在做粉丝活动页、节日专题页或者社团招新页时&#xff0c;很多人习惯直接去找现成模板&#xff0c;改改文案就上线。但模板用多了就会发现&#xff0c;页面长得千篇一律&#xff0c;交互也很僵硬&#xff0c;遇到需要“氛围感”强的主题时尤其难办。本文换个思路&#xff0c;从…

作者头像 李华