初识 C++

Hello World

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

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

#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++ 代码差异其实并不大。

头文件引入

#include <iostream>

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

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

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

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

竞赛相关技巧 章节中,特别提到了一些常见的头文件以及万能头文件的使用 。

标准命名空间

using namespace std;

第二句代码是告诉 C++ 编译器,我们希望使用 std 标准命名空间。那么,**命名空间(namespace)**究竟是什么呢?

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

针对这种情况,有两种方法解决:

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

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

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

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

main 主函数

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

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

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

return 0;

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

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

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

#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 的结果。

控制台输出

再来看下面这一段代码。

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

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

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

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

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

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

注释说明

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

在 C++ 中,有两种添加注释的方式:

  1. // ,这是单行注释
  2. /**/,这是区块(多行)注释

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

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

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

初学者常见错误

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

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

算术运算

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

例如下面的代码:

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

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

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

符号作用数学运算符号编程运算符号
++
--
×*
÷/
取余%

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

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

#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 。

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

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

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

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

算术运算优先级

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

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

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

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

#include <iostream>
using namespace std;

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

小结

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

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