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位精度。