练习4.13、4.14、4.15、4.16

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 )

原文地址:https://www.cnblogs.com/Dark-King/p/9438405.html