Chapter 1: Working with strings

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[]操作。如果你在自己的程序中自己实现,也是可以的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值