C++ primer 习题笔记第5~6章

来源:互联网 发布:黑魂三男性捏脸数据 编辑:程序博客网 时间:2024/05/29 18:08
1、定义术语“溢出”的含义,并给出导致溢出的三个表达式。
【解答】
溢出:表达式的求值结果超出了其类型的表示范围。
如下表达式会导致溢出(假设 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原来所指向的对象。


0 0