C++ 基本结构

观察下面一段代码:

#include <iostream>
using namespace std;
int main() {
    cout << "Hello world!";
    return 0;
}

此时运行这一段代码,即可看到控制台上的输出内容。

Hello world!

这个程序的目的很简单,就是在屏幕上显示(C++ 中我们称之为输出)一句话: Hello world!。当你成功输出这段文字,意味着你打开了编程世界的大门,你成功向这个新世界打了个招呼!

下面来逐句分解这个程序。

头文件

  • #include <iostream> 是头文件,用于引入外部库
  • 举个例子,想要烹饪一道菜,除了食材之外还需要一些其他工具,如锅和铲子。
  • 在英语中,input 代表输入,output 代表输出,stream 代表——C++ 的一种操作方式。取 input 和 output 的首字母,和 stream 拼起来,这个程序使用的 iostream 头文件是一个可以用来输入输出的“工具”。
  • 之后会接触更多的头文件,甚至可以自行编写头文件,也就是造一个工具。

命名空间

  • using namespace std; 是命名空间声明语句。
  • 暂时不用理解它的用途,并且你在相当长的一段时间内也不需要理解它,只需要记住在头文件之后加上这句话即可。

主函数

  • int main() 是主函数,这样带小括号的语句被称为函数
  • 可以看到主函数后面有一对大括号 { },将主函数中的语句给包围起来了。计算机运行程序的时候,会从 int main() 后面的大括号开始运行,依次执行大括号中的语句直到结束。
  • 举个例子,仍旧是想要烹饪一道菜,那么“炒菜”这个动作就是主函数。炒菜这个主函数里还包含别的步骤,例如“洗菜”“切菜” “下锅翻炒”“调味”“起锅装盘”就是这个主函数里面的语句。

输出

  • cout << "Hello world!"; 是输出语句,该语句可以让计算机输出一句话(注意是两个英文的小于号,而不是中文的左书名号)。
  • 我们将在下面的「输入与输出」部分详细讲解。

返回值

  • return 0; 的意思是,主函数在结束时需要告诉系统一个数字 $0$,这样「告诉」的操作在 C++ 中被称为返回,返回的东西被称为返回值
  • 当主函数的返回值为 $0$ 时,这说明程序正常运行结束。
  • 在主函数中即使不写这一句话,编译器也会在编译时自动加上这句话。
  • 值得注意注意,千万不要返回一个其他的非 $0$ 值,这会造成系统认为这个程序异常退出。在算法竞赛中,这会导致被认为运行时错误。
  • 暂时不用理解它的用途,但是并且你在相当长的一段时间内也不需要理解它,只需要记住在主函数末尾加上这句话即可。

变量

很显然,C++ 能够完成的任务远不止计算一些东西这么简单,有的问题是需要进行很多计算才能解决的。因此,我们需要有一个办法能够储存计算的中间结果。这时,可以使用变量来满足这个要求。

这时变量的用途也就显而易见了:存储信息。

观察下面一段代码:

#include <iostream>
using namespace std;
int main() {
    int a = 1, b;
    b = 2;
    int c = a + b;
    cout << c;
    return 0;
}

不难想出,这个程序的运行结果应该如下:

3

变量的定义

  • 注意到,在代码的第 4 行,出现了一个我们从来没有见过的语句:int a = 1, b;
  • 可以想到,英语中有一个 integer 的单词,意为「整数」。事实上,这里的 int 就取了前三个字母,表示这是一个整数变量,这个 int 被称为数据类型
  • $a$ 和 $b$ 是两个不同的变量名,因此可以发现,多个变量之间可以使用逗号隔开。此时,我们就已经创建了名为 $a$ 和 $b$ 的两个整数变量,这个创建变量的过程被称为定义
  • 但是还有一个 a = 1 的部分没有解决。变量是用来存储信息的,但我们使用定义变量 $a$ 的时候还并没有让它存储什么东西。这里的等于号与数学上的等于不完全相同,它的意义是赋值,也就是让等于号前面的变量存储等于号后面的东西。此时,变量 $a$ 已经存储了整数 $1$。
  • 然而变量 $b$ 还没有存储任何信息。注意到代码第 $5$ 行,出现了单独的 b = 2; 的语句。没错,赋值操作不一定要在定义变量的时候可以进行。事实上,赋值可以在代码的任何地方进行。

上面只讲了整数,C++ 可以存储其他信息吗?答案是肯定的。下面给出了另外一些你目前可能用到的数据类型。

double a = 1.14514;  // 实数,可以为小数或整数(我们把这样的数据类型称为浮点数)
char b = 'a';        // 字符,存储的信息使用单引号
string c = "abcd";   // 字符串,顾名思义,存储一串字符,使用双引号

请牢记上述四种数据类型的使用方式及用途,我们将在接下来经常用到。

数学运算

  • 类比数学,C++ 也可以进行数学运算。
  • 加号 + 和减号 - 在键盘上可以直接打出来,因此 C++ 的加号也是 +,减号也是 -
  • 由于我们无法在键盘上打出数学上的乘除号,因此我们引入新的符号。在 C++ 中,乘号写作 *,除号写作 /(请注意斜杠的方向)。

观察下面一段代码(如果无法理解输出部分,请先阅读下面的「输入与输出」部分):

