跳转至

C++ 基础语法 - 1 前言、OJ、编辑器、输入输出与 int 类型变量

前言

你好,我是 Hatmic!

我在 14 岁的时候开始编写这套适合零基础学习者的 C++ 的教程,记录我的所学。并通过教程的方式将知识分享给其他人。

本套教程将讲解 C++ 的基础语法,希望我的读者们能有所收获!

练习

在国际上,有很多 OJ(Online Judge)可供选择。其中最常见的是美国的 Codeforces 和日本的 ATCoder,在这两个平台中,有丰富的题目可供练习,定期也有比赛。对于我们初学者,ATCoder 的 ABC 比赛是很适合的。关于这两个网站我不多赘述,在网络上有很多说明。

编辑器

C++ 的编辑器多种多样,其中,对于 Windows 用户,我们推荐 Dev-C++ 作为新手编写 C++ 代码的工具;对于 Mac 用户,我们推荐 Xcode。关于安装及使用这些编辑器(IDE),网上有很多的教程,请读者自行搜索。

其中,对于 Dev-C++,我推荐由 Embarcadero 公司维护的新版本,是支持 C++ 98 及更高版本的。

1.1 输出

在 C++ 中,可以使用 std::cinstd::cout 来进行标准输入输出。但在使用他们之前,我们要包含输入输出流库 <iostream> 。在 C++ 中有很多库(或者称为头文件),不同的库中包含了不同的功能。这里提到的 <iostream> 库包含了输入输出的功能,我们在后面学习中会学更多的功能,遇到不同的头文件。

C++ 中,我们一定要有一个 main 函数。我们要在 main 函数中编写程序中的核心的内容。

让我们尝试一下输出 Hello, World 吧!

#include <iostream>

int main () {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

请注意,在 C++ 代码中,每一句的结尾一定要有 ;。如果你的句末没有 ;,就会被提示编译错误(CE)。

在上面这份代码中,我们对于输出的内容要使用 << 重载运算符插入到输出流中。std::endl 是用于输出换行并刷新缓冲区。你可以先不必了解这些概念性的东西,也许我们在后面会讲到,也许随着你写得代码越来越多你也会会逐渐理解。

如果你想输出 Hello, World! 这样的文字,就必须要用两个 " 将其包裹起来。

main 函数的结尾,我们通常会加上 return 0; 来返回整数类型的 0,代表着程序运行结束。

在代码中,我们可以使用 std 命名空间,这样你就可以直接使用 coutendl,而在前面无需加上 std 前缀。这样可以让代码更加简洁易读。

如果要使用 std 命名空间,你只需要在代码中添加 using namespace std; 即可,完整代码如下:

#include <iostream>

using namespace std;

int main() {
    cout << "Hello, World!" << endl;
    return 0;
}

1.2 输入与变量

在 C++ 中,我们可以使用 std::cin 来做标准输入,其中输入的内容要用输入操作符 >> 连接。我们仍要引入 <iostream> 库。

在算法竞赛中,输入的内容通常是需要被保存的,这时候就需要 变量

变量的类型有很多种,常见的如 intlong longdoublechar 等等,我们后续都会讲到。这里我们以 int 类型变量举例。

int 类型变量是 C++ 中表示整数类型的数据类型之一。它通常占用 4 个字节(32 位),能保存的整数的范围约在 $-2,147,483,648$ 到 $2,147,483,648$,也就是 $-2^{31}-1$ 到 $2^{31}-1$ 这个范围。

声明一个 int 类型的变量可以使用语法 int myInt;,这将在内存中分配存储整数值的空间。其中 myInt 是变量名,你可以把他改成任何合法的变量名(关于合法,你可以理解成和你现有的变量名、函数名以及标准模板库中的功能名字不冲突的)。你可以把变量想成一个盒子,每个盒子存储一个内容,也占用一些空间。

接下来是一个例子:

#include <iostream>

using namespace std;

int main () {
    int a; // 定义整数类型变量 a 
    cin >> a; // 输入 a 变量(应该是一个整数) 
    cout << a << endl; // 输出 a 变量并换行 
    return 0;
}

在这个例子中,我们定义了一个 int 类型变量 $a$,并且输入一个整数 $a$。当我们输入一个符合条件的整数时,比如 10,你会发现程序输出了一个 10

请注意:在 C++ 中,对于任何变量的定义一定是要先声明的。如果没有声明就会产生编译错误。

1.3 变量的赋值与运算

当你输出一个没有被处理过的变量时,你会发现这个变量是一个奇怪的数字。这是因为如果你没有为变量赋值,那么这块内存中原本可能包含着其他数据留下的残留内容,或者是操作系统随机分配的数值。

对于变量的赋值,我们前面提到过可以通过输入的方式为变量赋值。不过如果你不想通过输入的方式,那我们有别的办法。

我们可以可以通过赋值操作符 = 对 int 变量进行赋值,比如 int myInt = 10;

当我们这样做了之后,int 类型变量 myInt 就存了 10 这个数字。试试看吧!

#include <iostream>

using namespace std;

int main () {
    int a; // 定义整数类型变量 a 
    cin >> a; // 输入 a 变量(应该是一个整数) 
    int b = 10; // 定义整数类型变量 b,并将其赋值为 10 
    cout << a << " " << b << endl; // 输出两行,分别是变量 a, b
    return 0;
}

除了赋值操作以外,int 类型变量还可以进行一些数学运算。包括加、减、乘、除等。除了这些基本的数学运算,还有位运算、异或运算等。这两种运算可以先有所了解,后面会提到的。

每一种运算都对应着运算符,请看下表:

取模
+ - * / %

取模运算其实是在求两个数相除后得到的余数,书写上常用 mod 表示。比如 $10 \mod 3 = 1$,即 $10$ 除以 $3$ 得到的余数。当 $a \mod b = 0$ 的时候,则说明 $a$ 是 $b$ 的倍数。

运算的优先级和数学上运算的优先级是一样的。你也可以用小括号 () 来确定运算的优先级,和数学一样,小括号的运算优先级是最大的。但没有中括号、大括号,这些都可以用小括号来代替。

例如 int b = a + 1; 表示将变量 a 加上 1 的值存在变量 b 中。

此外,变量还可以进行自增、自减等操作。你可以理解成:将 n 变量原来的值和另外一个值进行运算,运算后的结果存储在变量 n 中。

接下来一个简单的示例,可以帮助你更好地了解变量的赋值与运算:

#include <iostream>

using namespace std;

int main () {
    int m = 10; // 为变量 m 赋值为 10 
    cout << m << endl; // 输出 m 的值 10
    int n = m; // 将变量 n 赋值为 m,则 n 的值为 10 
    cout << n << endl; //  输出 n 的值为 10 
    n = n + 1; // n 存储的值为 10 + 1 = 11
    cout << n << endl;
    n = n - 2; // n 存储的值为 11 - 2 = 9
    cout << n << endl;
    n = n / 3; // n 存储的值为 9 / 3 = 3 
    cout << n << endl;
    n = n * 0; // n 存储的值为 3 * 0 = 0 
    cout << n << endl;
    return 0;
}

将一个新的值存到变量中一定要用赋值操作(或者通过输入的方式),如果没有赋值操作,那如 n + 1 这样的单独的语句是没有任何意义的。

此外,还有一些简单的写法,如 n = n + 1 可以简化为 n += 1a = a - b 可以简化为 a -= b。这些简单的写法很实用,请读者们自己探索。