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

C++ 在C中检查int和float之间的相等性,c++,c,floating-point,int,equality,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不相等”。 请有人解释一下这是怎么发生的。当你试图将int与float进行比较时,int首先被转换为float 所以3==3.0f实际上测试了float(3)==3.0f,这是正确的 另一

我遇到了这段代码:

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不相等”。
请有人解释一下这是怎么发生的。

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

所以
3==3.0f
实际上测试了
float(3)==3.0f
,这是正确的


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

算术类型之间的比较受所谓的常用算术转换的影响(§5/9,§5.9/2,§5.10/1)。我的

许多需要算术或枚举类型操作数的二进制运算符会导致转换并产生 结果类型以类似的方式显示。目的是生成一个公共类型,它也是结果的类型。 此模式称为常用算术转换,其定义如下:

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

-如果任一操作数的类型为
长双精度
,则另一个操作数应转换为
长双精度

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

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

-否则,应在两个操作数上执行积分提升(4.5)。接下来 规则应适用于升级的操作数:

-如果两个操作数的类型相同,则无需进一步转换

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

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

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

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


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

当值相等时,表达式
x==y
生成
true
,而
if
-
else
执行第一条
printf
语句。当值不相等时,不会发生这种情况。您是否在问为什么
3
int
值等于
float
3.0
?(仅供参考,将浮点数与任何事物进行相等比较是一个好主意)。@WhozCraig:如果你知道自己在做什么,将浮点数与任何事物进行相等比较是一个好主意。@WhozCraig:不。但是,向人们灌输迷信是确保人们不知道发生了什么的好方法。请注意,由于32位int和32位float都包含其他类型中不存在的值,因此判断32位int和32位float是否代表相同的值可能很棘手。例如,参见和“哪一个是真的”。。。因为足够小的整数值是精确表示的。@Cheersandhth.-Alf我很少使用大于16777216;的数字。)@干杯。-阿尔夫:是的,IEEE754浮点有24位精度。