关于 C++ 的编程环境我们已经准备好了,接下来让我们正式开始 C++ 的学习。
同样地,我们还是以最简单的 Hello World 程序为例,来和 C++ 打个招呼,并借此了解一个 C++ 程序的基本结构。
这段程序是 C++ 的基本骨架,我们后面学习的几乎每一段程序都是以这个骨架为基础的。刚开始学习时,要在理解的基础上记住它,并且要写得熟练。
运行该程序,在屏幕中的输出区域可以看到正常输出的文字 "Hello World!" ,恭喜你,你的第一个 C++ 程序已经正常运行起来了。
麻雀虽小,五脏俱全,这段程序虽然简单,但即包含了 C++ 程序的几个关键元素:头文件、命名空间、主函数、基本的输入输出操作等。
下面我们逐行来分析一下这个最简单的 C++ 程序。
学习过 Python 的同学会发现,实现同样的功能,Python 只需要一句代码,要简单很多,C++ 程序的指令代码看起来还是比较复杂的。但越到后面,大家会发现,要解决同样的问题,实现同样的算法,Python 代码与 C++ 代码差异其实并不大。
这段指令比较特殊,主要是用来引入需要的头文件。
iostream
是 input output stream 的缩写,它是 C++ 中专门用于数据输入与输出的标准头文件,属于 C++ 标准函数库的一部分。
通过 #include
将输入输出的标准头文件引入进来,就让程序拥有标准的输入输出功能了。
除了 iostream
外,后面我们还会陆续见到不同用途的头文件。
在 竞赛相关技巧 章节中,特别提到了一些常见的头文件以及万能头文件的使用 。
第二句代码是告诉 C++ 编译器,我们希望使用 std
标准命名空间。那么,**命名空间(namespace)**究竟是什么呢?
举个例子,如果学校开大会,校长点名表扬一个叫「李明」的同学,但问题是,三年级七班和五年级二班都有一个叫李明的同学,到底校长表扬的是哪个班的李明呢?
针对这种情况,有两种方法解决:
命名空间(namespace)也是同样的作用,这里的 std
(standard 的缩写)是告诉编译器,我们希望使用标准库中的代码指令。
如果没有 using namespace std
这一句,我们在程序中每次使用来自标准库的指令时,都需要在前面加上前缀 std::
,像下面这样:
这部分被称为 main 主函数,又称入口函数。尽管我们还没有学到函数的概念,但你只需要知道,所有 C++ 程序的执行,都是从主函数开始的。
这里的 int
表示这个主函数执行后的返回值类型,要求返回一个整数类型的值(int 是整数的英文 integer 的缩写),这与主函数中最后一句指令相对应:
这句代码告诉编译译,当程序执行到这里时,程序就正常结束了。
一定不要漏掉这一行(尽管在有些编译环境中不写这句代码也能正常运行通过,但不推荐这样做)。也不能去返回其它的数字,0 之外的数字代表出现异常而导致程序终止的,不同的数字与导致程序终止的具体原因有关。
对于下面这段程序,大家猜猜运行的结果是什么呢?
看着有点奇怪,一个程序里竟然有两个 return 0
,如果执行程序,结果输出
这里因为,程序代码从上往下执行,当遇到第一个 return 0
时,就告诉 C++ 编译器,这个程序在这里正常结束了,后面的代码也就都不会执行了,因此只输出了 a + b
的结果。
再来看下面这一段代码。
这段代码是向屏幕输出文字 "Hello, World!" 。
<<
是输出插入符,将数据插入到输出流(stream),数据流向哪里,箭头就指向哪里。这里箭头是指向 cout
,cout
是指标准输出设备,默认指的是电脑屏幕(也就是显示结果的控制台)。注意这里的两个 <
符号之间是不能添加空格。
既然是流,<<
是可以插入多个数据的,比如说下面的代码是可以的。
endl
,是 end line 的简称,表示换行。
注释说明并不属于程序功能逻辑的部分,主要是给阅读程序的人看的,起解释说明的作用。
在 C++ 中,有两种添加注释的方式:
//
,这是单行注释/*
和 */
,这是区块(多行)注释下面这段程序展示了这两种注释方式。
学习 C++ 编程的新手,经常会遇到以下几种错误:
#include
头文件这句是不需要加分号的。main
与 Main
是两个完全不同的标识符,不能混用。接下来,将上面的 "Hello World!" 替换成运算表达式,可以立即把 C++ 当成一个高级计算器来使用。
例如下面的代码:
在 C++ 中四则混合运算的原则与我们在数学中的用法是完全一致的。先乘除、后加减,遇到小括号,先进行小括号内的运算。
下表列出了常见运算符号在数学中和编程中的表示形式。
符号作用 | 数学运算符号 | 编程运算符号 |
---|---|---|
加 | + | + |
减 | - | - |
乘 | × | * |
除 | ÷ | / |
取余 | 无 | % |
注意,C++ 中表示乘除的符号与数学中的符号是不同的,主要原因是在键盘上没有直接对应的 × 和 ÷ 这样的数学符号键位。实际上,在绝大部分编程语言中,都是用 *
来表示乘法运算,用 /
表示除法运算。
下面的代码展示了 C++ 中常见的几种算术运算。
运行该程序,输出结果为:
和、差、积的结果很好理解,求余也比较好理解,5 除以 2,商为 2, 余数为 1,因此输出 1 。
但求商的结果为什么是 2 呢,不应该是 2.5 吗?
实际上,在 C++ 中,每个数值都是有类型的,这里的 5 和 2 在 C++ 中默认是当成整数来运算的,并且,当参加运算的两个数都是整数时,其运算结果也是保留为整数,5 除以 2,结果应该是 2.5,但结果要强制保留为整数,因此小数点后面的部分被强制去掉了,最终得到的结果是 2 。
我们也可以像下面这样简单改动一下,参与运算的其中一个数改为浮点数,结果就正确了。
注意,
5.0 % 2
这样用法属于类型转换的一种,关于类型转换的原则及用法在后面我们还会专门讲到,这里知道这一种用法就行了
这里说的是 C++ 中的隐式转换行为,实际上,在 C++ 中,数字 5 默认是当做整数类型来处理,而数字 5.0 默认当做是浮点数类型(现在可以简单地把浮点数理解为小数)来处理。
当我们在进行混合的算术运算时,与数学中的四则运算法则一致,先乘除和取余,再加减,如果有小括号,先计算小括号里的运算。
例如,如果我们有下面的数学式子
可以写出下面的 C++ 代码去计算:
本章节主要介绍了 C++ 程序的基本结构和简单算术运算。
对于零基础的初学者来说,C++ 程序的基本结构有个基本的了解即可,主要是多练,直到能够熟练写出来为止。学习到后面,再反过来看这个基本结构的时候,每一句是什么意思应该就会越清晰,理解也会更深刻。