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

kas*_*sif 3 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");
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ian 14

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

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

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

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

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

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

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

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

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

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

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

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


fre*_*low 5

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

所以3 == 3.0f实际测试了一下float(3) == 3.0f,确实如此。

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

  • “这是真的”......因为足够小的整数值被准确地表示。 (2认同)