将#define常数与相同值的变量进行比较不相等(C语言)

时间:2018-11-22 00:32:09

标签: c

我是C语言的新手。这是我的问题和代码:

我有一个常数和一个具有相同值的变量,我尝试将它们进行比较以检查它们是否相等。在我看来,由于为它们分配了相同的值,因此它们应该相等,但事实并非如此。

#include <stdio.h>
#define mypi1 3.14

int main()
{
    int ans;
    float mypi2 = 3.14;
    if(mypi1==mypi2)
    {
        ans=1;
    }
    else
    {
        ans=0;
    }
    printf("%i",ans);

    return 0;
}

我的输出为0。这表明它们不相等。这背后的原因是什么?这是一个非常简单的问题,但我在任何地方都找不到。请先帮助并谢谢。

1 个答案:

答案 0 :(得分:1)

#define mypi1 3.14
float mypi2 = 3.14;

其中第一个是double类型,第二个是被强制转换为double的{​​{1}}。

表达式float首先将mypi1==mypi2 back 转换为float,然后再进行比较(其想法是,如果一种类型的范围较小,精度高于其他精度,因此将其转换为两种类型都相同)。

因此,如果double语句失败,则很可能在if往返(a)中丢失了信息。

说实话,除非您使用大量的许多浮点值(并且要考虑存储空间),否则您可能应该只在各处使用double -> float -> double。如果要做需要double类型,则将其用于两个值:

float

比较两个#define mypi1 3.14f float mypi2 = 3.14f; 变量将不涉及任何转换。


(a)例如,参见以下完整程序:

float

在此情况下,#include <stdio.h> #define x 3.14 int main(void) { float y = 3.14; // double -> float double z = y; // -> double printf("%.50f\n", x); printf("%.50f\n", z); } xdoublez,经过了上述的往返转换。输出显示可能发生的差异:

double