第一章
编写一个简单的 C++ 程序
-
在大多数系统中,main 的返回值被用来指示状态。返回值 0 表明成功,非 0 的返回值的含义由系统定义,通常用来指出错误类型。
-
访问
main
的返回值的方法依赖于系统。在 UNX 和 Windows 系统中,执行完一个程序后,都可以通过echo
命令获得其返回值。- 在
UNIX
系统中,通过如下命令获得状态:$ echo $?
- 在
Windows
系统中查看状态可键入$ echo %ERRORLEVEL%
- 在
-
编译器通常都包含一些选项,能对有问题的程序结构发出警告。打开这些选项通常是一个好习惯。我们习惯在 GNU 编译器中使用
-Wall
选项,在微软编译器中则使用/W4
。
初识输入输出
-
C++ 语言并未定义任何输入输出(IO)语句,取而代之,包含了一个全面的标准库(standard library)来提供 IO 机制(以及很多其他设施)。
-
iostream
库包含两个基础类型 istream 和 ostream,分别表示输入流和输岀流。一个流就是一个字符序列,是从 IO 设备读出或写入 IO 设备的。术语 流(stream)想要表达的是,随着时间的推移,字符是顺序生成或消耗的。 -
标准库定义了 4 个 IO 对象,它们是上面 istream 或 ostream 类型的对象。4 个对象如下:
- cin 标准输入,它是 istream 类的对象
- cout 标准输出,它是 ostream 类的对象
- cerr 用来输出警告和错误消息,也称为标准错误,它是 ostream 类的对象
- clog 用来输出程序运行时的一般性信息,它是 ostream 类的对象
-
在 C++ 中,一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。
-
std::cout << "Enter two numbers: " << std::endl;
<<
运算符接受两个运算对象
:左侧的运算对象必须是一个ostream
对象,右侧的运算对象是要打印的值。
此运算符将给定的值写到给定的 ostream 对象中,它的计算结果就是其左侧运算对象。即,计算结果就是我们写入给定值的那个 ostream 对象。
我们的输出语句使用了两次<<
运算符。因为此运算符返回其左侧的运算对象,因此第一个运算符
的结果成为了第二个运算符
的左侧运算对象。这样,我们就可以将输出请求连接起来。因此,我们的表达式等价于(std::cout << "Enter two numbers: ") << std::endl;
-
运算符打印
endl
,这是一个被称为操纵符的特殊值。写入 endl 的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入到对应设备的流。 -
程序员常常在调试时添加打印语句。这类语句应该保证 “一直” 刷新流。否则,如果程序崩溃,输出可能还留在缓冲区中,从而导致关于程序崩溃位置的错误推断。
-
前缀
std::
指出名字cout
和end1
是定义在名为std
的命名空间( namespace)中的。命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。标准库定义的所有名字都在命名空间 std 中
注释简介
-
错误的注释比完全没有注释更糟糕,因为它会误导读者。因此,当你修改代码时,不要忘记同时更新注释!
-
一个界定符注释不能嵌套在另一个界定符注释之内。编译器对这类问题所给出的错误信息可能是难以理解、令人迷惑的。
/** * 注释对/* */ 不能嵌套。 * “不能嵌套” 几个字会被认为是源码,像剩余程序一样处理 */ int main() { }
控制流
-
当我们使用一个 istream 对象作为条件时,其效果是检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符( end-of-file),或遇到一个无效输入时(例如读入的值不是一个整数), istream 对象的状态会变为无效。处于无效状态的 istream 对象会使条件变为假。
while(std::cin >> value)
-
从键盘输入文件结束符
- Windows 系统中,输入文件结束符的方法是敲 Ctrl+Z,然后按 Enter 键
- Unix 系统中,包括 Mac OS X 系统中,文件结束符输入,是用 Ctrl+D
-
按照错误报告的顺序来逐个修正错误,是一种好习惯。因为一个单个错误常常会具有传递效应,导致编译器在其后报告比实际数量多得多的错误信息。
-
当你测试程序时,反复从键盘敲入这些销售记录作为程序的输入,是非常乏味的。大多数操作系统支持文件重定向,这种机制允许我们将标准输入和标准输出与命名文件关联起来
$ addItems <infile >outfile