谜题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=1.6) *2) | 3.2是一个double浮点数,2是一个int整数;从数据类型上讲,前者比后者高。因此,它们的商将是一个double浮点数。 |
(x = 1*2), 此时y=1 | y是一个int整数,它是舍弃了1.6的小数部分而得到的。 |
(x = 2) |
2.3.2
初始值:d=3.2,i=2 | |
y = (x=d/i) *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 * 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*0), 此时y=0 | 不管那“一个小数”是多少,y都将等于0;这是因为那“一个小数”是0到1之间的一个值。 |
0, 此时x=0 |
类型的混合使用:到目前为止,在同一个表达式里混合使用浮点数和整数会导致令人吃惊的结果的例子我们已经见得够多了。在进行算术运算的时候,最好避免混合使用不同类型的操作数。如果你必须那样做,就应该小心地使用类型转换操作符对有关的操作数明确地进行类型转换。