表达式int a = 1/2 == 0.25 * 2;为何结果为0?运算符优先级疑问
问题解析:为什么
int a = 1/2 == 0.25 * 2;的结果是0? 首先,咱们先拆解这个表达式的执行逻辑——这里其实不完全是运算符优先级的问题,核心是整数除法的特性和隐式类型转换的细节在起作用。
让我们一步步拆解执行过程:
先计算
1/2:
因为1和2都是整数类型(int),C/C++会执行整数除法——直接舍弃小数部分,只保留商的整数部分。所以1/2的结果是0,而不是你直觉里的0.5。再计算
0.25 * 2:0.25是double类型,整数2会被隐式转换为double类型参与运算,乘法结果是0.5(double类型)。然后执行
==比较:
此时是把整数0和double类型的0.5做比较。整数0会被隐式转换为double类型的0.0,接着比较0.0 == 0.5,显然这个判断结果是false(在C/C++中,布尔值false对应整数0)。最后赋值给
int a:
把false对应的0赋值给int变量a,所以a的最终结果就是0。
补充:关于运算符优先级
其实这里的运算符优先级是符合预期的:*和/优先级高于==,==高于=,执行顺序确实是先算两边的乘除,再做比较,最后完成赋值。你疑惑的根源并不是优先级规则,而是忽略了整数除法和浮点运算的差异。
如果想让1/2得到浮点数结果,你需要把其中一个操作数转为浮点类型,比如写成1.0/2或者1/(double)2,这样结果就是0.5,此时0.5 == 0.5会得到true,a的值就会是1了。
内容的提问来源于stack exchange,提问作者Despair Bear
相关产品推荐
相关产品推荐

