---
title: "初识 C++"
description: "从环境准备到 STL，系统学习 C++ 编程的基础知识。"
---

> Documentation Index
> Fetch the complete documentation index at: https://cppguide.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# 初识 C++

![](https://img.dailyup.xyz/originals/8208463152509-1d698d81-e079-41b5-aed5-5011929680ff.png)

## Hello World

关于 C++ 的编程环境我们已经准备好了，接下来让我们正式开始 C++ 的学习。

同样地，我们还是以最简单的 Hello World 程序为例，来和 C++ 打个招呼，并借此了解一个 C++ 程序的基本结构。

```cpp
#include <iostream>
using namespace std;

int main() {
  // 在屏幕中输出文字 Hello World! 
  cout << "Hello, World!" << endl;
  return 0;
}
```

> 这段程序是 C++ 的基本骨架，我们后面学习的几乎每一段程序都是以这个骨架为基础的。刚开始学习时，要在理解的基础上记住它，并且要写得熟练。

运行该程序，在屏幕中的输出区域可以看到正常输出的文字 "Hello World!" ，恭喜你，你的第一个 C++ 程序已经正常运行起来了。

```
Hello World!
```

麻雀虽小，五脏俱全，这段程序虽然简单，但即包含了 C++ 程序的几个关键元素：头文件、命名空间、主函数、基本的输入输出操作等。

下面我们逐行来分析一下这个最简单的 C++ 程序。

> 学习过 Python 的同学会发现，实现同样的功能，Python 只需要一句代码，要简单很多，C++ 程序的指令代码看起来还是比较复杂的。但越到后面，大家会发现，要解决同样的问题，实现同样的算法，Python 代码与 C++ 代码差异其实并不大。

### 头文件引入

```cpp
#include <iostream>
```

这段指令比较特殊，主要是用来引入需要的头文件。

`iostream` 是 input output stream 的缩写，它是 C++ 中专门用于数据输入与输出的标准头文件，属于 C++ 标准函数库的一部分。

通过 `#include` 将输入输出的标准头文件引入进来，就让程序拥有标准的输入输出功能了。

除了 `iostream` 外，后面我们还会陆续见到不同用途的头文件。

> 在 [竞赛相关技巧](./competitive)  章节中，特别提到了一些常见的头文件以及万能头文件的使用   。

### 标准命名空间

```cpp
using namespace std;
```

第二句代码是告诉 C++ 编译器，我们希望使用 `std` 标准命名空间。那么，**命名空间（namespace）**究竟是什么呢？

举个例子，如果学校开大会，校长点名表扬一个叫「李明」的同学，但问题是，三年级七班和五年级二班都有一个叫李明的同学，到底校长表扬的是哪个班的李明呢？

针对这种情况，有两种方法解决：

- 一种方法是校长每次在说到李明的时候，都明确指出是哪个班的李明，比如说：三年级七班的李明同学，在这次编程竞赛中表现很不错，进步很大，大家要向他学习。这样说的话就没有任何歧义了。
- 另一种方法是校长在大会前提前说明，接下我的讲话中说到的李明，都是指的三年级七班的李明，有了这个事先说明，接下来的讲话中提到李明时，就不用说是哪个班的，大家都知道，实际上说的是三年级七班的李明。

命名空间（namespace）也是同样的作用，这里的 `std` （standard 的缩写）是告诉编译器，我们希望使用标准库中的代码指令。

如果没有 `using namespace std` 这一句，我们在程序中每次使用来自标准库的指令时，都需要在前面加上前缀 `std::`，像下面这样：

```cpp
std::cout << "Hello, World!" << std::endl;
```

### main 主函数

```cpp
int main() {
  // 程序的主体部分
}
```

这部分被称为 **main 主函数，又称入口函数**。尽管我们还没有学到函数的概念，但你只需要知道，**所有 C++ 程序的执行，都是从主函数开始的**。

这里的 `int` 表示这个主函数执行后的返回值类型，要求返回一个整数类型的值（int 是整数的英文 integer 的缩写），这与主函数中最后一句指令相对应：

```cpp
return 0;
```

这句代码告诉编译译，当程序执行到这里时，程序就正常结束了。

一定不要漏掉这一行（尽管在有些编译环境中不写这句代码也能正常运行通过，但不推荐这样做）。也不能去返回其它的数字，0 之外的数字代表出现异常而导致程序终止的，不同的数字与导致程序终止的具体原因有关。

对于下面这段程序，大家猜猜运行的结果是什么呢？

```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int a = 5, b = 3;

  cout << a + b << endl;
  return 0;
  cout << a * b << endl;
  
  return 0;
}
```

看着有点奇怪，一个程序里竟然有两个 `return 0`，如果执行程序，结果输出

```
8
```

这里因为，程序代码从上往下执行，当遇到第一个 `return 0` 时，就告诉 C++ 编译器，这个程序在这里正常结束了，后面的代码也就都不会执行了，因此只输出了 `a + b` 的结果。

### 控制台输出

再来看下面这一段代码。

```cpp
cout << "Hello, World!" << endl;
```

这段代码是向屏幕输出文字 "Hello, World!" 。

`<<` 是输出插入符，将数据插入到输出流（stream），数据流向哪里，箭头就指向哪里。这里箭头是指向 `cout` ，`cout` 是指标准输出设备，默认指的是电脑屏幕（也就是显示结果的控制台）。注意这里的两个 `<` 符号之间是不能添加空格。

既然是流，`<<` 是可以插入多个数据的，比如说下面的代码是可以的。

```cpp
cout << "Hello, " << "C++!" << endl;
cout << "结果是:" << 3 + 5 << endl;
```

`endl`，是 end line 的简称，表示换行。

### 注释说明

注释说明并不属于程序功能逻辑的部分，主要是给阅读程序的人看的，起解释说明的作用。

在 C++ 中，有两种添加注释的方式：

1. `//` ，这是单行注释
2. `/*` 和 `*/`，这是区块（多行）注释

下面这段程序展示了这两种注释方式。

```cpp
/*
* 文件名：hello.cpp
* 你的第一个 C++ 程序
*/
#include <iostream>
using namespace std;

int main() {
  // 在屏幕中输出文字 Hello World! 
  cout << "Hello, World!" << endl;
  return 0; // 代表程序到这里正常结束
}
```

### 初学者常见错误

学习 C++ 编程的新手，经常会遇到以下几种错误：

- **漏掉程序语句末尾的分号**：尤其是从 Python 转过来的同学，一定要特别注意这一点。需要注意的是，`#include` 头文件这句是不需要加分号的。
- **误用中文符号**：程序中的分号、括号、双引号等都应该使用英文符号，如果使用了中文符号，程序会报错。
- **不注意大小写字母**：在 C++ 中，`main` 与 `Main` 是两个完全不同的标识符，不能混用。

## 算术运算

接下来，将上面的 "Hello World!" 替换成运算表达式，可以立即把 C++ 当成一个高级计算器来使用。

例如下面的代码：

```cpp
cout << (3 + 5) * 2 - (13 - 3) / 5 << endl; // 输出结果为 14
```

在 C++ 中四则混合运算的原则与我们在数学中的用法是完全一致的。**先乘除、后加减，遇到小括号，先进行小括号内的运算**。

下表列出了常见运算符号在数学中和编程中的表示形式。

| 符号作用 | 数学运算符号 | 编程运算符号 |
| -------- | ------------ | ------------ |
| 加       | +            | +            |
| 减       | -            | -            |
| 乘       | ×            | *            |
| 除       | ÷            | /            |
| 取余     | 无           | %            |

注意，**C++ 中表示乘除的符号与数学中的符号是不同的**，主要原因是在键盘上没有直接对应的 × 和 ÷ 这样的数学符号键位。实际上，在绝大部分编程语言中，都是用 `*` 来表示乘法运算，用 `/` 表示除法运算。

下面的代码展示了 C++ 中常见的几种算术运算。

```cpp
#include <iostream>
using namespace std;

int main() {
  cout << 5 + 2 << endl; // 求和
  cout << 5 - 2 << endl; // 求差
  cout << 5 * 2 << endl; // 求积
  cout << 5 / 2 << endl; // 求商
  cout << 5 % 2 << endl; // 求余
  
  return 0;
}
```

运行该程序，输出结果为：

```
7
3
10
2
1
```

和、差、积的结果很好理解，求余也比较好理解，5 除以 2，商为 2， 余数为 1，因此输出 1 。

**但求商的结果为什么是 2 呢，不应该是 2.5 吗？**

实际上，在 C++ 中，每个数值都是有类型的，这里的 5 和 2 在 C++ 中**默认是当成整数来运算的，并且，当参加运算的两个数都是整数时，其运算结果也是保留为整数**，5 除以 2，结果应该是 2.5，但结果要强制保留为整数，因此小数点后面的部分被强制去掉了，最终得到的结果是 2 。

我们也可以像下面这样简单改动一下，参与运算的其中一个数改为浮点数，结果就正确了。

```cpp
cout << 5.0 / 2 << endl; // 结果保留为小数
```

> 注意，`5.0 % 2` 这样用法属于类型转换的一种，关于类型转换的原则及用法在后面我们还会专门讲到，这里知道这一种用法就行了

这里说的是 C++ 中的隐式转换行为，实际上，在 C++ 中，数字 5 默认是当做整数类型来处理，而数字 5.0 默认当做是浮点数类型（现在可以简单地把浮点数理解为小数）来处理。

### 算术运算优先级

当我们在进行混合的算术运算时，与数学中的四则运算法则一致，**先乘除和取余，再加减，如果有小括号，先计算小括号里的运算**。

例如，如果我们有下面的数学式子

$$
\frac{1}{2} \times 100 \times (3 + 5)
$$

可以写出下面的 C++ 代码去计算：

```cpp
#include <iostream>
using namespace std;

int main() {
  cout << 100 * (3 + 5) / 2 << endl;
  return 0;
}

```
## 小结

本章节主要介绍了 C++ 程序的基本结构和简单算术运算。

对于零基础的初学者来说，C++ 程序的基本结构有个基本的了解即可，主要是多练，直到能够熟练写出来为止。学习到后面，再反过来看这个基本结构的时候，每一句是什么意思应该就会越清晰，理解也会更深刻。

Source: https://cppguide.xyz/basic/intro/index.mdx
