隐式转换有关问题,为什么Double会为0呢喃
隐式转换问题,为什么Double会为0呢喃
void main( )
{ int a;
char s;
long b;
float c;
double d;
a=b=c=d=100/3;
printf ( " a=%d\tb=%ld\tc=%f\td=%lf\n ",a,b,c,d);
a=b=c=d=(10000/3);
printf ( " a=%d\tb=%d\tc=%f\td=%lf\n ",a,b,c,d);
printf ( " a=%d\tb=%f\tc=%f\td=%lf\n ",a,b,c,d);
scanf( "%s ",s);
}
// a=3333 b = 0, c = 0, d=0;
------解决方案--------------------
不会啊
------解决方案--------------------
其中c的值输出时很奇怪啊,如果是
a=b=c=d=100/3;
printf ( " a=%d\tb=%ld\tc=%f\td=%lf\n ",a,b,c,d);
printf ( " a=%d\tb=%f\tc=%f\td=%lf\n ",a,b,c,d);
则输出的是a=33 b=33 c=33.000000 d=33.000000
a=33 b=0.000000 c=0.000000 d=0.000000
但是如果单独输出c的值,如下
a=b=c=d=100/3;
printf ( " a=%d\tb=%ld\tc=%f\td=%lf\n ",a,b,c,d);
printf( "c=%f ",c);
则结果是 a=33 b=33 c=33.000000 d=33.000000
c=33.000000
哪位仁兄能解释一下为什么c的值输出在两种情况下会不一样呢??
------解决方案--------------------
printf ( " a=%d\tb=%f\tc=%f\td=%lf\n ",a,b,c,d);
在b的类型是long时,上面输出结果会有错误。
这个是因为long只有4个字节,而float和double类型在作为参数入栈时,都转化为8个字节,也就是double类型,然后入栈。
而printf的格式 " a=%d\tb=%f\tc=%f\td=%lf\n ",表示先读出4个字节,作为整数(正好读出a的数据)输出,在读出8个字节(b的数据加上一半c的数据)作为浮点数输出(结果不可预料),而后面的数据也都是跨越了两个数据的边界,所以结果都不可预料。
------解决方案--------------------
mathe()解释觉得不错
------解决方案--------------------
lz
这还有一个小错误scanf( "%s ",s);
------解决方案--------------------
printf不是类型安全的,用格式化字符串就是这个缺点。还是用cout吧。
void main( )
{ int a;
char s;
long b;
float c;
double d;
a=b=c=d=100/3;
printf ( " a=%d\tb=%ld\tc=%f\td=%lf\n ",a,b,c,d);
a=b=c=d=(10000/3);
printf ( " a=%d\tb=%d\tc=%f\td=%lf\n ",a,b,c,d);
printf ( " a=%d\tb=%f\tc=%f\td=%lf\n ",a,b,c,d);
scanf( "%s ",s);
}
// a=3333 b = 0, c = 0, d=0;
------解决方案--------------------
不会啊
------解决方案--------------------
其中c的值输出时很奇怪啊,如果是
a=b=c=d=100/3;
printf ( " a=%d\tb=%ld\tc=%f\td=%lf\n ",a,b,c,d);
printf ( " a=%d\tb=%f\tc=%f\td=%lf\n ",a,b,c,d);
则输出的是a=33 b=33 c=33.000000 d=33.000000
a=33 b=0.000000 c=0.000000 d=0.000000
但是如果单独输出c的值,如下
a=b=c=d=100/3;
printf ( " a=%d\tb=%ld\tc=%f\td=%lf\n ",a,b,c,d);
printf( "c=%f ",c);
则结果是 a=33 b=33 c=33.000000 d=33.000000
c=33.000000
哪位仁兄能解释一下为什么c的值输出在两种情况下会不一样呢??
------解决方案--------------------
printf ( " a=%d\tb=%f\tc=%f\td=%lf\n ",a,b,c,d);
在b的类型是long时,上面输出结果会有错误。
这个是因为long只有4个字节,而float和double类型在作为参数入栈时,都转化为8个字节,也就是double类型,然后入栈。
而printf的格式 " a=%d\tb=%f\tc=%f\td=%lf\n ",表示先读出4个字节,作为整数(正好读出a的数据)输出,在读出8个字节(b的数据加上一半c的数据)作为浮点数输出(结果不可预料),而后面的数据也都是跨越了两个数据的边界,所以结果都不可预料。
------解决方案--------------------
mathe()解释觉得不错
------解决方案--------------------
lz
这还有一个小错误scanf( "%s ",s);
------解决方案--------------------
printf不是类型安全的,用格式化字符串就是这个缺点。还是用cout吧。