4.13:在下述语句中,当赋值完成后 i 和 d 的值分别是多少?
int i ; double d ;
(a) d=i=3.5; (b)i=d=3.5
Ans:a) i=3,d=3.0;b)i=3,d=3.5;
4.14:执行下述if语句后将发生什么情况?
if (42=i) //....
if (i=42) //....
Ans:第一条语句,编译器会报错,因为赋值语句的左值,必须是可以修改的。第二条语句,条件为将42赋值给 i,这个条件始终为真,直接执行后续if语句中的内容。
4.15:下面的赋值是非法的,为什么?应该如何修改?
double dval; int ival; int *pi;
dval=ival=pi=0;
Ans:赋值运算符满足右结合律,又因为pi是指向Int类型的指针,ival是int类型,将int *类型转换成int类型是不合法的,更别说是double类型了。
修改后:
double dval; int ival; int *pi;
dval=ival=0;
pi=0;
4.16、尽管下面的语句合法,但它们实际执行的行为可能和预期并不一样,为什么?应该如何修改?
(a) if (p=getPtr() != 0) (b)if (i = 1024 )
Ans:a) 预期是想让getPtr()函数返回的值赋值给p,然后再跟0进行比较,但是由于关系运算符的优先级要大于赋值运算符的优先级,所以实际执行的是让getPtr()函数返回的值与0比较,然后再赋值给p。只要getPtr()返回一次的值不等于0,那么整个条件都为真,即p的值始终为1; 应改成: if ( (p=getPtr() ) != 0)
b) 预期是想判断 i 的值是否等于1024,结果实际执行的确实赋值操作,将1024赋值给i,使得条件一直为真。应改成:if (i == 1024 )