C语言零基础第1讲:初识C语言

发布时间:2026/7/30 18:29:08
C语言零基础第1讲:初识C语言 目录1.C语言是什么2.C语言的历史2.1 机器语言2.2 汇编语言2.3 高级语言2.4 C语言的发展3.使用什么软件写C语言程序3.1 源程序变成可执行程序的过程3.2 集成开发环境4.第一个C语言程序5.main函数6.库函数7.关键字8.ASCIII编码9.字符串和\010.转义字符11.语句分类11.1 空语句11.2 表达式语句11.3 函数调用语句11.4 复合语句11.5 控制语句12.注释12.1 注释的2种形式12.1.1 /*...*/形式12.1.2 //...的形式12.2 注释会被替换正文开始1.C语言是什么人与人交流使用的是自然语言如英语、汉语、日语...那么人和计算机使用什么语言交流呢使用计算机语言人们可以通过计算机语言写的程序对计算机下达指令让计算机完成对应的工作C语言就是众多计算机语言的一种其他的还有C、Java、Go、Python等2.C语言的历史2.1 机器语言机器语言是最早出现的计算机语言也是计算机唯一能够直接识别和执行的语言是由0和1组成的二进制数字序列。每一条指令都对应了一个特定的操作比如可能使用“10110100”表示“进行加法运算”。你会发现这种语言难以识记于是汇编语言应运而生。2.2 汇编语言汇编语言用英文单词或其缩写代替二进制的指令代码比如ADD表示相加操作SUB表示相减操作。但计算机不能直接识别汇编语言用汇编语言写好的程序需要通过汇编程序翻译成机器语言程序然后交给底层的硬件机器去执行。汇编语言不具备可移植性。简单来说 汇编语言的代码是“量身定做”给特定硬件主要是CPU的。这台电脑的CPU能看懂的汇编指令换一台CPU型号或者架构不同的电脑很可能就看不懂了因为它们的指令规则不一样。直观的表现就是硬件变了代码可能就完全失效必须重新写。汇编语言更容易记忆和理解但是汇编语言还是不够友好于是又发展出了高级语言。而C语言这类高级语言之所以可移植正是因为它不直接对应硬件指令而是通过编译器翻译成不同硬件能看懂的汇编/机器码相当于有个通用翻译官帮代码适应不同的硬件。2.3 高级语言高级语言更加贴近人类自然语言更容易编写和阅读。计算机无法直接识别高级语言需要通过工具将其转换为机器语言如汇编程序汇编器、编译程序编译器和解释程序解释器。故而高级语言可分为编译型语言和解释型语言。编译型语言包括C、C等通过编译器将整个程序一次性翻译成机器语言生成可直接执行的文件。编译器可以直接产生机器语言代码也可以先产生汇编语言然后再通过汇编程序将汇编语言代码转换为机器语言代码。解释型语言包括Python、JavaScript等通过解释器逐行将代码翻译成机器语言并立即执行即翻译一行就执行一行不生成独立的可执行文件。2.4 C语言的发展C语言最初是作为Unix系统的开发工具而发明的。1969年发明B语言1969年贝尔实验室的肯·汤普森和丹尼斯·里奇一起开发了Unix操作系统。而Unix是用汇编语言写的不具备可移植性。为了移植到其他计算机上汤普森就在BCPL的基础上发明了B语言。1972年发明C语言丹尼斯·里奇和布莱恩·柯林汉又在B语言的基础上重新设计了一种新语言这种语言取代了B语言所以称为C语言。1973年Unix系统使用C重写整个Unix系统都使用C语言重写。此后这种语言开始快速流传广泛用于各种操作系统和系统软件的开发。1988年C语言标准化美国国家标准协会ANSI正式将C语言标准化通过统一语法规则、定义标准库和消除歧义等让C语言成为一门真正通用的“普通话”标志着C语言开始稳定和规范化。至今一直到今天C语言还是在广泛使用居于计算机语言的前三地位。3.使用什么软件写C语言程序3.1 源程序变成可执行程序的过程正如前面所说C语言是一门编译型语言C语言的源代码是文本内容文本文件本身无法执行。需要经过编译器的翻译和链接器的链接 生成二进制的可执行文件才能够被执行。源程序变成可执行程序的过程具体而言可分为三步预处理主要用C语言编译器对各种预处理命令进行处理包括对头文件的包含、宏定义的扩展和条件编译的选择等如处理#include、#define等指令然后生成预处理后的文件。编译直接翻译成计算机能够直接识别的机器语言或者先翻译成汇编语言再通过汇编器翻译成机器语言最终生成目标文件。链接将多个目标文件和库文件组合成可执行文件。一个工程一般会由多个源文件组成如下图所示演示了源程序经过编译器和链接器处理的过程注意每个源文件.c单独经过编译器的处理生成对应的目标文件.obj多个目标文件和库文件经过链接器的链接生成对应的可执行程序.exe3.2 集成开发环境经过上面的介绍显然写C语言程序是需要编译器的。常见的编译器有msvc、clang、gcc等。使用什么软件写C语言程序这个问题其实就是在说使用什么集成开发环境写C语言程序集成开发环境IDE就是用于提供程序开发环境的应用程序一般包括代码编辑器、编译器、调试器和图形用户界面等工具。是集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。常见的集成开发环境有VS2022、XCode、CodeBlocks、DevC、Clion等。VS2022集成了MSVC安装包较大一些安装简单无需多余配置使用起来非常方便Xcode集成了clang苹果电脑上的开发工具CodeBlocks集成了gcc这个工具比较小众需要配置环境不太推荐DevC集成了gcc小巧但工具过于简单对于代码风格的养成不好一些竞赛使用Clion是默认使用CMake编译器是可以配置的工具是收费的暂时不推荐使用整体考虑推荐大家安装VS2022的社区版进行学习。优点如下VS2022是一个主流的集成开发环境企业中使用较为普遍。包含了编辑器编译器调试器功能强大。直接安装即可使用基本不用额外配置环境上手容易。默认界面是中文的初学者友好。缺点如下功能丰富安装包大故而占用空间多。4.第一个C语言程序#includestdio.h int main() { printf(Hello World\n); return 0; }上图演示了一段非常经典而简单的代码并给出运行结果。在VS2022中运行代码的快捷键是Ctrl F514英寸的笔记本电脑上的快捷键可能为Ctrl Fn F5。5.main函数main函数也叫主函数不管程序有多少行代码 都是从main函数开始执行的。main前面的int表示main函数执行结束的时候返回一个整型类型的值所以在main函数的最后写return 0正好前后呼应。main函数是程序的入口。main函数必须有且仅有一个。即使一个项目中有多个.c文件但是只能有一个main函数。6.库函数printf(Hello World\n);上面的代码使用了printf函数printf函数是一种库函数功能是在屏幕上打印出相应的信息。printf函数的使用方法如下%c、%d等是占位符会被后面的值替换。\n是换行符在打印完一条内容后实现换行那么先后打印的2条内容就不会连在一起了。我们说printf函数是一种库函数 那么什么是库函数呢我们来看一张图从上面的图片可以看出要实现打印功能实际上需要很多行冗长的代码。如果在一个程序中你需要多次使用到打印功能那么每次都要写一长串代码来实现这个功能这实在是太麻烦太低效了。为了提高效率C语言标准规定了一个函数命名为printf函数人们只需要把想要打印的内容传递给printf函数仅需一条代码即可实现打印功能。同样的有一些功能我们是需要经常用到的于是C语言标准规定了一组函数这些函数再由不同的编译器厂商根据标准实现提供给人们使用。这些函数组成了一个函数库被称为标准库这些函数被称为库函数。在这个基础上一些编译器厂商可能会额外扩展提供部分函数这些函数其他编译器不一定支持。属于同一个系列的库函数一般会声明在同一个头文件.h中所以库函数的使用需要包含对应的头文件。比如printf函数的使用就需要包含stdio.h这个头文件是Standard Input/Output Header的缩写意为标准输入/输出头文件。如下所示#include stdio.h7.关键字在C语言中有一批保留名字的符号比如int、if、return等这些符号被称为保留字或关键字。在创建变量、函数、结构体等时需要给变量、函数和结构体等取一个名字这个名字是不能乱取的。那么取名字有什么讲究呢那就是在创建这些标识符时不能和关键字重复。C语言的32个关键字如下注在C99标准中加入了inline、restrict、_Bool、_Complex、_Imaginary等关键字。8.ASCII编码在键盘上可以敲出各种符号比如a、b、、#等这些符号被称为字符。在C语言中字符是用单引号括起来的比如a、b、、#等。我们知道在计算机中所有数据都是以二进制的形式存储的那么这些字符该如何存储呢我们可以给每一个字符编一个独一无二的二进制序列这就叫做编码。每个人的编码方式不尽相同所以为了统一标准后来美国国家标准学会ANSI出台了一个标准ASCII编码C语言中的字符就遵循了ASCII编码的方式。ASCII码表如下我们不需要记住ASCII码表中的所有数字使用时查看即可但最好能掌握几组特殊的数据字符A~Z的ASCII码值65~90字符a~z的ASCII码值97~122对应的大小写字符如a减A的ASCII码值的差值为 32因为在Z和a之间还存在6个字符[、\、]、^、_、·数字字符0~9的ASCII码值48~57换行\n的ASCII码值10ASCII码值从0~31这32个字符是不可打印字符无法打印在屏幕上观察单个字符的打印可以用%c来指定格式可以使用ASCII码值的十进制数进行打印可打印字符的展示9.字符串和\0在C语言中使用双引号括起来的一串字符就称为字符串如abcdefC语言字符串中有一个特殊的知识就是在字符串的末尾隐藏放着一个\0字符这个\0字符是字符串的结束标志。如上图对于字符串abcdef 我们看到的是6个字符abcdef但是实际上在末尾还隐藏着一个转义字符\0\0是字符串结束的标志。我们在使用printf()打印字符串或使用strlen()计算字符串长度时遇到\0就自动停止了。在C语言中可以把一个字符串放在一个字符数组中我们利用下面的代码验证一下\0的功能我们可以观察到arr1中存放的是3个字符abc所以在末尾没有\0。而arr2中存放的是1个字符串abc所以在末尾有\0作为字符串结束的标志。运行结果如下我们可以看到 arr1在打印了a、b、c后继续往后打印了一些随机值。这是因为arr1中存放的是3个字符而不是字符串所以末尾没有隐藏一个\0作为停止标志。而打印是以%s即字符串的格式打印的所以在打印时从左往右一个个打印却没有遇到结束标志\0所以就没有停止打印。而arr2的打印是正常的因为arr2是使用字符串常量初始化的字符串的末尾隐藏了一个\0并作为停止标志所以打印可以正常停止。刚刚说到arr1中没有\0故而在打印时出现了问题如果我们在arr1的最后单独放一个\0字符会怎么样呢可以看到3次打印的结果都一样都是遇到\0就停止打印了。10.转义字符在前面我们提到了\n、\0。它们都属于转义字符转义字符顾名思义就是转变原来意思的字符。比如有字符n放在abcndef中可以打印出abcndef如果我们在n的前面加上一个反斜杠\呢那么就不会打印出n字符了而是变成了换行如上所示这就是转义字符的作用我们可以简单地理解为\让n的意思发生了转变n本来是一个普通的字符被\转义为换行的意思。在C语言中像这样的转义字符还有很多具体如下\在书写连续多个问号时使用防止它们被解析成三字母词在新的编译器上没法验证了\ 用于表示字符常量 如下图\ 用于表示一个字符串内部的双引号如下图\\ 用于表示一个反斜杠防止它被解释为一个转移序列符如下图\a 警报这会使终端发出警报声或出现闪烁或两者同时发生。\b 退格键光标回退一个字符但不删除字符。如下图依次打印出a、b、c此时光标在c的后面接下来遇到了\b于是光标回退到b的后面然后继续打印d而d覆盖了原来的c于是变成了abd继续往后打印最终打印出abdef。\f 换页符光标移到下一页。在现代系统上这已经反映不出来了行为改成类似于\v\n换行符\r 回车符光标移到同一行的开头。如下图依次打印出a、b、c此时光标在c的后面接下来遇到\r光标移到这一行的开头也就是a的前面然后继续打印d、e、f而d、e、f覆盖了原来的a、b、c所以最终打印出def。\t 水平制表符光标移到下一个水平制表位一个水平制表位一般默认是8个字符。如果\t的前面有x个字符那么就会算上前面的字符个数往后面补充8-x个空格构成一个水平制表位。如下图水平制表符的对齐效果如下\v 垂直制表符光标移到下一个垂直制表位通常是下一行的同一列它会按垂直方向来对齐内容。如下图\ddd字符的8进制表示形式d表示1个八进制数字。如下图\xdd字符的16进制表示形式d表示1个十六进制数字。如下图\0 null字符代表没有内容\0就是\ddd这类转义字符的一种用于字符串的结束标志其ASCII码值是0。11.语句分类C语言中的语句可以分为以下5类空语句表达式语句函数调用语句复合语句控制语句11.1 空语句在C语言中空语句是仅由一个分号组成的语句它不执行任何操作。如下图空语句虽然看似无用但在特定场景下有其独特的应用价值。空语句出现的位置一般是这里需要一条语句但是这个语句不需要做任何事。如下图简化后如下11.2 表达式语句表达式语句就是在表达式的后面加上一个分号通过分号将表达式转换为可执行的语句。常见于变量赋值、函数调用、自增自减等操作。11.3 函数调用语句函数调用的时候也会加上分号就是函数调用语句。函数的调用可以分为库函数的调用和自定义函数的调用如下图11.4 复合语句复合语句其实就是代码块是由一对花括号 { } 括起来的内容。花括号包裹任意数量的语句哪怕只有1条、甚至0条都叫复合语句。如下图for循环的循环体花括号括起来的内容就是复合语句。11.5 控制语句控制语句用于控制程序的执行流程以实现程序的顺序结构、选择结构和循环结构它们由特定的语句定义符组成。C语言有9种控制语句可以分为以下3类条件判断语句分支语句if语句、switch语句循环执行语句do while语句、while语句、for语句转向语句break语句、goto语句、continue语句、return语句12.注释注释是对代码的说明编译器会忽略注释。也就是说注释对实际代码没有任何影响。注释是给自己看的也是给别人看的。好的注释可以帮助我们更好地理解代码但也不要过度注释不要写不必要的注释。12.1 注释的2种形式C语言的注释有2种方法。12.1.1 /*...*/形式第一种方式是将注释放在/*和*/之间内部可以分行。如下图要注意注释是不能放在printf里面的还是会被打印出来起不到注释的效果但它可以插在行内比如放在函数的参数列表里面对参数进行说明这种注释方式一定不能忘记写结束符号*/如下图在上图中原意为在第1行和第4行各有一个注释但是注释1忘了写结束符号*/导致注释一直往后延续直到找到注释2的结束符号*/才结束注释于是第二三四行的内容全被注释了我们可以看一下运行结果同时这种注释方式也不支持嵌套注释/*开始注释后遇到第一个*/就认为注释结束了如下图12.1.2 //...的形式第二种方式是将注释放在双斜杠//的后面从//到行尾都属于注释。这种注释方法只能是单行的可以放在行首也可以放在一行语句的结尾。这是C99标准新增的语法。同样的这种注释方式也不能放在双引号里面否则还是会被打印出来如下图12.2 注释会被替换在编译时注释会被替换为一个空格比如abc/*这里是注释*/def会被替换为abc def而不是abcdef。完结