C++ primer 习题笔记第5~6章
来源:互联网 发布:黑魂三男性捏脸数据 编辑:程序博客网 时间:2024/05/29 18:08
【解答】
溢出:表达式的求值结果超出了其类型的表示范围。
如下表达式会导致溢出(假设 int 类型为 16 位):
1000 * 1000
32766 + 5
3276 * 20
在这些表达式中,各操作数均为 int 类型,因此这些表达式的类型也是 int,但它们的计算结果均超出了 16 位 int 型的表示范围(-32768~32767),导致溢出。
2、逻辑与、逻辑或操作符采用称为“短路求值”(short -circuit evaluation)的求值策略,即先计算左操作数,再计算右操作数,且只有当仅靠左操作数的值无法确定该逻辑运算的结果时,才会计算右操作数。相等操作符的左右操作数均需进行计算。
3、你认为为什么 C++不叫作++C?
【解答】
C++ 之名是 Rick Mascitti 在 1983 年夏天定名的( 参见The C++ ProgrammingLanguage(Special Edition) 1.4 节), C 说明它本质上是从C 语言演化而来的,“++”是 C 语言的自增操作符。C++语言是 C 语言的超集,是在 C 语言基础上进行的扩展(引入了 new、delete 等 C 语言中没有的操作符,增加了对面向对象程序设计的直接支持,等等),是先有C 语言,再进行++。根据自增操作符前、后置形式的差别,C++表示对 C 语言进行扩展之后,还可以使用 C 语言的内容;而写成++C 则表示无法再使用 C的原始值了,也就是说 C++不能向下兼容 C 了,这不实际情况不符。
4、输入两个数,然后报告哪个数比较小。
val1 < val2 ? val1 : val2
5、下列诧句哪些(如果有癿话)是非法的活错误的?
(a) vector<string> svec(10);
(b) vector<string> *pvec1 = new vector<string>(10);
(c) vector<string> **pvec2 = new vector<string>[10];
(d) vector<string> *pv1 = &svec;
(e) vector<string> *pv2 = pvec1;
(f) delete svec;
(g) delete pvec1;
(h) delete [] pvec2;
(i) delete pv1;
(j) delete pv2;
【解答】
错诨的有(c)和(f)。(c)的错误的是: pvec2 是指向元素类型为 string 的 vector 对象的指针的指针(即 pvec2 的类型为 vector<string> **),而 new 操作返回的是一个指向元
素类型为 string 的vector 对象的指针,不能用于初始化pvec2。(f)的错误在于: svec 是一个 vector 对象,不是指针,不能对它进行 delete 操作。
6、解释在计算下列表达式的过程中发生了什么类型转换?
char cval; int ival; unsigned int ui;float fval; double dval;
(a) cval = 'a' + 3;
(b) dval = fval + ival;
(d) cval = ival + fval + dval;
【解答】
(a) 'a'首先提升为 int 类型,再将'a' + 3 的结果值转换为char 型,赋给 cval。
(b) 将 ival 的值从 int 类型转换为 float 类型,再将 fval + ival 的结果值转换为 double 类型,赋给 dval。
(d) ival 转换为 float 型与fval 相加,结果转换为 double 型,再与 dval 相加,结果转换为 char 型,赋给 cval。
7、给定下列定义:
int ival; double dval;const string *ps; char *pc; void *pv;
用命名的强制类型转换符号重写下列语句:
(a) pv = (void*)ps;
【解答】
(a) pv = static_cast<void*> (const_cast<string*> (ps));
8、所谓“悬垂else”,指的是当一个语句包含的if子句多于else子句时,各个else子句应该与哪个if子句相匹配。
9、修改程序使其可统计出读入的空格、制表符和换行符的个数。
#include<iostream>
using namespace std;
int main()
{
char ch;
//初始化各个计数器
int aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
int spaceCnt = 0,tabCnt = 0,newlineCnt = 0;
while (cin.get(ch)) {
// 若ch是元音字母以及空格、制表符和换行符,将相应计数器加1
switch (ch) {
case 'a':
case 'A':
++aCnt;
break;
case 'e':
case 'E':
++eCnt;
break;
case 'i':
case 'I':
++iCnt;
break;
case 'o':
case 'O':
++oCnt;
break;
case 'u':
case 'U':
++uCnt;
break;
case ' ':
++spaceCnt;
break;
case '\t':
++tabCnt;
break;
case '\n':
++newlineCnt;
break;
}
}
// 输出结果
cout << "Number of vowel a: \t" << aCnt << '\n'<< "Number of vowel e: \t" << eCnt << '\n' << "Number of vowel i: \t" << iCnt << '\n' << "Number of vowel o: \t" << oCnt << '\n'
<< "Number of vowel u: \t" << uCnt << '\n'<< "Total non-vowels : \t" << otherCnt << '\n';
return 0;
}
注意,此处读取数据时不能使用提取操作符( >> ),因为对>>而言,空格、制表符和换行符均为数据项分隔符,会被忽略掉,而cin对象的get成员函数则不会这样。
10、详细解释下面while循环中的语句是如何执行的:
*dest++ = *source++;
【解答】
执行过程如下:(1)指针dest加1;(2)指针source加1;(3)将source原来所指向的对象赋给dest原来所指向的对象。
- C++ primer 习题笔记第5~6章
- Primer C 4th(第6章习题)
- Primer C 4th(第5章习题)
- c primer plus第14章习题
- C++primer第9章习题解答
- C++primer第14章习题解答
- C++primer第15章习题解答
- c++primer plus 第12章习题
- C++Primer习题第10章
- C++ primer习题笔记第4章
- C++Primer第6章学习笔记
- C++Primer 第6章笔记整理
- C++Primer 第5章笔记整理
- C primer plus第6章(c控制语句:循环)习题
- Primer C 4th(第2章习题)
- Primer C 4th(第3章习题)
- Primer C 4th(第4章习题)
- Primer C 4th(第7章习题)
- 电源的S1,S2,S3,S4,S5的含义
- Linux下通过OTG把板卡上的一个磁盘或文件映射成移动磁盘
- 内联函数:static inline 和 extern inline 的含义
- 字符留和字节流的总结
- 《Linux Shell脚本攻略》要点笔记总结(阅读心得)之第1章
- C++ primer 习题笔记第5~6章
- 异常简介
- 最优化方法总结
- CentOS下python安装pip。干货
- Android官方技术文档翻译——Gradle 插件用户指南(1-3)
- android开发之Animations的使用(一)
- 中断
- 不较真
- static和extern