C 使用比较运算符比较具有相同值的int和float变量时会发生什么情况?

C 使用比较运算符比较具有相同值的int和float变量时会发生什么情况?,c,implicit-conversion,C,Implicit Conversion,使用比较运算符比较具有相同值的int和float变量时会发生什么情况 main( ) { int x = 3 ; float y = 3.0 ; if ( x == y ) printf ( "\nx and y are equal" ) ; else printf ( "\nx and y are not equal" ) ; } output : x and y are equal What happens when

使用比较运算符比较具有相同值的int和float变量时会发生什么情况

 main( )
  {
    int x = 3 ;
    float y = 3.0 ;
    if ( x == y )
      printf ( "\nx and y are equal" ) ;
    else
      printf ( "\nx and y are not equal" ) ;
   }




output : x and y are equal
What happens when x is compared with y variable?

int
隐式转换为
float
类型;您的代码相当于

if ((float)x == y)

请注意,即使从
int
float
的转换失去了精度(在您的情况下不是这样),也会发生这种情况。

一条好的一般规则是,您永远不应该比较浮点数以获得精确的相等性。著名的是,外观简单的代码片段

float f1 = 1.1, f2 = 2.2;
float f3 = 3.3;
if(f1 + f2 == f3) printf("expected\n");
else printf("surprise\n");
很可能表现得出人意料。原因是大多数实数(包括普通的小数部分,如
1.1
)不能用有限宽度的浮点表示法精确表示

当然,有些数字可以精确表示。特别是,即使在低精度浮点表示法中,小整数通常也可以精确表示。因此,为了重申您的示例,代码如下

int x = 3;
float y = 3.0;
if(x == y) printf("expected\n");
else printf("surprise\n");
几乎可以保证在任何实用计算机上打印预期结果

确切地说,它是如何工作的?C支持混合模式算法。即使
x
y
有不同的类型,您也完全可以编写类似
x==y
的内容。通常情况下,编译器会插入对公共类型的隐式转换。因此,当您编写
x==y
时,编译器会对自己说。“嗯。我没有指令来比较int和float是否相等。但是如果我将int转换为float,我将有两个float,然后我可以使用机器的单精度浮点相等比较运算符。因此,我将假装表达式是
(float)x==y

但一般规则仍然有效。浮点变量可以精确地存储一个小整数,如
3.0
(或精确的分数,如
0.5
),这并不意味着它可以精确地存储所有整数。例如,类似的代码

long int x = 123456789;
float y = 123456789.0;
if(x == (long int)y) printf("expected\n");
else printf("surprise\n");

很可能再次打印出令人惊讶的结果。

对于一个普通类型,至少存在一个值。您测试过吗?你在问发生了什么,难道你没有一个编译器来测试它吗?这是完全合法的代码,不需要任何未定义的行为(至少对于文字
3.0