简单C语言问题:k/3和1.000/3*k有什么区别??

void main()
{double i,j,k;
for(i=0;i<20;i++)
{for(j=0;j<33;j++)
{k=100-j-i;
if(5*i+3*j+k/3==100)
printf("%f %f %f\n ",i,j,k);}
}
}
程序如上,求的事百鸡百钱问题,运行没问题,但如果把:5*i+3*j+k/3==100改成5*i+3*j+1.000/3*k==100,也就是下面的程序,运行后却是一个空白界面,为什么呢?难道k/3和1.000/3*k不是一样的效果吗???我是初学者,谢谢!!!
void main()
{double i,j,k;
for(i=0;i<20;i++)
{for(j=0;j<33;j++)
{k=100-j-i;
if(5*i+3*j+1.000/3*k==100)
printf("%f %f %f\n ",i,j,k);}
}
}
补充一下:括号我加过了
(1.000/3)*k 也是一样空白界面
我用的是TC2.0
谢谢!!!

二者当然不一样,首先分析你的问题吧。
知道为什么是空白吗?? 是因为没有执行printf("%f %f %f\n ",i,j,k);
为什么没有执行它呢?? 是因为if(5*i+3*j+1.000/3*k==100) 不满足
为什么不满足呢? 是因为1.000/3是double类型,结果,0.33333,那么这样你看看还能满足if条件吗。当然不能。更为直观的看: 你可以在if语句的前面加上一条printf("%f\n", 5*i+3*j+1.000/3*k==100) 看看,你就明白了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-04-15
编译器里面可能*比/的优先权要高。 //目前还没发现这样的编译器。

我用的vc++ 6.0, 两种方法都能输出正确的结果。只能说你的编译器不好,可能在程序优化的时候搞错了。
/****************************
k/3 算出来结果是int型的(小数部分会被丢掉)

1.000/3*k算出结果是double型
回答者: wgyygw5 - 总监 八级 4-15 16:00
*******************************/
你可能没看清k的定义,k是double的
第2个回答  2009-04-15
k/3 算出来结果是int型的(小数部分会被丢掉)

1.000/3*k算出结果是double型
第3个回答  2009-04-15
#include<stdio.h>
void main()
{double i,j,k;
for(i=0;i<20;i++)
{for(j=0;j<33;j++)
{k=100-j-i;

printf("%f\n ",k/3);
printf("---------------------\n");

printf("%f\n ",1.000/3*k);

}

}
}
可以看到k/3不等于1.000/3*k这是因为浮点数的精度问题造成的
第4个回答  2009-04-15
不是ls所说的,应该是关系到整形和单精度型的类型问题。
比如说k=1时,k/3因为是整型所以结果为0,舍去小数。
而1.0000/3*k则为0.333333. 单精度保留六位小数。
第5个回答  2009-04-15
这涉及到运算符的优先权问题吧,为了防止优先权问题的发生,我一般使用括号来解决的。这样看着也明显一些。
编译器里面可能*比/的优先权要高。
你可以加个括号试试:(1.000/3)*k