0. §1.1/9
// ask for a person's name, and greet the person
#include <iostream>
#include <string>
int main()
{
// ask for the person's name
std::cout << "Please enter your first name: ";
// read the name
std::string name; // define name
std::cin >> name; // read into name
// write a greeting
std::cout << "Hello, " << name << "!" ;
std::cout << std::endl;
return 0;
}
用gdb调试程序:
(gdb) start
Temporary breakpoint 1 at 0x804889e: file greet.cc, line 8.
Starting program: /home/user/Documents/Accelerated C++/chapter01/greet
Temporary breakpoint 1, main () at greet.cc:8
8 std::cout << "Please enter your first name: ";
(gdb) n
11 std::string name; // define `name'
(gdb) n
12 std::cin >> name; // read into `name'
(gdb) n
Please enter your first name: Estragon
15 std::cout << "Hello, " << name << "!";
(gdb) n
16 std::cout << std::endl;
(gdb) n
Hello, Estragon!
17 return 0;
程序在第8行语句运行完后没有立即输出"Please enter your first name:",而是在第12行运行时输出了该字符串,这与输出缓冲有关系。
输入输出库会把它的输出保存在叫做缓冲(buffer)的内部数据结构上,通过缓冲可以优化输出操作。为了避免无法及时响应每个输出请求,标准库使用缓冲来积累需要输出的字符,然后等到必要的时候,刷新(flush)缓冲来把缓冲的内容写入到输出设备中。
有三个事件会促使系统刷新缓冲。第一种情况是,缓冲满了,这时标准库会自动地刷新它。第二种情况是,标准库被要求读取标准输入流,这时标准库会立即刷新输出缓冲,而等不到它满的时候。第三种情况是我们显式地要求刷新缓冲。
程序在第12行才输出字符串就属于第二种情况。在第15行语句运行完后也没有立即输出字符串而是第16行后才输出,这属于第三种情况,std::endl结束了输出行,然后刷新缓冲,促使系统立即把缓冲内容写入到输出流中。
1. 练习 1-1、1-2
第一组定义:
const std::string hello = "Hello";
const std::string message = hello + ", world" + "!";
第二组定义:
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam;
用g++编译时,第一组定义不会报错,而第二组定义的错误为:invalid operands of types ‘const char [6]’ and ‘const char [8]’ to binary ‘operator+’,也就是两个常量字符串对二元操作符‘operator+’来说是无效的操作数。
搜到一篇名为“为什么标准C++中两个直接字符串常量不能相加“的文章,正文如下:
第一部分是可以编译成功的,而第二部分是不行的。为什么?
因为在第二部分的第二句,赋值号的右边 先做”Hello” + “,world” 操作,而对于”Hello”和”,world”都是const char[]类型的,在标准C++中这个类型是不能做 “+”操作的。
而对于第一部分,hello + “,world”可以进行成功操作,因为hello为std::string类型,对于这种类型,标准库中重载了其与char[]类型之间的”+”操作符,所以是可以的,并且返回值是std::string类型,当然再与右面的操作也没问题了。对于string类型的“+”操作符,在标准库中重载了string与string的+操作,string与char[]的+操作,以及string与char的+操作。也就是说’x'+hello也是可以的。
所以,为什么两个直接字符串不能相加?很简单一句话,因为C++标准库中没有实现“+”号对于char[]类型的重载以支持char[] + char[]操作。如果你在自己的程序中自己实现,也是可以的。