检查C中int和float之间的相等性

时间:2014-06-05 18:25:55

标签: c++ c floating-point int equality

我遇到了这段代码:

int x=3;
float y=3.0;
if(x==y)
  printf("x and y are equal");
else
  printf("x and y are not equal");

为什么这段代码打印" x和y相等" ?? 这里如果y = 3.1(比如说),则代码打印" x和y不等于"。 有人请解释一下这是怎么回事。

3 个答案:

答案 0 :(得分:14)

算术类型之间的比较受所谓的通常算术转换(§5/ 9,§5.9/ 2,§5.10/ 1)的约束。强调我的。

  

许多期望算术或枚举类型操作数的二元运算符会导致转换和产生   结果类型以类似的方式。目的是产生一个通用类型,它也是结果的类型。   这种模式称为通常的算术转换,定义如下:

     

- 如果任一操作数是作用域枚举类型(7.2),则不执行任何转换;如果是另一个   操作数的类型不同,表达式格式不正确。

     

- 如果任一操作数的类型为long double,则另一个操作数应转换为long double

     

- 否则,如果任一操作数为double,则另一个操作数应转换为double

     

- 否则,如果任一操作数为float,则另一个操作数应转换为float

     

- 否则,应对两个操作数执行整数促销(4.5)。然后是以下   规则应适用于推广的操作数:

     
    

- 如果两个操作数具有相同的类型,则不需要进一步转换。

         

- 否则,如果两个操作数都有有符号整数类型或两者都有无符号整数类型,则     具有较小整数转换等级类型的操作数应转换为类型     操作数更高的等级。

         

- 否则,如果具有无符号整数类型的操作数的等级大于或等于     另一个操作数的类型的等级,带有符号整数类型的操作数应转换为     具有无符号整数类型的操作数的类型。

         

- 否则,如果带有符号整数类型的操作数的类型可以表示的所有值     具有无符号整数类型的操作数的类型,具有无符号整数类型的操作数应为     转换为带有符号整数类型的操作数的类型。

         

- 否则,两个操作数都应转换为对应的无符号整数类型     带有符号整数类型的操作数的类型。

  

答案 1 :(得分:4)

当你尝试将int与float进行比较时,int首先被转换为float。

所以3 == 3.0f实际测试float(3) == 3.0f,这是真的。

另一方面,3 == 3.1f测试float(3) == 3.1f,这是错误的。

答案 2 :(得分:-2)

在这个问题中,x是一个整数值,而y是一个浮点值...一个整数值和一个浮点值不能等同......所以为了检查相等性,我们必须将float转换为整数,反之亦然。希望这可能有助于清除你的概念