我遇到了这段代码:
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不等于"。 有人请解释一下这是怎么回事。
答案 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转换为整数,反之亦然。希望这可能有助于清除你的概念