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::cin
和 std::cout
来进行标准输入输出。但在使用他们之前,我们要包含输入输出流库 <iostream>
。在 C++ 中有很多库(或者称为头文件),不同的库中包含了不同的功能。这里提到的 <iostream>
库包含了输入输出的功能,我们在后面学习中会学更多的功能,遇到不同的头文件。
C++ 中,我们一定要有一个 main
函数。我们要在 main
函数中编写程序中的核心的内容。
让我们尝试一下输出 Hello, World
吧!
请注意,在 C++ 代码中,每一句的结尾一定要有 ;
。如果你的句末没有 ;
,就会被提示编译错误(CE)。
在上面这份代码中,我们对于输出的内容要使用 <<
重载运算符插入到输出流中。std::endl
是用于输出换行并刷新缓冲区。你可以先不必了解这些概念性的东西,也许我们在后面会讲到,也许随着你写得代码越来越多你也会会逐渐理解。
如果你想输出 Hello, World!
这样的文字,就必须要用两个 "
将其包裹起来。
在 main
函数的结尾,我们通常会加上 return 0;
来返回整数类型的 0
,代表着程序运行结束。
在代码中,我们可以使用 std
命名空间,这样你就可以直接使用 cout
、endl
,而在前面无需加上 std
前缀。这样可以让代码更加简洁易读。
如果要使用 std
命名空间,你只需要在代码中添加 using namespace std;
即可,完整代码如下:
1.2 输入与变量
在 C++ 中,我们可以使用 std::cin
来做标准输入,其中输入的内容要用输入操作符 >>
连接。我们仍要引入 <iostream>
库。
在算法竞赛中,输入的内容通常是需要被保存的,这时候就需要 变量。
变量的类型有很多种,常见的如 int
、long long
、double
、char
等等,我们后续都会讲到。这里我们以 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 += 1
,a = a - b
可以简化为 a -= b
。这些简单的写法很实用,请读者们自己探索。