什么是C语言

C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。

当前最新的 C 语言标准为 C18 ,在它之前的 C 语言标准有 C17、C11…C99 等。

TIOBE指数 - TIOBE 可以查看各种编程语言使用排名

编译器的选择

编译和链接

C语言是一门编译型计算机语言,C语言源代码都是文本文件,文本文件本身无法执行,必须通过编译器翻译和链接器的链接,生成二进制的可执行文件,可执行文件才能执行。

C语言的代码通常是放在以 .c 为扩展名的文件中,要得到最终运行的可执行程序,中间要经过编译链接2个过程

一个项目中可能含有多个源文件

每个 .c 源文件单独经过编译器处理生成相应的 .obj 目标文件,多个目标文件和库文件经过链接器处理生成对应的 .exe 可执行程序

编译器

常见的编译器如:msvc、clang、gcc、MinGW-w64

  • Visual Studio 集成了MSVC
  • Xcode 集成了clang(苹果电脑用的)

C语言项目

在一个C语言项目中,.c 为后缀的文件称为源文件,.h 为后缀的文件称为头文件。

简单的C语言程序结构

1
2
3
4
5
6
7
#include <stdio.h>

int main()
{
printf("Hello, World!\n");
return 0;
}

上面代码组成结构:

  • 预处理器指令:如 #include#define,在编译前由预处理器处理。

    • 头文件通常在程序的开头使用 #include 指令包含。头文件提供了函数和库的声明,如标准输入输出库 <stdio.h>、标准库 <stdlib.h> 等。它们定义了函数、宏、常量等使程序能够使用预定义的库函数。
    • 系统头文件使用尖括号 <>,自定义头文件使用双引号 "",两者的搜索路径不同。
    • 示例:#include <stdio.h>(系统头文件)、#include "myheader.h"(自定义头文件)
  • 主函数:每个 C 程序都有且只有一个 main() 函数,是程序的执行入口。

    不管有多少行代码,都是从 main 函数开始执行的, main 前面的 int 表示 main 函数执行结束的时候返回一个整型类型的值。所以在 main 函数的最后写 return 0; (0表示程序正常退出,非0不正常)

    • main 函数是程序的入口
    • main 函数有且仅有一个
    • 即使一个项目有多个 .c 文件,也只能有一个 main 函数
  • 库函数调用:库函数 printf ,实现了在屏幕上打印信息

    在使用库函数的时候需要包含头文件,比如:printf 函数就是需要包含 stdio.h 这个头文件

    库函数参考链接:cplusplus.com/reference/clibrary/

C语言中的关键字

C语言中有一批保留的名字的符号,比如:int , if , return , 这些符号被称为关键字

  • 关键字都有特殊意义
  • 创建标识符时不能和关键字重复
  • 不能自己创建关键字

常用的32个关键字:

1
2
auto break case char const continue default do double else enum extern float for goto if
int long register return short signed sizeof static struct typedef union unsigned void volatile while

C 关键词 - cppreference.com

字符和ASCII编码

键盘上可以敲出的各种字符,如,a,#,1等,这些符号都被称为字符,C语言中的字符是用单引号括起来的,如:‘a’,‘#’,‘1’。美国国家标准学会(ANSI)出台了一个标准 ASCII 编码,C语言就遵循了 ASCII 编码的方式。

ASCII 码表 - cppreference.com

字符串和\0

在C语言中使用双括号括起来的一串字符就被称为字符串,如:“abcdef”,就是一个字符串,在C语言中字符串的末尾隐藏放着一个 \0 字符,这个 \0 字符是字符串结束的标志

image-20260727143410682

当使用 strlen() 计算字符串长度的时候,遇到 \0 的时候就自动停止了。

在C语言中可以把一个字符串放在一个字符数组中,可以通过下面的代码验证一下 \0 的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
int main()
{

char arr1[] = "abcdef";
char arr2[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
//char arr2[] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0'};
char arr3[] = "abc\0def";

printf("The length of %s is %zu\n", arr1, strlen(arr1));
printf("The length of %s is %zu\n", arr2, strlen(arr2));
printf("The length of %s is %zu\n", arr3, strlen(arr3));

return 0;
}

输出结果如图

image-20260727144809473

可以看到当打印 arr2 的时候后面出现了随机值且长度不对,这就是因为在末尾没有添加 \0 字符作为结束标志,在打印的时候没有停止。arr1 的打印结果和长度是正常的,就是因为 arr1 数组是使用字符串常量初始化的,数组中自动就有 \0 作为结束标志。而 arr3 中间手动输入 \0 则提前结束打印和计数,到 \0 就停止了。

常用转义字符

  • \' :用于表示一个字符串内部的单引号

  • \" :用于表示一个字符串内部的双引号

  • \\ :用于表示一个反斜杠

  • \b :退格键,光标退回一个字符,但不删除字符

  • \n :换行符

  • \r :回车符,光标移到同一行的开头

  • \t :制表符,光标移到下一个水平制表位,通常是下一个4或8的倍数

  • \ddd :d d d表示1~3个八进制数字,如:\130 表示字符X,\0 表示 null 字符

  • \xdd :d d表示2个十六进制数字,如:\x30 表示字符0

参考链接