-2

无法找到以下代码的原因:

#include <stdio.h>
int main()
{
    float f = 0.1;
    if (f == 0.1)
      printf("True");
    else
      printf("False");
    return 0;
}

输出为假。

#include <stdio.h>
int main()
{
    float f = 0.1;
    if (f == (float)0.1)
      printf("True");
    else
      printf("False");
    return 0;
}

现在显示正确的输出。这背后的原因是什么?

还有这种行为的原因是什么。

#include <stdio.h>
main()
{
    int n = 0, m = 0;
        if (n > 0)
            if (m > 0)
                    printf("True");
        else 
            printf("False");
}
4

2 回答 2

6

0.1字面意思是double。你在这里失去精度float f = 0.1;

你可以说我们在比较过程中再次失去了精度,那为什么不是f == 0.1真的呢?因为float延伸到double,而不是相反。在 C 中,较小的类型总是扩展到较大的类型。

简化你的例子,我们可以说double(float(1.0)) != 1.0

可能的解决方案:

  • 使用double而不是float作为f.
  • 在你的第二个例子中使用 cast
  • 使用float文字 - 全部替换0.10.1f

更好的解决方案

浮点变量在比较方面有很多问题。它们,包括这个,可以通过定义你自己的比较函数来解决:

bool fp_equal(double a, double b, double eps = FLT_EPSILON) {
  return fabs(a - b) < fabs(eps * a);
}

问题的第二部分:

为什么答案为假是因为else部分总是对应于最里面的if块。所以你被格式化弄糊涂了,代码相当于:

#include <stdio.h>

int main()
{
    int n = 0, m = 0;
    if (n > 0) {
        if (m > 0) {
            printf("True");
        }
        else {
            printf("False");
        }
    }
}
于 2013-08-22T09:59:31.693 回答
2

回答你的第二个问题(第三个例子):

根据您的缩进,代码没有按照您的预期执行:

#include <stdio.h>
main()
{ 
    int n = 0, m = 0;
        if (n > 0)
            if (m > 0)
                 printf("True");
        else 
            printf("False");
}

这里else属于 inner if,所以它等于

#include <stdio.h>
main()
{ 
    int n = 0, m = 0;
        if (n > 0) {
            if (m > 0) {
                 printf("True");
            } else {  
                 printf("False");
            }
        }
}

但我认为你的意思是:

#include <stdio.h>
main()
{ 
    int n = 0, m = 0;
        if (n > 0) {
            if (m > 0) {
                 printf("True");
            }
        } else {  
            printf("False");
        }
}

if这是一个很好的例子,说明为什么要在语句中使用用户括号。

于 2013-08-22T10:19:44.950 回答