#include <iostream>
using namespace std;
int main() {
    int a = 1, b = 2, c = 3;
    cout << a + b << ' ' << a - b << ' ' << b * c << ' ' << c / b;
    return 0;
}

运行程序,得到了下面的运行结果:

3 -1 6 1

可以发现,前面三个都是我们想要的结果,但是对于第四个结果,为什么 $c \div b = 1$ 呢?

整除运算

还记得我们上面说的,int 代表的是整数类型。C++ 其实是一个很傻的东西,它不知道两个整数相除为什么会得到一个浮点数,它只知道 $3$ 里边有 $1$ 个 $2$,所以 c / b 这个表达式的结果是 $1$。

这就是 C++ 在进行整数除法时进行的取整方式:向 $0$ 取整。为什么不是向下取整呢?通过实践可以得到,当结果为负数时,它又变成了向上取整。具体的原理我们现在无需理解,只需要记住整除会向 $0$ 取整即可。

问题又来了,如果我想得到一个浮点数的结果应该怎么做呢?很简单,既然 C++ 不会两个整数相除得到浮点数,那我们让其中一个整数以浮点数的形式出现不就好了吗?观察下面这段代码:

#include <iostream>
using namespace std;
int main() {
    int b = 2;
    double c = 3;
    cout << c / b;
    return 0;
}

得到了以下结果:

1.5

这与我们的预期相符。当然,$b$ 为 double $c$ 为 int ,或 $b$、$c$ 都为 double 时同理。

取模运算

不难想到,进行整除运算以后,很多时候都会剩下余数。当我们想要求这个余数的时候怎么办呢?

一个一个减似乎有点太慢了,这个时候我们引入一个新的运算:取模,它的符号是 %,在数学上写作 $\mod{}$,原本在除法式子里的除数,在取模运算里被称为模数

观察下面这段代码:

#include <iostream>
using namespace std;
int main() {
    int a = 10, b = 3;
    cout << a % b;
    return 0;
}

得到以下结果:

1

这与我们的预期相符。值得注意的是,由于涉及分数的除法没有余数的相关概念,因此取模运算也只能由整数参与运算。

运算优先级

  • C++ 中的运算优先级与数学上相似:先算乘 *、除 / 和取模 %,再算加 +-
  • 如果需要先计算某一部分,我们可以在需要先算的这一部分两端加上小括号 ( )。如下面这一段程序:
#include <iostream>
using namespace std;
int main() {
    int a = 3, b = 4, c = 5;
    cout << (a + b) % a * c + b;
    return 0;
}

得到了以下的结果:

9

在这里,被小括号括起来的 $a+b$ 先进行了运算,然后再对 $a + b$ 进行后面的取模和乘法运算,最后再加上 $b$,得到结果 $9$。


输入与输出

输入

  • 因为我们正在学习的语言叫做 C++,输入的英文为 input,因此,C++ 中的输入语句是 cin(当然 cin 的实际含义并不是这样,但你可以在很长一段时间内都这么理解,方便记忆)。
  • 假如这里有一个变量 $a$,那么我们可以使用 cin >> a; 进行输入,也就是把外部的东西存储到变量 $a$ 中。
  • 这里的 >> 被称作输入流运算符,不过名字不重要,我们可以把它当作一个箭头理解。当输入的时候,信息从外部存储到变量内部,因此这个箭头指向变量。
  • 当然,cin 是忽略空格和换行的,这也就意味着我们可以连续使用 cin。假如这里有 $3$ 个变量 $a$,$b$ 和 $c$,我们就可以使用 cin >> a >> b >> c; 一次性读入这三个变量。

输出

  • 类比输入,C++ 的输出语句是 cout
  • 对于我们上面提到的所有数据类型,我们都可以使用 cout 进行输出。cout 后面既可以跟一个实际的值,也可以跟一个变量。
  • 假如这里有一个变量 $a$,那么我们可以使用 cout << a; 进行输入,也就是把变量 $a$ 中的信息输出出来。
  • 这里的 << 被称作输出流运算符。当输出的时候,要把变量中的信息传递到外部,所以这个箭头从变量发出,指向 cout,也就是外部。
  • 从这里我们可以发现,被称作流运算符的「箭头」,总是指向信息传递的方向。
  • cin 相同,我们也可以连续使用 cout。假如这里有 $3$ 个变量 $a$,$b$ 和 $c$,我们就可以使用 cin >> a >> b >> c; 一次性读入这三个变量。
  • 我们可以使用 endl 输出换行,用法将在下面的代码中给出。

有了输入,我们就可以进行交互式操作了,也就是对每次给出的数据进行运算,而不是针对一个程序里定死的值进行结果不变的运算。

观察下面一段代码:

#include <iostream>
using namespace std;
int main() {
    int r;
    cin >> r;
    cout << 3.14 * r * r << endl;
    return 0;
}

我们输入了一个整数变量 $r$,并且输出了 $3.14 \times r \times r$。发现这是一个输入半径,求圆的近似面积的问题。由于输入会有变化,所以对于不同的输入,输出也会有变化。


至此,你已经学会了信息学竞赛中最为基础也最为重要的内容,这将是我们接下来学习一切知识点的基础,请务必熟练掌握。

最后修改:2024 年 02 月 02 日
如果觉得我的文章对你有用,请随意赞赏