谭浩强《C程序设计(第二版)》中的一道练习题

来源:百度知道 编辑:UC知道 时间:2024/05/23 12:13:19
3.9(1)
题目如下:
求该算术表达式的值:x+a%3*(int)(x+y)%2/4,设x=2.5,a=7,y=4.7
我心算结果是2.75,但当我用如下语句运行时,却得到2.500000的结果。
main()
{
float x=2.5,y=4.7,z;
int a=7;
z=x+a%3*(int)(x+y)%2/4;
printf("%f",z);
}

上述语句是不是有什么不对,我是新手,还有我尝试了给x,y,a赋了不同的值,似乎只有x的值跟上述的z值有关联。
另外,当我单独运行以下语句的时候却得到两个不同的结果
main()
{
float z;
z=2/4;
printf("%f",z); /*结果为0.000000*/
}
main()
{
float z;
z=0.5;
printf("%f",z); /*结果为0.500000*/
}
这个又是为什么呢?难道两个值不一样吗?

x+a%3*(int)(x+y)%2/4,
解释一下:因为括号优先级高,先算括号里的,就是X+Y,然后强制转换成整形数据。+的优先级比%,/,*低,所以先算加号后面的。
x+y=7.5,强制转换后成为7,7余2等于1,1/4=0因为是整形数据,所以加号以后的结果就是0,所以总体结果就是X
z=2/4应该写成z=2.0/4.0,2和4是整形,结果就是整形

(int)这个是强制转换成整型~
(int)(x+y)的结果是整型的7
a%3*(int)(x+y)%2=7%3*7%2=1 ,这个结果也是整型的
1/4的结果自然也是整型~所以0.25要取整,得到0~
所以最后a+1/4=2.500000+0=2.500000
最后的结果是浮点型,是因为在运算中,如果浮点+整型,编译系统会自动把整型转换成浮点,然后再进行运算~

"/"这个符号当你用于2/4时,结果的位数和你的除数和被除数有关,像你用2和4,出来的结果只会保留到小数点前

是类型自动转换的问题,1/4=0,因为你的两个运算的数是整型的,所以运算结果也必须是整型的!!
这样你算算就是2.500000

问问老师关于强制转换的知识, int 和float之间是有强制转换的 ,会丢失数据。