← 目录 / C++ 编程语法
从第一行代码出发,认识 C++ 程序的骨架结构,理解每一行代码的含义,以及代码从源文件到可执行程序的完整旅程。
1.1
在正式开始写代码之前,先来认识 C++ 程序的基本结构。就像写文章需要有开头、正文、结尾,C++ 程序也有它固定的骨架。
下面是我们的第一个 C++ 程序——它会在屏幕上输出 Hello, World!。
| 1 | #include<iostream> // ① 引入头文件(工具箱) |
| 2 | using namespace std; // ② 使用标准命名空间 |
| 3 | |
| 4 | int main() // ③ 主函数:程序从这里开始 |
| 5 | { |
| 6 | cout << "Hello, World!"; // ④ 输出文字 |
| 7 | return 0; // ⑤ 程序正常结束 |
| 8 | } |
#include <bits/stdc++.h> 代替所有标准头文件。它只在 GCC 编译器下有效(大多数 OJ 平台支持),但不是 C++ 标准的一部分,工程项目中不建议使用。另外,它会增加编译时间,在部分严格限制编译时间的竞赛中需要留意。1.2
上面的程序每一行都有特定的含义,我们来逐行理解:
| 代码 | 含义说明 |
|---|---|
| #include<iostream> | 加载输入输出流头文件,让程序能使用 cout / cin 等功能 |
| using namespace std; | 声明使用标准命名空间,这样就不用每次都写 std:: 前缀了 |
| int main() | 主函数,是程序的入口。程序运行时,会从 main() 开始执行 |
| { } | 花括号包裹函数体(要执行的代码块) |
| cout << "..." | 向屏幕输出内容,<< 是插入运算符 |
| return 0; | 结束主函数,0 代表程序正常退出 |
; 结尾,忘记分号是初学者最常见的错误!1.3
注释是写给人看的说明文字,程序运行时会被自动忽略。C++ 支持两种注释方式:
//从 // 开始,直到该行末尾,整行都是注释。
/* ... */用 /* 和 */ 包裹,可以跨越多行,适合写较长的说明。
| 1 | // 这是单行注释,从 // 开始,到行尾结束 |
| 2 | |
| 3 | /* |
| 4 | 这是多行注释 |
| 5 | 可以跨越多行 |
| 6 | 适合写较长的说明 |
| 7 | */ |
| 8 | |
| 9 | int main() |
| 10 | { |
| 11 | // 单行注释:输出问候语 |
| 12 | cout << "Hello!"; // 也可以写在语句后面 |
| 13 | return 0; |
| 14 | } |
1.4
编写完成一个 C++ 程序后,想要运行起来,必须经过四个步骤:预处理→编译→汇编→链接。每个步骤都会生成对应的文件。
| 1 | #include <iostream> |
| 2 | #define PI 3.14 |
| 3 | |
| 4 | int main() |
| 5 | { |
| 6 | // 打印圆周率 |
| 7 | std::cout << PI << std::endl; |
| 8 | return 0; |
| 9 | } |
#include <iostream> 替换成 iostream 头文件的全部内容;把代码中所有 PI 替换成 3.14;删掉所有注释。最终输出一个没有任何宏、没有任何注释的纯净 C++ 文本文件。
.s 文件)——就像把中文翻译成更接近机器的"暗语"。
.o 或 .obj)。此时文件已经是二进制了,人类看不懂,但 CPU 也还不能直接运行,因为还有很多函数地址没有确定。
std::cout,但 cout 的实现代码在标准库的目标文件里,不在你的文件里。链接器把你的 .o、标准库的 .o、其他用到的库全部拼合在一起,把所有函数调用的"空白地址"都填上正确地址,最终生成可以直接运行的可执行文件(Windows 下通常是 .exe,Linux 下通常无后缀名)。