《C语言解惑》之 谜题2.3 其他类型的转换

 

 

谜题2.3 其他类型的转换

请问,下面这个程序的输出是什么?

#include <stdio.h>

#define PR(x) printf(#x " = %g/t",(double)(x))

#define NL putchar(’/n’)

#define PRINT1(x1) PR(x1); NL

#define PRINT2(x1,x2) PR(x1); PRINT1(x2)

main()

{

     double d=3.2, x;

     int i=2,  y;

     x = (y=d/i)*2; PRINT2(x,y);          (2.3.1)

     y = (x=d/i)*2; PRINT2(x,y);         (2.3.2)

     y = d * (x=2.5/d); PRINT1(y);       (2.3.3)

     x = d * (y = ((int)2.9+1.1)/d); PRINT2(x,y);    (2.3.4)

}

输出:

x = 2     y = 1       (2.3.1)

x = 1.6   y = 3        (2.3.2)

y = 2            (2.3.3)

x = 0     y = 0           (2.3.4)

解惑2.3 其他类型的转换

2.3.1

初始值:d=3.2,i=2

 

x = (y=d/i) *2
(x = (y=3.2/2) *2)

 

(x = (y=1.6) *2)

3.2是一个double浮点数,2是一个int整数;从数据类型上讲,前者比后者高。因此,它们的商将是一个double浮点数。

(x = 1*2), 此时y=1

y是一个int整数,它是舍弃了1.6的小数部分而得到的。

(x = 2)
2, 此时x=2

 

2.3.2

初始值:d=3.2,i=2

 

y = (x=d/i) *2
(y = (x=1.6) *2)

 

(y = 1.6*2), 此时x=1.6

因为x是一个double浮点数,所以这个赋值操作的结果也将是一个double浮点数。

(y = 3.2)

1.6是一个double浮点数。

3, 此时y=3

y是一个int整数,它是舍弃了3.2的小数部分而得到的。

2.3.3

初始值:d=3.2,i=2

 

y = d * (x=2.5/d)
(y = d * (x=2.5/d) )

 

(y = d * 2.5 / d ), 此时x=2.5/d

因为x是一个double浮点数,所以2.5/d的精确度将得到保留。

(y = 2.5)

 

2, 此时y=2

y是一个int整数,它是舍弃了2.5的小数部分而得到的。

2.3.4

初始值:d=3.2, i=2

 

x = d * (y = ((int) 2.9 + 1.1) / d)

 

(x = d * (y = (2 + 1.1) / d) )

类型转换操作的优先级高于“+”。

(x = d * (y=3.1/d) )
(x = d * (y= 一个小数) )

 

(x = d*0), 此时y=0

不管那“一个小数”是多少,y都将等于0;这是因为那“一个小数”是0到1之间的一个值。

0, 此时x=0

 

类型的混合使用:到目前为止,在同一个表达式里混合使用浮点数和整数会导致令人吃惊的结果的例子我们已经见得够多了。在进行算术运算的时候,最好避免混合使用不同类型的操作数。如果你必须那样做,就应该小心地使用类型转换操作符对有关的操作数明确地进行类型转换。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值