宋老师,请问如何理解下面的代码? #include <stdio.h> int main(void) { float i = 20.0; float j = i / 7.0; if(j * 7.0 == i) printf("equal\n"); else printf("unequal\n"); return 0; } 打印的结果是 unequal。 #include <stdio.h> int main(void) { float i = 20.0; float j = i / 7.0; float k = j * 7.0; if(k == i) printf("equal\n"); else printf("unequal\n"); return 0; } 这样打印的结果却是 equal。
我以我的理解回答一下1楼的问题 问题显然是编译器对于"j*7.0” 和 k区别对待造成的。 编译器把"j*7.0”的结果保存为double类型,而k是作为float类型声明的。所以结果就是不一样的。 验证如下: 我在你的基础上增加定义了一个k2 double k2 = j * 7.0 然后打印各结果 i is 20.000000000000 j is 2.857142925262 k is 20.000000000000 k2 is 20.000000476837 显然,数值精度是罪魁祸首。
设a=-3, b=-2,则 (a/b)*b+a%b=(-3/(-2))*(-2)+(-3)%(-2)=-3 (-3/(-2))*(-2)=-2 ∵(-3/(-2))*(-2)+(-3)%(-2)=-3 ∴(-3)%(-2)=-3-(-3/(-2)) 即(-3)%(-2)=-3-(-2) =-1 故:%运算符的结果总是与被除数同号(如果不同号就补不回来了)。 不过这样的证明我感觉不怎么严谨,我也没学高数。。。
a%b,b是被除数,我的验证是%运算符的结果总是与除数a同号 gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
我用google计算器算了一下,结果确实如老师所说%运算符的结果总是与被除数同号 我重新验证了一遍,还是如楼上的结果,无法解释,希望老师指点一下
忍不住多说几句 “C99规定,如果a和b是整型,b不等于0,则表达式(a/b)*b+a%b的值总是等于a”和后面的“%运算符的结果总是与被除数同号”是矛盾的 应该是:%运算符的结果总是与除数同号
不能理解。我也用gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)试过了,结果确实与被除数同号。 int main(void) { printf("%d %d\n", 13/(-4), 13 % (-4)); return 0; } 结果是-3 1
看了老师我回答我才认识到真理:除号前面的是被除数,后面的是除数 没有问题了,无脸见人。小学学的都忘了
(a/b)*b+a%b = a 可知: a%b= a - (a/b)*b 当a为正数时, (a/b)*b <= a 则a%b >= 0,与a同号 当a为负数时, (a/b)*b > a a- (a/b)*b < 0 则a%b < 0 与a同号 所以a%b与a两者同号
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!