目录
正文
标准库
番外(施工中)
调试
未定义行为
编译器概述
前言
本教程主要使用 GCC
编译器,少数时候使用 MSVC
与 Clang
编译器。
此外,若没有特殊提及,所有符号均为半角英文符号(ASCII符号)。
符号对照
符号 | 中文名称 | ASCII编码 | 注 |
---|---|---|---|
! | 感叹号 | 0x21 | |
“ | 双引号 | 0x22 | |
# | 井号 | 0x23 | Number sign |
$ | 美元符 | 0x24 | |
% | 百分号 | 0x25 | Mod |
& | 和 | 0x26 | And |
‘ | 单引号 | 0x27 | |
( | 左括号 | 0x28 | |
) | 右括号 | 0x29 | |
* | 星号 | 0x2a | |
+ | 加号 | 0x2b | |
, | 逗号 | 0x2c | |
- | 减号 | 0x2d | |
. | 点 | 0x2e | |
/ | 正斜线 | 0x2f | 正斜杠 |
: | 冒号 | 0x3a | |
; | 分号 | 0x3b | |
< | 小于号 | 0x3c | |
= | 等于号 | 0x3d | |
> | 大于号 | 0x3e | |
? | 问号 | 0x3f | |
@ | 艾特 | 0x40 | At |
[ | 左方括号 | 0x5b | 中括号 |
\ | 反斜线 | 0x5c | 反斜杠 |
] | 右方括号 | 0x5d | 中括号 |
^ | 插入符 | 0x5e | |
_ | 下划线 | 0x5f | |
` | 重音符 | 0x60 | |
{ | 左花括号 | 0x7b | 大括号 |
| | 竖线 | 0x7c | |
} | 右花括号 | 0x7d | 大括号 |
~ | 波浪号 | 0x7e |
系统环境
OS: Windows 10 Pro for Workstation, 10.0.19045.4894(Win10 22H2 2022 Update), 64bit, English / Archlinux x86_64, Linux 6.12.10-arch1-1 / WSL2 Ubuntu Latest
Processor: Intel Core [email protected]
Memory: DDR5 5600MHz, 16Gx2
GCC-Version: 11.3, msvcrt-10.0.0-r3, std-C17, x64 / Dev-cpp 5.11, TDM-GCC 4.9.2, x64
MSVC-Version: 19.41.34123, x64, VisualStudio 2022 Community, WindowsSDK 10.0.22621.0, x64
Clang-Version: 14.0.3 / LLVM 14.0.3
在代码演示中,部分代码仅为局部代码,不包含主函数,因此无法直接执行,需拷贝进主函数才能执行。
C语言
论辈分, C
比不上 Fortran
、 BASIC
这些老古董,但是C语言是几乎所有现代语言的基石,即使已经发行53年了,仍然有自己不可替代的作用。 C
最大的特点之一是可以直接操作硬件,并且拥有可以和祖师爷 Assmebly
媲美的运行速度,适合操作系统或者嵌入式等直接和硬件打交道的场所,也可以像砖头一样构建起一个体系,比如另一门编程语言。
C
的语法简洁而直接,适合新手学习,属于下限低上限高的语言。 C
作为C语言家族的老大,是一门强类型而且静态类型的语言,变量的类型被分配后不能改变。 C
以分号分割语句,一堆花括号{}分割代码块,缩进与换行对 C
来说并没有实际意义(要是愿意一个庞大的源文件可以写在一行,不包括预处理器部分),但是但是,千万不要因此乱写缩进!
C
是编译型语言, C
的源代码由编译器编译成二进制的机器语言直接执行,不需要通过解释器。 C
的源代码一般储存在拓展名为 .c
的文件中(存在 .cpp
即 C++
源文件中也是可行的,所有 C
语法都是合法的 C++
语法,除了极少量细节)。
现行 C
都遵循 ANSI C
标准,这一标准下又有许多版本,随时间更新(如C98)。 ANSI C
只规定了大纲,在此大纲之下,各个实现了此标准的编译器对其的实现可能不尽相同,对未定义行为的处理也会不一样(例如i+++i+++i)。
C的语法结构
一个 C
程序从 int main()
或者 int main(int argc,char** argv)
函数开始执行,称为主函数,一个C程序必须包含唯一的主函数。除了 main
函数,还可以包含任意数量的其他函数,除了声明语句之外的所有语句都只能在函数体内部使用。在函数体外部,还能声明变量、函数、结构体,写预处理器。这些部分共同组成了一个程序。
由于编译器的特性, C
并不要求在使用一个变量或函数时这个函数必须声明在源代码使用函数的位置之前(但是必须声明了才能调用)。编译器会查找符号表来解决调用问题。
C
并没有明确的“包”的概念,引用外部代码通常通过头文件来实现,一切都需要你手动管理。这些外部代码可以是源代码(源文件和头文件),也可以是二进制机器码(静态链接库、动态链接库)。
预处理器
在 C
的源代码中,经常可以看到#开头的语句,这些就是预处理器(详见 预处理器 章节)。预处理器不属于 C
的一部分,有自己的语法,可以实现定义字面常量、宏函数,设置环境,引用文件,调库等操作。
写在最后
作为现代编程语言的基石, C
在编程领域有重要的作用,也是良好的编程思维第一课。当你 C
学明白了,再学其他语言就会轻松许多。