C++ Primer Plus 6th 读书笔记 - 第6章 分支语句和逻辑运算符

时间:2022-01-23 17:22:52

1. cin读取错误时对换行符的处理

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main() {
 6     double d;
 7     char c;
 8     cin >> d;
 9     if(!cin) {
10         cout << "x" << endl;
11         cin.clear();
12         cout << cin.get() << endl;
13     }
14     // cin.get();
15     cin.get(c);
16 }

以上代码输入分为2种情况:

若输入为double类型,则cin.get(c)会读取换行符,程序运行结束。

若输入为非double类型,如char类型,则cin会置错误位,保留错误输入的同时丢弃回车符(现象如此,原因猜测),所以程序在运行到cin.get(c)时候会停止等待输入。

奇怪,又测试了几次,感觉和之前一样,程序运行结束。

 

2. const指针分析

在二级间接关系时,将const指针和非const指针混合的指针赋值方式将不再安全。

1 const int **pp2;
2 int *p1;
3 const int n = 13;
4 pp2 = &p1; // not allowed
5 *pp2 = &n; // valid
6 *p1 = 10; // valid

pp2是一个指针,他指向另一个指针的地址,而另一个指针是指向一个int变量的地址。

pp2指针本身非const,所以可以指向一个指针地址,即&p1。但在实际编程中,语句4语法检查错误,原因是p1指向的是非const的int,而要求是const int。

假如语句4运行成功,则*pp2为指向一个const int的指针,赋值成功,即 p1 = &n,但实际情况下非const指针不能指向const变量,故运行*p1 = 10时与原先造成冲突。