《C++ Primer》第4章 4.4节习题答案

《C++ Primer》第4章 表达式

4.4节赋值运行符

练习4.13:在下述语句中,当赋值完成后i和d的值分别是多少?
int i; double d;
(a) d = i = 3.5;        (b) i = d = 3.5;
【出题思路】
本题涉及的知识点有两个:第一,如果赋值运算符左右两个运算对象的类型不同,则右侧运算对象转换成左侧运算对象的类型;第二,赋值运算符满足右结合律。
【解答】
由题意可知,(a)式的含义是先把3.5赋值给整数i,此时发生了自动类型转换,小数部分被舍弃,i的值为3;接着i的值再赋给双精度浮点数d,所以d的值也是3。(b)式的含义是先把3.5赋值给双精度浮点数d,因此d的值是3.5;接着d的值再赋给整数i,此时发生了自动类型转换,小数部分被舍弃,i的值为3。

练习4.14:执行下述if语句后将发生什么情况?
if (42 = i) //...
if (i = 42) //...
【出题思路】
本题涉及的知识点有两个:第一,赋值运算符的左侧运算对象必须是左值,右侧运算对象可以是左值,也可以是右值;第二,赋值运算符与相等性运算符在作为if语句的条件时含义不同。
【解答】
第一条语句发生编译错误,因为赋值运算符的左侧运算对象必须是左值,字面值常量42显然不是左值,不能作为左侧运算对象。
第二条语句从语法上来说是正确的,但是与程序的原意不符。程序的原意是判断i的值是否是42,应该写成i==42;而i=42的意思是把42赋值给i,然后判断i的值是否为真。因为所有非0整数转换成布尔值时都对应true,所以该条件是恒为真的。

练习4.15:下面的赋值是非法的,为什么?应该如何修改?
double dval; int ival; int *pi;
dval = ival = pi = 0;
【出题思路】
赋值运算符满足右结合律,自右向左分析赋值操作的含义。
【解答】
该赋值语句是非法的,虽然连续赋值的形式本身并没有错,但是参与赋值的几个变量类型不同。其中,dval是双精度浮点数,ival是整数,pi是整型指针。
自右向左分析赋值操作的含义,pi=0表示pi是一个空指针,接下来ival=pi试图把整型指针的值赋给整数,这是不符合语法规范的操作,无法编译通过。稍作调整,就可以把上述程序改为合法。
double dval; int ival; int *pi;
dval = ival = 0;
pi = 0;

练习4.16:尽管下面的语句合法,但它们实际执行的行为可能和预期并不一样,为什么?应该如何修改?
(a) if(p = getPtr() != 0)    (b) if(i = 1024)
【出题思路】
本题考查运算符优先级及赋值表达式作为if条件的含义。
【解答】
(a)的原意是把getPtr()得到的指针赋值给p,然后判断p是否是一个空指针,但上述表达式的实际执行结果与之相距甚远。因为赋值运算符的优先级低于不相等运算符,所以真正的表达式求值过程是先判断getPtr()的返回值是否为空指针,如果是则p=0,否则p=1,最后以p的值作为if语句的条件。要想符合原意,应该修改为:
if((p = getPtr()) != 0)
(b)的原意是判断i的值是否是1024,但上述表达式实际上是把1024赋值给i,然后以i作为if语句的条件。因为所有非0整数转换成布尔值时都对应true,所以该条件是恒为真的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值