为什么 C 比较 3 等于 3.0?

Why does C compare 3 as equal to 3.0?

问题是我无法理解计算机最初是如何理解 3 和 3.0 相同的。

我认为 INT 会隐式转换为 FLOAT?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a=3;
    float b=3.0;
    if(a==b)
        printf("s");
    else
        printf("w");
    return 0;
}

我期望代码的输出是 w,但实际输出是 s。 为什么?请给我解释一下电脑的视角

在这个表达式中

a==b

使用通常的算术转换来确定操作数的公共类型。结果整数对象 a 被转换为浮点类型 float.

来自 C 标准(6.5.9 相等运算符)

4 If both of the operands have arithmetic type, the usual arithmetic conversions are performed...

在这种情况下,int 隐式转换为 float 是正确的。一般情况下,在C语言中进行关系运算或二元运算等需要通用类型的操作时,操作数会根据一组规则进行隐式转换,详见here.

从计算机(或者说 C 的实现者)的角度来看,这是为了让事情变得简单。考虑相等运算符 ==。这需要为左右手操作数类型的每种可能组合进行定义。如果我们(例如)有 10 种不同的数据类型,则 == 运算符必须在 10*10=100 种变体中实现以支持所有组合。转换数据类型以使操作数始终具有相同的类型可将 == 运算符的变体减少到 10。

对你的例子的一个评论:通常避免测试与 floatdouble 类型的相等性,因为计算机没有无限精度,四舍五入会导致浮点数预期等于略有不同。

在数字的情况下,反正等号运算符==不代表"Are these two things identical in every way?"的意思是,"Do these two things have the same value?"

整数3和浮点数3.0显然有相同的值,所以if(3 == 3.0)是正确的。

类似地,在 ASCII 机器上,'A' 字符的值为 65,因此 if('A' == 65) 为真,即使字母 A 和数字 65 在第一.