那么,我有这两个问题吗?
#include <stdio.h>
int main(void)
{
float a = 0.7;
if (0.7 > a)
printf("Hi\n");
else
printf("Hello\n");
return 0;
}
这会是什么输出?根据我的说法,它应该是&#34;你好&#34;。
其次,我有,
#include <stdio.h>
int main(void)
{
int a=500,b=100,c;
if (!a >= 400)
b=300;
c=200;
printf("%d %d\n",b,c);
return 0;
}
据我所知,输出应该是,
100 200
因为!一种手段,而不是一种手段,这意味着,一个非500的值与400相比,它可以大于或小于400,那为什么它会是300?
答案 0 :(得分:5)
您没有将浮点变量与浮点值进行比较。你认为你会这样做,但你不是。您正在将float变量与double literal进行比较。
0.7 in C是精确的数学数字0.7,四舍五入到最接近的双精度浮点数。
初始化float a = 0.7时,该双精度浮点数舍入为单精度,结果存储在a中。舍入很可能会改变该值,因此变量a的内容稍微多一点或略小于0.7。
然后你比较变量0.7。一个是四舍五入到单精度,另一个是四舍五入到双精度,所以两者都不同。
作为一项规则,你永远不应该使用浮动而不是双倍,除非你有充分的理由这样做,你可以在被问及时证明这一点。
另一方面,你有多大可能与这里的多个其他海报提出完全相同的问题(完全相同的数字,0.7而不是0.8或0.9或3.14或类似的东西),所以我想你试图让我们在这里做你的功课吧?
答案 1 :(得分:3)
对于第一个示例(浮点值),请注意Float的性质将导致它在数字的末尾包含一些垃圾,大约在第15个有效数字左右。长话短说,一个声明为0.7的浮点数永远不会完全等于0.7的字面值。
还有一个关于Stack Overflow的上一个问题,该问题链接到许多优秀资源,进一步解释:How is floating point stored? When does it matter?
在您的第二个示例中,您正在使用&#39; Not&#39;操作员以一种会产生意外结果的方式。 &#39;不&#39;是一个布尔运算符 - 它变为“假”&#39;将价值转化为真实的&#39;价值和真实的&#39;把价值变成“假”&#39;值。
回想一下,在大多数编程语言中,False被赋值为0,这意味着任何非0值都被视为&#39; True&#39;。
所以你的程序实际上在做的是评估!500,然后比较!500到值400. 500不是0,所以它被视为&#39; True&#39;值为布尔运算符&#39; Not&#39;。 Not True = False,False = 0,所以!500 == 0.(试一试:直接打印!500,看看你得到了什么!)。然后,因为0不等于或大于400,所以你的评估是否在&#39;声明也是假的。
答案 2 :(得分:0)
说明代码1:
如果(0.7 > a)
此处a
是一个浮点变量,0.7
是一个双精度常量。双常量0.7
大于浮点变量a。因此满足if条件并打印'Hi'
示例:强>
#include<stdio.h>
int main()
{
float a=0.7;
printf("%.10f %.10f\n",0.7, a);
return 0;
}
的输出:强>
0.7000000000 0.6999999881
请考虑以下代码:
int main(void)
{
int a = 300, b,c;
if (a>=400)
b=300;
c=200;
printf("%d %d %d\n",a,b,c);
}
<强>解释强>
第1步: int a = 300, b, c;
此处变量a
已初始化为'300'
,变量b
和c
已声明,但未初始化。
第2步: if(a >= 400)
表示if(300 >= 400)
。因此这种情况将会失败。
第3步: c = 200;
此处变量c
已初始化为'200'
。
第4步: printf("%d, %d, %d\n", a, b, c);
它会打印"300, garbage value, 200"
。因为变量b
未初始化。