[C++ primer] 第五章习题答案
5.15.25.35.45.85.105.105.115.135.155.185.23
5.1
如果在程序的某个地方,语法上需要一条语句但是逻辑上不需要,此时应该使用空语句。(注意此时应该加上注释,增加可读性)
5.2
复合语句(块)是用花括号括起来的(可能为空的)语句和声明的序列,复合语句也被称作块。 一个块就是一个作用域,在块中引入的名字只能在块内部以及嵌套在块中的子块里访问。 块不以分号作为结束。
5.3
会降低代码的可读性
while(val
<= 10) sum
+= val
, ++val
;
5.4
定义在控制结构当中的变量只在相应语句的内部可见,一旦语句结束,变量也就超出其作用范围了 (a)iter没有初始化,直接与end比较非法 (b)if循环没有意义,并且变量status在if循环中不可用
5.8
当if语句嵌套时,可能会出现if语句的数量大于else语句的情况,这时,我们如何确定给定的else是和哪个if匹配的呢?这个问题就称作悬垂else。
c++中规定,else与离它最近且尚未匹配的if语句匹配。
5.10
#include <iostream>
#include <vector>
using namespace std
;
int main()
{
int cntA
= 0, cntE
= 0, cntI
= 0, cntO
= 0, cntU
= 0;
char temp
;
while (cin
>> temp
)
{
if (temp
== 'a')
cntA
++;
else if (temp
== 'e')
cntE
++;
else if (temp
== 'i')
cntI
++;
else if (temp
== 'o')
cntO
++;
else if (temp
== 'u')
cntU
++;
}
}
5.10
#include <iostream>
#include <vector>
using namespace std
;
int main()
{
int cntA
= 0, cntE
= 0, cntI
= 0, cntO
= 0, cntU
= 0;
char temp
;
while (cin
>> temp
)
{
switch (cval
)
{
case 'a':
case 'A':
cntA
++;
break;
case 'e':
case 'E':
cntE
++;
break;
case 'i':
case 'I':
cntI
++;
break;
case 'o':
case 'O':
cntO
++;
break;
case 'u':
case 'U':
cntU
++;
break;
}
}
}
5.11
空格符‘ ’ 制表符‘/t’ 换行符’/n’
5.13
(a)没有break, 程序会在遇到字符a时把aCnt, eCnt, iouCnt全部+1 (b)ix应该在外部定义 (c)case标签中只能有一个常量,不能用逗号 (d)case标签必须是常量表达式
5.15
(a)if语句永远不成立 (b)ix没有初始化 (c)死循环
5.18
(a)没有加{} (b)不允许在do while的条件部分定义变量 (c)condition使用的变量必须定义在循环体外部
5.23
#include <iostream>
#include <stdexcept>
#include <vector>
using namespace std
;
int main()
{
int a
, b
;
while (cin
>> a
>> b
)
{
try
{
if (b
== 0)
throw runtime_error("被除数不能为0");
cout
<< a
/ b
<< endl
;
break;
}
catch (runtime_error err
)
{
cout
<< err
.what();
cout
<< "是否要重新输入" << endl
;
char c
;
cin
>> c
;
if (!cin
|| c
== 'n') break;
}
}
}