对于刚开始学习编程的人来说,C语言往往是绕不开的一门语言。它语法简洁、执行效率高、贴近计算机底层,被广泛应用于操作系统、嵌入式开发、底层软件、编译器以及高性能程序设计等领域。

1. C语言是什么?

在这里插入图片描述

C语言是一种通用的程序设计语言。人类之间通过自然语言交流,例如汉语、英语;而人与计算机之间,则需要通过程序设计语言来表达指令。C语言就是程序员向计算机描述计算步骤和操作逻辑的一种语言。
C语言是一种用途广泛、功能强大、使用灵活的过程性编程语言,既可用于编写应用软件,又可用于编写系统软件。
与 Python、Java 等语言相比,C语言更接近计算机底层。它能够让学习者更直接地理解内存、地址、数据表示、函数调用、编译链接等底层机制。因此,C语言不仅是一门编程语言,也常被看作理解计算机系统的基础语言。

2. C语言为什么重要?

C语言最初与UNIX系统的发展关系密切,后来被广泛应用于操作系统、嵌入式开发、编译器、数据库、驱动和高性能计算等领域。许多后来的语言,如C++、Java、C#、Go等,在语法或设计思想上都能看到C语言的影子。
C语言的重要性主要体现在三点:
第一,足够底层,可以帮助学习者理解计算机真正如何工作。
第二,足够高效,适合开发对性能要求较高的软件。
第三,影响深远,很多现代语言和系统都建立在C语言思想之上。

3. 编译器、IDE与VS2022:不要把它们混为一谈

C语言是一门编译型语言。也就是说,.c文件中的源代码不能被计算机执行,需要先经过编译器翻译,再经过链接器链接,最终生成可执行程序。

这里区分两个概念:编译器集成开发环境

编译器负责把源代码翻译成机器能够理解的目标代码。常见的 C/C++ 编译器包括 MSVC、GCC、Clang。
IDE,也就是集成开发环境,通常集成了代码编辑、项目管理、编译、调试等功能。Visual Studio 2022 就是Windows平台上常用的 IDE。Microsoft 官方文档将 Visual Studio 用于C/C++ 应用开发,并提供写代码、构建代码、调试代码等完整工具链支持。
对于初学者来说,VS2022 的优点是安装后即可创建项目、编写代码、编译运行和调试程序,配置成本较低。

4. C程序是如何变为可执行文件的?

一个C程序从源码到运行结果,一般要经历以下过程:

在这里插入图片描述

在 Windows 平台上,一个项目中可以包含多个.c源文件。每个源文件会先被编译成对应的目标文件。随后,多个目标文件以及相关库文件会通过链接器组合起来,生成最终的.exe可执行程序。
这也是为什么C语言项目中经常会看到源文件、头文件、目标文件、可执行文件等不同类型的文件。它们分别处在程序构建流程的不同阶段。

5. 源文件和头文件:.c.h有什么区别?

在C语言项目中,通常有两类常见文件:

  1. .c文件:源文件,主要存放函数实现和具体代码逻辑
  2. .h文件:头文件,主要存放函数声明、宏定义、类型声明等公共信息

可以简单理解为:.c文件负责“怎么做”,.h文件负责“告诉别人有什么可以用”。
例如,一个项目中可能有:

main.c
add.c
add.h

其中,add.c负责实现加法函数,add.h负责声明这个函数,main.c则通过包含头文件来使用它。这样做可以让代码更加清晰,也方便多人协作和模块化开发。

6. 第一个C语言程序

#include<stdio.h>
int main() {
	printf("This is a C program\n");
	return 0;
}

这段代码虽短,但包含了C语言入门阶段最重要的几个概念。
#include <stdio.h> 表示引入标准输入输出头文件。printf 函数的声明就位于这个头文件中。

int main() 是程序入口。C 程序运行时,会从main函数开始执行。一个C语言程序是由一个或多个函数组成的,其中必须包含一个main函数(有且只能有一个main函数)。

程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何(main函数可以放在程序最前头,也可以放在程序最后,或在一些函数之前、另一些函数之后)。

printf("This is a C program\n");用于向屏幕输出内容。其中 \n 表示换行。
return 0; 表示main函数正常结束,并向运行环境返回整数值 0。

7. printf与标准库函数

