1.2 初识输入输出
iostream 库包含两个基础类型istream和ostream,分别表示输入流和输出流。术语“流”想要表达的是,随着时间的推移,字符是顺序生成或消耗的。
标准输入输出对象
标准库定义了4个IO对象:
- 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;
}
使用输出运算符(<<)在标准输出上打印消息:
<<运算符接受两个运算对象:左侧的运算对象必须是一个ostream对象,右侧的运算对象是要打印的值。此运算符将给定的值写到给定的ostream对象中。输出运算符的计算结果就是起左侧运算对象。即,计算结果就是我们写入给定值的那个ostream对象。
也就是说<<运算符的结合性是从左至右的,每次运算的结果都是左操作对象,也就是ostream对象。
endl被称为操纵符。写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。
标准输出是行缓冲设备。
前缀std::cout指出名字cout和endl是定义在名为std的命名空间(namespace)中的。命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。标准库定义的所有名字都在命名空间std中。
通过名字空间使用标准库有一个副作用:当使用标准库中的一个名字时,必须显式说明我们想使用来自命名空间std的名字。使用作用域运算符(::)来指出我们想使用定义在命名空间std中的名字cout。化简后的写法如下:
#include <iostream>
using namespace std;
int main()
{
cout << "Enter two numbers:" << endl;
int v1 = 0, v2 = 0;
cin >> v1 >> v2;
cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << endl;
return 0;
}
执行效果:
etc@etc-ruc:~/cpp/ch1/2$ g++ prog2.cpp -o prog2 -Wall -g
etc@etc-ruc:~/cpp/ch1/2$ ./prog2
Enter two numbers:
3 4
The sum of 3 and 4 is 7
etc@etc-ruc:~/cpp/ch1/2$ ./prog2
Enter two numbers:
3.14 4
The sum of 3 and 0 is 3
etc@etc-ruc:~/cpp/ch1/2$ ./prog2
Enter two numbers:
a 4
The sum of 0 and 0 is 0
etc@etc-ruc:~/cpp/ch1/2$ ./prog2
Enter two numbers:
3.14 a
The sum of 3 and 0 is 3
etc@etc-ruc:~/cpp/ch1/2$ ./prog2
Enter two numbers:
3q 4
The sum of 3 and 0 is 3
不难看出cin在接收到与变量类型不匹配的字符后,其后面的变量赋值都会失败。
输入运算符(>>)与输出运算符类似,它接受一个istream作为其左侧运算对象,接受一个对象作为其右侧运算对象。输入运算符返回其左侧运算对象作为其计算结果。
练习1.3
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, World" << endl;
return 0;
}
运行结果:
etc@etc-ruc:~/cpp/ch1/2$ g++ exercise1_3.cpp -o prog -Wall -g
etc@etc-ruc:~/cpp/ch1/2$ ./prog
Hello, World
练习1.4
#include <iostream>
using namespace std;
int main()
{
int v1 = 0, v2 = 0;
cin >> v1 >> v2;
cout << v1 << " * " << v2 << " = " << v1 * v2 << endl;
return 0;
}
运行结果:
etc@etc-ruc:~/cpp/ch1/2$ g++ exercise1_4.cpp -o prog -Wall -g
etc@etc-ruc:~/cpp/ch1/2$ !./
./prog
3 4
3 * 4 = 12
练习1.5
略
练习1.6
不合法。因为一条语句以“;”结束,故第二行是一条独立的语句,<<是个双目运算,它可以是输出运算符,也可以是左移运算符,它没有左操作对象,故不合法。修正方法:每个独立语句的左侧加上std::cout;或者将前两行的“;”都删除,使之成为一条完整的语句。