A.7 第7章

1.b表达式为true。

阅读 ‧ 电子书库

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

3.第5行:应该是scanf(“%d%d”, &weight,&height);。在scanf()中不要忘记使用&运算符。这一行前面也应该有提示输入的语句。但第6行已经保证heigh>64,因此,不需要任何测试,并且if else应该是else。

第9行:它的意思是(height<72&&height>64)。但是表达式的第一部分是不必要的,因为既然程序已经到达了这个else if,那么height必然小于72。因此一个简单的(height>64)就可以了。
第11行:条件冗余;第二个子表达式(weight不是小于或等于300的)与第一个子表达式意义相同。所需要的只是一个简单的(weight>300)。但是这里还有更多的问题。第11行属于一个不正确的if!很明显,这个else是与第6行中的if相匹配的。但是根据if的“最接近规则”,它会与第9行的if相匹配。因此会在weight小于100并且height小于或等于64时到达第11行。这就使得在到达该语句时weight不可能超过300。
第7到9行:应该用花括号括起来。这样第11行就会是第6行而不是第9行的可选情况。而如果第9行的else if由一个简单的else替代了,就不再需要花括号了。
第13行:应该简化为if(height>48)。其实这一行完全可以忽略,因为第12行已经作了这种测试。
第15行:这个else与第13行的if相匹配。把第13和14行括在花括号中可以强制使这个else与第11行的if相匹配。或者,按照建议,简单地删掉第13行。

下面是一个正确的版本:

阅读 ‧ 电子书库

阅读 ‧ 电子书库

4.a.1。该断言为真,它在数值上是1。

b.0。3不比2小。
c.1。如果第一个表达式为假则第二个为真,反之亦然;只需要一个为真的表达式,结果就为真。
d.6。因为6>2的值为1。
e.10。因为判断条件为真。
f.0。如果x>y为真,那么表达式的值就是y>x,这种情况下它就为假或0。如果x>y为假,那么表达式的值就是x>y,这种情况下它为假。

5.程序打印以下内容:

阅读 ‧ 电子书库

不论怎样缩排,在每个循环中都会打印#,因为它并不是复合语句的一部分。

6.程序打印以下内容:

阅读 ‧ 电子书库

7.第5行到第7行的注释应该以*/结尾,或者用//来代替/*。表达式‘a’<=ch>=‘z’应该被写成这样:

阅读 ‧ 电子书库

或者用一种更简单也更通用的方法:包含ctype.h文件并使用islower()。顺便提一下,‘a’<=ch>=‘z’在C中是合法的,只是不具有正确的意义。因为关系运算符是从左到右结合的,所以这个表达式被解释为(‘a’<=ch)>=‘z’。圆括号中表达式的值为1或0(真或假),然后检查这个值来看它是否等于或大于‘z’的数值编码。0和1都不能满足这个条件,所以整个表达式的值总是为0(假)。在第二个判断表达式中,II应该是&&。尽管!(ch<‘A’)是合法的,而且意义也正确,但ch>=‘A’更为简单。‘Z’后面需要有两个结束圆括号而不是一个。再一次,更简单的方法是使用isupper()。应该在oc++;语句前面放置一个else,否则,每输入一个字符,它都会增加1。在printf()调用中的控制表达式应该用双引号引起来。

下面是正确的版本:

阅读 ‧ 电子书库

阅读 ‧ 电子书库

8.不幸的是,它无休止地打印同一行:

You are 65.Here is your gold watch.

问题在于:

阅读 ‧ 电子书库

这行代码把age设置为65,使得每个循环周期中判断条件都为真。

9.这里是使用给定的输入时的运行结果:

阅读 ‧ 电子书库

注意b和#都可以结束循环,但是输入b会引起打印Step 1,输入#则不会。

10.下面是一种方案:

阅读 ‧ 电子书库