1. 编写一个简单的 C++ 程序
int main()
{
return 0;
}
main 函数的返回类型必须为 int,即整数类型。int 类型是一种 内置类型 (built-in type),即语言自身定义的类型。
在大多数系统中,main 的返回值被用来指示状态。返回值 0 表明成功,非 0 的返回值的含义由系统定义,通常用来指出错误类型。
重要概念:类型
类型是程序设计最基本的概念之一,一种类型不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算。
程序所处理的数据都保存在变量中,而每个变量都有自己的类型。如果一个名为 v 的变量的类型为 T,我们通常说 “v 具有类型 T”,或等价的,“v 是一个 T 类型变量”。
访问 main
的返回值的方法依赖于系统。在 UNX 和 Windows 系统中,执行完一个程序后,都可以通过 echo
命令获得其返回值。
- 在
UNIX
系统中,通过如下命令获得状态:$ echo $?
- 在
Windows
系统中查看状态可键入$ echo %ERRORLEVEL%
运行 GNU 或微软编译器
-
运行 GNU 编译器的命令是 g++
$ g++ -o progl progl.cc
注意:根据使用的 GNU 编译器的版本,你可能需要指定
-std=c++0x
参数来打开对 C++11 的支持) -
运行微软 Visual Studio2010 编译器的命令为 cl:
> cl /EHsc progl.cpp
命令 cl 调用编译器,/EHsc 是编译器选项,用来打开标准异常处理。
编译器通常都包含一些选项,能对有问题的程序结构发出警告。打开这些选项通常是一个好习惯。我们习惯在 GNU 编译器中使用 -Wall
选项,在微软编译器中则使用 /W4
。
更详细的信息请查阅你使用的编译器的参考手册。
练习 1.1:査阅你使用的编译器的文档,确定它所使用的文件命名约定。编译并运行上面的 main 程序。
练习 1.2:改写程序,让它返回 - 1. 返回值 - 1 通常被当作程序错误的标识。重新编译并你的程序,观察你的系统如何处理 main 返回的错误标识。
2. 初识输入输出
C++ 语言并未定义任何输入输出(IO)语句,取而代之,包含了一个全面的标准库(standard library)来提供 IO 机制(以及很多其他设施)。
iostream
库包含两个基础类型 istream 和 ostream,分别表示输入流和输岀流。一个流就是一个字符序列,是从 IO 设备读出或写入 IO 设备的。术语 流(stream)想要表达的是,随着时间的推移,字符是顺序生成或消耗的。
标准输入输出对象
标准库定义了 4 个 IO 对象,它们是上面 istream 或 ostream 类型的对象。4 个对象如下:
- cin 标准输入,它是 istream 类的对象
- cout 标准输出,它是 ostream 类的对象
- cerr 用来输出警告和错误消息,也称为标准错误,它是 ostream 类的对象
- clog 用来输出程序运行时的一般性信息,它是 ostream 类的对象
一个使用 IO 库的程序
#include <iostream>
int main()
{
std::cout << "Enter two numbers: " << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
return 0;
}
运行结果如下:
Enter two numbers:
3 7
The sum of 3 and 7 is 10
在 C++ 中,一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。
下面表达式中
std::cout << "Enter two numbers: " << std::endl;
<<
运算符接受两个 运算对象
:左侧的运算对象必须是一个 ostream
对象,右侧的运算对象是要打印的值。
此运算符将给定的值写到给定的 ostream 对象中,它的计算结果就是其左侧运算对象。即,计算结果就是我们写入给定值的那个 ostream 对象。
我们的输出语句使用了两次 <<
运算符。因为此运算符返回其左侧的运算对象,因此第一个运算符
的结果成为了第二个运算符
的左侧运算对象。这样,我们就可以将输出请求连接起来。因此,我们的表达式等价于
(std::cout << "Enter two numbers: ") << std::endl;
链中每个运算符的左侧运算对象都是相同的。在本例中是 std::cout。我们也可以用两条语句生成相同的输出:
std::cout << "Enter two numbers: ";
std::cout << std::endl;
第一个输出运算符给用户打印一条消息。这个消息是一个字符串字面值常量,是用一对双引号包围的字符序列。在双引号之间的文本被打印到标准输出。
第二个运算符打印
endl
,这是一个被称为操纵符的特殊值。写入 endl 的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入到对应设备的流。
[注] 程序员常常在调试时添加打印语句。这类语句应该保证 “一直” 刷新流。否则,如果程序崩溃,输出可能还留在缓冲区中,从而导致关于程序崩溃位置的错误推断。
使用标准库中的名字
前缀 std::
指出名字 cout
和 end1
是定义在名为 std
的命名空间( namespace)中的。
命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。
标准库定义的所有名字都在命名空间 std 中
从流读取数据
int v1 = 0, v2 = 0;
上面语句中,我们定义了两个 int 类型的变量。int是一种内置类型,用来表示整数。然后我们将它初始化为 0,初始化一个变量,就是在变量创建的同时为它赋予一个值。
std::cin >> v1 >> v2;
输入运算符 >>
与输出运算符类似,它接受一个 istream
作为其左侧运算对象,接受一个对象作为其右侧运算对象。它从给定的 istream 读入数据,并存入给定对象中。与输出运算符类似,输入运算符返回其左侧运算对象作为其计算结果。因此,此表达式等价于
(std::cin >> v1) >> v2;
或者
std::cin >> v1;
std::cin >> v2;
完成程序
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
这条语句虽然比提示用户输入的打印语句更长,但原理上是一样的,它将每个运算对象打印在标准输出上。其中比较有意思的地方在于运算对象并不都是相同类型的值。标准库定义了不同版本的输入输出运算符,来处理这些不同类型的运算对象。