目录
一、什么是C语言?
二、C语言的历史与成就
三、编译器选择(VS2022)
1、编译与链接
2、编译器对比
3、VS2022的优缺点
四、VS项目与源文件、头文件介绍
五、第一个C语言程序
六、main函数
七、printf和库函数
八、关键字介绍
九、字符与ASCII编码
十、字符串与空字符
十一、转义字符
十二、语句和语句分类
1、空语句
2、表达式语句
3、函数调用语句
4、复合语句
5、控制语句
十三、注释是什么?为什么要写注释?
1、注释的两种形式
/* */形式
双斜杠//
2、注释替换规则
十四、VS2022创建项目步骤
第一步:点击创建新项目
第二步:选择空项目,然后下一步
第三步:填写项目名称和路径
第四步:项目创建完成
第五步: 新建源文件过程
第六步:显示所有模版并成功新建.c源文件
一、什么是C语言?
- 人与人交流使用的是自然语言,比如汉语、英语、日语等。
- 那么人与计算机如何沟通呢?答案是通过计算机语言。
- 目前已知的计算机语言已有上千种。人们通过编写计算机程序来给计算机下达指令,使其完成特定工作。
- C语言就是众多计算机语言中的一种,其他常见的还有C++、Java、Go、Python等。
二、C语言的历史与成就
C语言最初是为开发Unix操作系统而发明的工具。
摘要:TIOBE 指数 - TIOBE
2025 年 6 月的 TIOBE 指数:
TIOBE 编程社区指数是衡量编程受欢迎程度的指标 语言。该指数每月更新一次。评级基于 全球技术娴熟的工程师、课程和第三方供应商。热门网站 Google、Amazon、Wikipedia、Bing 和其他 20 多个网站用于计算评级。 需要注意的是,TIOBE 指数并不是关于最好的编程语言或语言 其中编写了大部分代码行。
该索引可用于检查您的编程技能是否仍然是最新的,或者创建 关于在开始构建新的 软件系统。TIOBE 指数的定义可以在这里找到。
三、编译器选择(VS2022)
1、编译与链接
- C语言作为一门编译型计算机语言,其源代码以文本文件形式存在。
- 这些文本文件本身不可直接执行,需要通过编译器进行翻译并由链接器完成链接,最终生成二进制可执行文件才能运行。
- C语言代码通常存储在以.c为后缀的文件中。要将其转换为可执行程序,需要经过编译和链接两个关键步骤。
一个工程通常由多个源文件组成。下图展示了源程序经过编译器和链接器处理的过程:
注意:
-
编译器将每个源文件(.c)单独编译,生成对应的目标文件(.obj后缀文件)
-
链接器将多个目标文件与库文件组合,最终生成可执行程序(.exe文件)
这就是Windows系统下C语言程序生成.exe可执行文件的完整流程。
2、编译器对比
- C语言是一门编译型计算机语言,需要通过编译器将源代码转换为机器可执行的指令。
- 常见的C语言编译器包括msvc、clang和gcc等。
- 此外,还有一些集成开发环境(IDE)如VS2022、XCode、CodeBlocks、DevC++和Clion等,它们内置了这些编译器。
- 集成开发环境(IDE)是为程序开发提供完整环境的应用程序,通常包含代码编辑器、编译器、调试器和图形用户界面等工具。
- 这些IDE整合了代码编写、分析、编译和调试等功能,提供了一整套开发软件服务。
- VS2022:集成MSVC编译器(安装包较大但安装简便,无需额外配置,使用便捷)(Visual Studio 2022 IDE - 适用于软件开发人员的编程工具)
- XCode:苹果电脑专用开发工具,内置clang编译器(Xcode - Apple Developer)
- CodeBlocks:集成gcc编译器(相对小众,需配置环境,不推荐使用)(Code::Blocks - Code::Blocks)
- DevC++:轻量级gcc集成工具(界面过于简单,不利于代码风格养成,常见于竞赛场景)(Dev-C++ download | SourceForge.net)
- Clion:默认采用CMake构建系统,可配置编译器(付费软件,暂不推荐)(CLion:JetBrains 的 C 和 C++ 跨平台 IDE)
综合推荐:建议安装VS2022社区版(免费、操作简便、行业主流工具)
📎 VS2022安装教程:VS2022安装使用教程,VS2022使用教程Visual Studio 2022详细安装使用调试教程C语言编译器C++编译器VS2022使用教程C语言软件安装_哔哩哔哩_bilibili
3、VS2022的优缺点
优点:
- 作为主流集成开发环境,VS2022在企业中应用广泛
- 集编辑器、编译器和调试器于一体,功能全面
- 安装即用,基本无需额外配置,易于上手
- 默认中文界面,对初学者十分友好
缺点:
- 功能丰富导致安装包较大,占用较多存储空间
四、VS项目与源文件、头文件介绍
在VS中进行开发时,需要先创建项目(直接新建项目即可)。项目创建后,可添加源文件和头文件,C语言把:
- 源文件:以.c为后缀
- 头文件:以.h为后缀
五、第一个C语言程序
#include <stdio.h>int main()
{printf("hello C\n");return 0;
}
在VS2022中创建项目、编写C代码并运行:
在VS2022中运行代码的快捷键是:Ctrl+F5。
六、main函数
- 任何C语言程序都从main函数开始执行,无论代码量有多少。
- main函数是程序的唯一入口,也被称为主函数。
- 函数前的int表明main函数执行完毕后会返回一个整型值,因此在函数末尾使用"return 0;"与之呼应。
关于main函数的关键点:
- 程序有且仅有一个main函数
- 即使项目包含多个.c文件,也只能有一个main函数(程序入口唯一)
初学者常见错误:
- 将main误写为mian
- 遗漏main后面的括号()
- 使用中文符号(如括号、分号)
- 语句结尾未加分号
七、printf和库函数
在上文示例代码中,我们使用了printf函数:
printf("hello C\n");
printf是一个标准库函数,用于在标准输出设备(通常是屏幕)上显示信息。使用时只需将需要输出的字符串用双引号括起来作为参数传入即可。
printf不仅能输出字符串,还可以打印多种数据类型:
int n = 100;
printf("%d\n", n); // 打印整型
printf("%c\n", 'q'); // 打印字符
printf("%lf\n", 3.14);// 打印双精度浮点型
其中%d、%c等是格式占位符,将被后续的实际值替代(后续会详细讲解)。
使用库函数时需要包含相应头文件,例如printf需要:
#include <stdio.h>
关于库函数:
C语言标准定义了一组常用函数的规范,由编译器厂商实现并提供给开发者使用,这些函数统称为标准库函数,这些函数组成了⼀个函数库,被称为标准库,某些编译器厂商可能还会提供额外的扩展函数(不一定被其他编译器支持)。
同类型的库函数通常声明在同一个头文件中,因此使用时需要包含对应的头文件。
更多库函数信息可参考:cplusplus.com/reference/clibrary/
八、关键字介绍
C语言中有一组具有特殊含义的保留符号,如int、if、return等,这些符号被称为关键字或保留字。关键字的特性包括:
- 具有特定功能,专为C语言设计
- 不能用作程序员自定义的标识符
- 无法由用户自行创建
C语言包含32个基本关键字:
补充说明:
- C99标准新增了inline、restrict、_Bool、_Complex、_Imaginary等关键字
- 实际开发中最常用的仍是上述32个基础关键字
- 完整关键字说明可参考:C keywords - cppreference.com
这些常用关键字将在后续中逐步讲解。
九、字符与ASCII编码
在键盘上输入的各种符号(如a、q、@、#等)都被称为字符。在C语言中,字符需要用单引号括起来表示,例如'a'、'b'、'@'等。
由于计算机中的所有数据都以二进制形式存储,这些字符在内存中也需要对应的二进制表示。如果每个人都自行定义字符的二进制编码,就会造成通信混乱。为此,美国国家标准学会(ANSI)制定了统一的ASCII编码标准。C语言中的字符编码正是遵循了这一标准。
以下是ASCII编码表: ASCII Chart - cppreference.com
虽然不需要记忆整个ASCII码表,但掌握几组关键数据会很有帮助:
- 大写字母A-Z对应65-90
- 小写字母a-z对应97-122
- 大小写字母的ASCII差值恒为32(如'A'与'a')
- 数字0-9对应48-57
- 换行符\n的ASCII值为10
- 0-31为不可打印的控制字符,无法打印在屏幕上观察
单个字符的打印可以使用%c来指定格式:
#include <stdio.h>
int main()
{printf("%c\n", 'Q'); // 直接输出字符printf("%c\n", 81); // 通过ASCII码输出return 0;
}
可打印字符展示(32-126):
#include <stdio.h>
int main()
{for(int i=32; i<127; i++) {printf("%c ", i);if(i%16 == 15) printf("\n");}return 0;
}
十、字符串与空字符
在C语言中,字符串是通过双引号括起来的一串字符来表示的。例如:"abcdef"就是一个字符串。字符串的打印可以使用%s格式符,也可以直接输出:
#include <stdio.h>
int main()
{printf("%s\n", "hello C");printf("hello c");return 0;
}
C语言字符串有一个重要特性:每个字符串末尾会自动包含一个隐藏的'\0'字符,这个空字符标志着字符串的结束。
观察VS2022的监视窗口:
在字符串"abcdef"中,我们直观看到的是6个字符:a、b、c、d、e、f。但实际上字符串末尾还包含一个隐藏的转义字符\0,它是字符串的结束标志。正是因为这个特性,当使用库函数如printf()打印字符串或strlen()计算字符串长度时,遇到\0就会自动停止操作。
在C语言中,字符串也可以存储在字符数组中。下面通过代码演示\0的作用:
#include <stdio.h>
int main()
{char arr1[] = {'a', 'b', 'c'}; // arr1数组仅存储3个字符char arr2[] = "abc"; // arr2数组存储字符串printf("%s\n", arr1);printf("%s\n", arr2);return 0;
}
调试时可以发现arr1和arr2的内容差异:
运行结果:
当打印 arr1 字符数组时,输出完 a、b、c 后会出现随机值,这是因为 arr1 末尾缺少 \0 作为结束标志,导致无法正常终止,直到找到\0为止。而 arr2 数组使用字符串常量初始化时自动包含 \0 标志,因此打印能正常停止。
如果在 arr1 数组中手动添加 \0 字符会怎样呢?
#include <stdio.h>
int main()
{char arr1[] = {'a', 'b', 'c', '\0'};char arr2[] = "abc";printf("%s\n", arr1);printf("%s\n", arr2);printf("%s\n", "abc\0def");return 0;
}
从三次打印结果可以看出,输出都在遇到 '\0' 时终止。这个例子清楚地展示了 '\0' 的重要作用。
十一、转义字符
在前面的代码中,你可能遇到过 \n
和 \0
这样的特殊符号。这些都属于转义字符,顾名思义就是能够改变字符原本含义的特殊字符。举个简单例子,字符 'n' 在字符串中会正常显示,但当我们使用 \n
时,它的含义就发生了变化:
#include <stdio.h>
int main()
{printf("abcndef");return 0;
}
程序运行后将输出以下结果:
如果我们在代码中进行调整,在变量 n 前面添加反斜杠 \,修改后的代码如下:
#include <stdio.h>
int main()
{printf("abc\ndef");return 0;
}
输出的结果:
修改前后的代码输出结果截然不同,这是为什么呢?关键在于转义字符的作用。\n 是一个表示换行的转义字符,可以理解为反斜杠 \ 改变了字母 n 的原有含义——原本普通字符 n 被转义为具有换行功能。
在 C 语言中,类似的转义字符还有以下几种:
转义字符 | 说明 | 示例/备注 |
---|---|---|
\n | 换行符 | 光标移动到下一行行首 |
\? | 连续问号转义 | 防止被解析为三字母词(现代编译器基本不需要) |
\' | 单引号字符 | 用于字符常量中:char c = '\''; |
\" | 双引号字符 | 用于字符串内部:"He said, \"Hello\"" |
\\ | 反斜杠字符 | 表示路径时:"C:\\Windows\\System" |
\a | 警报符 | 触发系统提示音或闪烁(ASCII 7) |
\b | 退格符 | 光标回退一格(ASCII 8),不删除内容 |
\f | 换页符 | 原始设计用于打印机换页,现代终端行为类似\v |
\r | 回车符 | 光标返回行首(常用于Windows换行\r\n ) |
\t | 水平制表符 | 跳到下一个制表位(通常4/8字符间隔) |
\v | 垂直制表符 | 光标移动到下一行同列位置 |
有两种转义字符可以理解为字符的八进制或十六进制表示形式:
\ddd
:由1-3位八进制数字组成。例如:\130
表示字符X\xdd
:由2位十六进制数字组成。例如:\x30
表示字符0
其中,\0
表示null字符,代表空内容。它属于\ddd
这类转义字符,常用于字符串结束标志,其ASCII码值为0。
代码示例:
#include <stdio.h>int main()
{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", '\x30'); //x30中的30是16进制,转换成10进制是48,以48作为ASCII码值的字符是'0'return 0;
}
- 这些ASCII码值可以通过编写代码自行验证
- 我们需要理解转义字符的概念,并能在字符串中正确识别
- 转义字符参考文档:Escape sequences - cppreference.com
十二、语句和语句分类
C语言代码由一系列语句构成,可分为以下五类:
- 空语句
- 表达式语句
- 函数调用语句
- 复合语句
- 控制语句
1、空语句
空语句是最简单的语句形式,仅由一个分号构成。
#include <stdio.h>
int main()
{; //空语句return 0;
}
空语句通常用于需要语句但不执行任何操作的场景。
2、表达式语句
表达式语句是在表达式末尾加上分号形成的语句。
#include <stdio.h>
int main()
{int a = 20;int b = 0;b = a + 5; //表达式语句return 0;
}
3、函数调用语句
函数调用加上分号即构成函数调用语句。
#include <stdio.h>
int Add(int x, int y)
{return x+y;
}int main()
{printf("hehe\n"); //函数调用语句int ret = Add(2, 3); //函数调用语句return 0;
}
4、复合语句
复合语句是由一对大括号{}包裹的代码块。
#include <stdio.h>
void print(int arr[], int sz)
{ //函数体构成复合语句int i = 0;for(i=0; i<sz; i++) {printf("%d ", arr[i]);}
}int main()
{int i = 0;int arr[10] = {0};for(i=0; i<10; i++) { //循环体构成复合语句arr[i] = 10-i;printf("%d\n", arr[i]);}return 0;
}
5、控制语句
控制语句用于控制程序执行流程,实现程序的不同结构(顺序结构、选择结构、循环结构)。C语言共有9种控制语句,可分为三类:
- 条件判断语句(分支语句):if语句、switch语句;
- 循环执行语句:do-while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
后续章节将详细介绍这些控制语句。
十三、注释是什么?为什么要写注释?
注释是对代码的解释说明,编译器会忽略这部分内容,因此注释不会影响代码的实际运行。其主要目的是帮助程序员(包括自己和其他开发者)更好地理解代码。
优秀的注释应当简明扼要,既不能过度注释(避免写无意义的说明),也不能完全不写(否则会给后续代码维护带来困难)。适当地添加必要注释不仅能体现开发者的专业素养,在求职面试时,规范的注释习惯也会给面试官留下良好印象。
VS2022注释与去注释快捷键如下:
1、注释的两种形式
C语言支持两种注释方式:
/* */形式
这种注释可以跨越多行,格式如下:
/* 单行注释 */
/*
多行
注释
*/
也可用于行内注释:
int fopen(char* s /* 文件名 */, int mode);
在上面的示例中,/* file name */
用于说明函数参数,后续代码仍然会正常执行。需要注意的是:这种注释必须包含结束符号*/
,否则可能导致错误。
printf("a "); /* 注释一
printf("b ");
printf("c "); /* 注释二 */
printf("d ");
本示例中,原意是在第一行和第三行代码尾部各有一个注释。但由于第一行注释漏写了结束符号,导致注释一的范围一直延续到第三行结束(观察代码中高亮与不高亮的部分)。
注意事项:
- 必须成对使用
/*
和*/
,否则会导致注释范围错误 - 不支持嵌套注释,遇到第一个
*/
就会结束注释块 - 编译时注释会被替换为一个空格,例如
min/*注释*/Value
会变成min Value
双斜杠//
第二种方式是使用双斜杠//进行注释,从//开始到行尾的内容都属于注释。这种注释仅限于单行,既可以独立成行,也可以跟在代码语句后面。这是C99标准新增的语法。
示例:
// 这是单行注释
int x = 1; // 语句后的注释
需要注意的是,所有类型的注释都不能出现在双引号内。双引号内的注释符号会被视为字符串的一部分,失去注释功能。
示例:(观察代码中高亮部分,代码中并无不高亮部分,意思是注释不起作用)
printf("// hello /* world */ ");
上述示例中,双引号内的所有注释符号都被当作普通字符处理。
2、注释替换规则
编译器会将注释替换为一个空格。例如:
min/* 注释 */Value
将被处理为min Value
,而不是minValue
。
十四、VS2022创建项目步骤
第一步:点击创建新项目
第二步:选择空项目,然后下一步
第三步:填写项目名称和路径
第四步:项目创建完成
如果没有左边方框的内容就点击视图找到解决方案资源管理器:
第五步: 新建源文件过程
第六步:显示所有模版并成功新建.c源文件
小知识:C++叫c plus plus或者cpp;C++代码的文件后缀是.cpp