printf是C标准库中非常常用的输出函数,用于格式化输出内容。
C语言标准库函数就是C语言官方标准规定好、系统提前写好、封装好的现成通用函数,程序员直接调用,不用自己写实现代码。

#include<stdio.h>
int main() {
	int age = 20;
	char grade = 'A';
	double score = 95.5;
	printf("age=%d\n", age);
	printf("grade=%c\n", grade);
	printf("score=%lf\n", score);
	return 0;
}

在这里插入图片描述

这里的 %d%c%lf 是格式说明符。它们不是普通字符,而是告诉 printf:后面的数据应该按照什么格式输出。

8. C语言中的关键字

关键字是C语言保留给语法使用的特殊单词。这些单词具有固定含义,不能被程序员拿来作为变量名、函数名或其他标识符。
C语言中的32个关键字如下:

autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile

define不是关键字,是编译器实现的,用来定义宏的预处理指令,不是C语言中的内容。

9. 字符与ASCII编码

在C语言中,单个字符通常使用单引号表示。计算机内部只能处理二进制数据,所以字符也需要数字编码表示。ASCII编码就是早期广泛使用的一套字符编码标准。字符本质上也可以看作一种整数编码。

int main() {
	printf("%c\n", 'Q');
	printf("%c\n", 65);
	return 0;
}

在这里插入图片描述

int main() {
	int i = 0;
	for (i = 32; i <= 127; i++) {
		printf("%c ", i);
		if (i % 15 == 0) {
			printf("\n");
		}
	}
}

在这里插入图片描述

10. 字符串与\0:C语言里最容易忽略的细节

在C语言中,字符串使用双引号表示。
字符串看起来是一串字符,但在C语言内部,它通常以字符数组形式存储,并且在末尾自动添加一个字符:\0

int main() {
	char c1[] = { 'a','b','c' };
	char c2[] = "abc";
	printf("%s\n", c1);
	printf("%s\n", c2);
	printf("%d\n", strlen(c1));
	printf("%d\n", strlen(c2));
	return 0;
}

在这里插入图片描述

char arr[] = "abc";

它在内存中实际存储的是:

'a'  'b'  'c'  '\0'

\0 被称为字符串结束标志,也叫空字符。很多字符串处理函数遇到 \0 时就会停止。例如,printf 使用 %s 输出字符串时,会从字符串起始位置一直输出,直到遇到 \0 为止。
strlen计算的是\0之前的字符个数。

11. 转义字符:让普通字符表达特殊含义

转义字符是由反斜杠\开头的特殊字符序列,用于表示换行、单引号等具有特殊控制意义的字符。
\?:在书写连续多个问号时使用,防止它们被解析成三字母词,在新的编译器上没法验证了。
\a:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。
\\: 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\b:退格键,光标回退一个字符,但不删除字符。
\r:回车符,光标移到同一行的开头。
\ddd: ddd表示1~3个八进制的数字。
\xdd: dd表示2个十六进制的数字。

int main() {
	printf("%c\n", '\'');
	printf("%s\n", "\"");
	printf("c:\\test\\code\\test.c\n");
	printf("%c\n", '\130');
	printf("%c\n", '\x30');
	return 0;
}

在这里插入图片描述

12. C语言中的语句分类

C语言程序由一条条语句组成。语句可以理解为程序执行的基本单位。常见语句包含以下几类:

  1. 空语句。一个分号就是一条语句,是空语句。
  2. 表达式语句。表达式语句就是在表达式的后边加上分号。
  3. 函数调用语句。
  4. 复合语句。由一对大括号包围的代码块。
  5. 控制语句。控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
    条件判断语句也叫分支语句if语句、switch语句;
    循环执行语句do while语句、while语句、for语句;
    转向语句break语句、goto语句、continue语句、return语句。

13. 注释:写给别人看的代码说明

注释是对代码的解释说明,编译器会忽略注释内容。换句话说,注释不会改变程序运行结果,但会影响代码的可读性和可维护性。

C语言中常见注释有两种。

第一种是多行注释:

/*
这是一个多行注释
可以写多行内容
*/

第二种是单行注释:

// 这是一个单行注释

单行注释从 // 开始,到当前行结束为止。多行注释从 /* 开始,到 */ 结束。需要注意,多行注释不能随意嵌套,否则容易导致注释范围判断错误

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