📄 习题5.18 .html
字号:
"signed short\t\t" << sizeof(signed short) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"unsigned short\t\t" << sizeof(unsigned short) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"int\t\t\t" << sizeof(int) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"signed int\t\t" << sizeof(signed int) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"unsigend int\t\t" << sizeof(unsigned int) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"long\t\t\t" << sizeof(long) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"sigend long\t\t" << sizeof(signed long) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"unsigned long\t\t" << sizeof(unsigned long) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"float\t\t\t" << sizeof(float) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"double\t\t\t" << sizeof(double) << endl</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> <<
"long double\t\t" << sizeof(long double) << endl;</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'> return 0;</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'>}</p>
<div style='border:none;border-bottom:solid #999999 1.0pt;padding:0cm 0cm 1.0pt 0cm;
margin-left:1.4pt;margin-right:1.4pt'>
<p class=aff2 style='margin-top:8.0pt;margin-right:0cm;margin-bottom:4.0pt;
margin-left:0cm'>习题5.23 </p>
</div>
<p class=XT>预测下列程序的输出,并解释你的理由。然后运行该程序,输出的结果和你预测的一样吗?如果不一样,为什么?</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'>int x[10]; int *p = x;</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'>cout << sizeof(x)/sizeof(*x) << endl;</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'>cout << sizeof(p)/sizeof(*p) << endl;</p>
<p class=aff4>【解答】</p>
<p class=MsoNormal style='text-autospace:none'>在表达式sizeof(x)中,x是数组名,该表达式的结果为数组x所占据的存储空间的字节数,为10个int型元素所占据的字节数。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>表达式sizeof(*x)的结果是指针常量x所指向的对象(数组中第一个int型元素)所占据的存储空间的字节数。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>表达式sizeof(p)的结果是指针变量p所占据的存储空间的字节数。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>表达式sizeof(*p)的结果是指针变量p所指向的对象(一个int型数据)所占据的存储空间的字节数。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>各种数据类型在不同的系统中所占据的字节数不一定相同,因此在不同的系统中运行上述程序段得到的结果不一定相同。在Microsoft Visual
C++ .NET 2003系统中,一个int型数据占据4个字节,一个指针型数据也占据4个字节,因此运行上述程序得到的输出结果为:</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'>10</p>
<p class=MsoNormal align=left style='text-align:left;line-height:9.0pt;
punctuation-trim:none;text-autospace:none'>1</p>
<div style='border:none;border-bottom:solid #999999 1.0pt;padding:0cm 0cm 1.0pt 0cm;
margin-left:1.4pt;margin-right:1.4pt'>
<p class=aff2 style='margin-top:8.0pt;margin-right:0cm;margin-bottom:4.0pt;
margin-left:0cm;text-indent:6.0pt'>习题5.24 </p>
</div>
<p class=XT style='text-align:justify;text-justify:inter-ideograph'>本节的程序与5.5节在vector对象中添加元素的程序类似。两段程序都使用递减的计数器生成元素的值。本程序中,我们使用了前自减操作,而5.5节的程序则使用了后自减操作。解释为什么一段程序中使用前自减操作而在另一段程序中使用后自减操作。</p>
<p class=aff4>【解答】</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>5.5节的程序中必须使用后自减操作。如果使用前自减操作,则是用减1后的cnt值创建ivec的新元素,添加到ivec中的元素将不是10~1,而是9~0。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>本节的程序中使用后自减操作或前自减操作均可,因为对cnt的自减操作和对cnt值的使用不是出现在同一表达式中,cnt自减操作的前置或后置形式不影响对cnt值的使用。</p>
<div style='border:none;border-bottom:solid #999999 1.0pt;padding:0cm 0cm 1.0pt 0cm;
margin-left:1.4pt;margin-right:1.4pt'>
<p class=aff2 style='margin-top:8.0pt;margin-right:0cm;margin-bottom:4.0pt;
margin-left:0cm;text-indent:6.0pt'>习题5.25 </p>
</div>
<p class=XT>根据表5-4的内容,在下列表达式中添加圆括号说明其操作数分组的顺序(即计算顺序):</p>
<p class=MsoNormal align=left style='margin-left:20.15pt;text-align:left;
text-indent:0cm;layout-grid-mode:char;punctuation-trim:none;text-autospace:
none'>(a) ! ptr == ptr->next</p>
<p class=MsoNormal align=left style='margin-left:20.15pt;text-align:left;
text-indent:0cm;layout-grid-mode:char;punctuation-trim:none;text-autospace:
none'>(b) ch = buf[ bp++ ] != '\n'</p>
<p class=aff4>【解答】</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>添加圆括号说明其计算顺序如下:</p>
<p class=MsoNormal align=left style='margin-left:20.15pt;text-align:left;
text-indent:0cm;layout-grid-mode:char;punctuation-trim:none;text-autospace:
none'>(a) ((! ptr) == (ptr->next))</p>
<p class=MsoNormal align=left style='margin-left:20.15pt;text-align:left;
text-indent:0cm;layout-grid-mode:char;punctuation-trim:none;text-autospace:
none'>(b) (ch = ((buf[ (bp++) ]) != '\n'))</p>
<div style='border:none;border-bottom:solid #999999 1.0pt;padding:0cm 0cm 1.0pt 0cm;
margin-left:1.4pt;margin-right:1.4pt'>
<p class=aff2 style='margin-top:8.0pt;margin-right:0cm;margin-bottom:4.0pt;
margin-left:0cm;text-indent:6.0pt'>习题5.26 </p>
</div>
<p class=XT>习题5.25中的表达式的计算次序与你的意图不同,给它们加上圆括号使其以你所希望的操作次序求解。</p>
<p class=aff4>【解答】</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>添加圆括号获得与上题不同的操作次序如下:</p>
<p class=MsoNormal align=left style='margin-left:20.15pt;text-align:left;
text-indent:0cm;layout-grid-mode:char;punctuation-trim:none;text-autospace:
none'>(a) ! (ptr == ptr->next)</p>
<p class=MsoNormal align=left style='margin-left:20.15pt;text-align:left;
text-indent:0cm;layout-grid-mode:char;punctuation-trim:none;text-autospace:
none'>(b) (ch = buf[ bp++ ]) != '\n'</p>
<div style='border:none;border-bottom:solid #999999 1.0pt;padding:0cm 0cm 1.0pt 0cm;
margin-left:1.4pt;margin-right:1.4pt'>
<p class=aff2 style='margin-top:8.0pt;margin-right:0cm;margin-bottom:4.0pt;
margin-left:0cm;text-indent:6.0pt'>习题5.27 </p>
</div>
<p class=XT>由于操作符优先级的问题,下列表达式编译失败。请参照表5-4解释原因,应该如何改正?</p>
<p class=XT style='line-height:9.0pt;punctuation-trim:none'>string s = "word";</p>
<p class=XT style='line-height:9.0pt;punctuation-trim:none'>// add an 's' to the end, if the
word doesn't already end in 's'</p>
<p class=XT style='line-height:9.0pt;punctuation-trim:none'>string pl = s + s[s.size() - 1] == 's'
? "" : "s" ;</p>
<p class=aff4>【解答】</p>
<p class=MsoNormal align=left style='text-align:left;text-indent:19.0pt;
text-autospace:none'>由表5-4可知,在语句string pl = s + s[s.size() - 1] == 's' ? "" : "s" ;中,赋值、加法、条件操作符三者的操作次序为:先执行“+”操作,再用表达式s + s[s.size() - 1]的结果参与条件操作,最后将条件操作的结果赋给pl。但表达式s + s[s.size() - 1]的结果是一个string对象,不能与字符's'进行相等比较,所以编译失败。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>改正为:string pl = s + (s[s.size() - 1] == 's' ? "" : "s") ;。</p>
<div style='border:none;border-bottom:solid #999999 1.0pt;padding:0cm 0cm 1.0pt 0cm;
margin-left:1.4pt;margin-right:1.4pt'>
<p class=aff2 style='margin-top:8.0pt;margin-right:0cm;margin-bottom:4.0pt;
margin-left:0cm;text-indent:6.0pt'>习题5.28 </p>
</div>
<p class=XT>除了逻辑与和逻辑或外,C++没有明确定义二元操作符的求解次序,编译器可自由地提供最佳的实现方式。只能在“实现效率”和程序语言使用中“潜在的缺陷”之间寻求平衡。你认为这可以接受吗?说出你的理由。</p>
<p class=aff4>【解答】</p>
<p class=MsoCommentText style='text-indent:21.0pt;text-autospace:none'>这可以接受。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>因为,操作数的求解次序通常对结果没什么影响。只有当二元操作符的两个操作数涉及同一对象,并改变该对象的值时,操作数的求解次序才会影响计算结果;后一种情况只会在部分(甚至是少数)程序中出现。在实际使用中,这种“潜在的缺陷”可以通过程序员的努力得到弥补,但“实现效率”的提高却能使所有使用该编译器的程序受益,因此利大于弊。</p>
<div style='border:none;border-bottom:solid #999999 1.0pt;padding:0cm 0cm 1.0pt 0cm;
margin-left:1.4pt;margin-right:1.4pt'>
<p class=aff2 style='margin-top:8.0pt;margin-right:0cm;margin-bottom:4.0pt;
margin-left:0cm'>习题5.29 </p>
</div>
<p class=XT style='text-align:justify;text-justify:inter-ideograph'>假设ptr指向类类型对象,该类拥有一个名为ival的int型数据成员,vec是保存int型元素的vector对象,而ival、jval和kval都是int型变量。请解释下列表达式的行为,并指出哪些(如果有的话)可能是不正确的,为什么?如何改正?</p>
<p class=MsoNormal align=left style='text-align:left;layout-grid-mode:char;
punctuation-trim:none;text-autospace:none'>(a)
ptr->ival != 0 (b) ival != jval < kval</p>
<p class=MsoNormal align=left style='text-align:left;layout-grid-mode:char;
punctuation-trim:none;text-autospace:none'>(c)
ptr != 0 && *ptr++ (d) ival++ && ival</p>
<p class=MsoNormal align=left style='text-align:left;layout-grid-mode:char;
punctuation-trim:none;text-autospace:none'>(e)
vec[ival++] <= vec[ival]</p>
<p class=aff4>【解答】</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>表达式的行为如下:</p>
<p class=MsoNormal>(a) 判断ptr所指向的对象的ival成员是否不等于0。</p>
<p class=MsoNormal>(b) 判断ival是否不等于“jval是否小于kval”的判断结果,即判断ival是否不等于true(1)或false(0)。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>(c) 判断ptr是否不等于0。如果ptr不等于0,则求解&&操作的右操作数,即,ptr加1,且判断ptr原来所指向的对象是否为0。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>(d) 判断ival及ival+1是否为true(非0值)(注意,如果ival为false,则无需继续判断ival+1)。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>(e) 判断vec[ival]是否小于或等于vec[ival+1]。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>其中,(d)和(e)可能不正确,因为二元操作符的两个操作数涉及同一对象,并改变该对象的值。</p>
<p class=MsoNormal align=left style='text-align:left;text-autospace:none'>可改正如下:</p>
<p class=MsoNormal align=left style='text-align:left;layout-grid-mode:char;
punctuation-trim:none;text-autospace:none'>(d)
ival && ival + 1</p>
<p class=MsoNormal align=left style='text-align:left;layout-grid-mode:char;
punctuation-trim:none;text-autospace:none'>(e)
vec[ival] <= vec[ival + 1]</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -