学习C时,我到达了评估数值表达式的位置。
main()
{
printf("%d",4*1/2+3/2*1+2+3.2);
}
在这里,我希望表达式的计算结果为8.2(遵循运算符的层次结构),并且由于它是作为整数打印的,因此在屏幕上打印的值应为8
但是我得到的是26214
。
为什么将此值打印在屏幕上? (无论运行多少次,它都保持不变)。
但是,如果我运行以下代码,
main()
{
int a;
a=4*1/2+3/2*1+2+3.2;
printf("%d",a);
}
我得到了期望值8
。
两种情况之间唯一不同的是在第二种情况下使用int变量并将其打印出来。
这为什么给我正确的答案?
由于C的历史悠久,我希望有人可能已经问过类似的问题。我搜索了一下。如果有人可以指出我这样的问题,那将是很好的。
如果有人可以对此问题提供更好的标题,我将不胜感激。
答案 0 :(得分:1)
第一个版本调用未定义的行为。第二个没有。
当一个操作数是整数而另一个操作数是double时,该整数将转换为double,并且表达式的计算结果为double。由于表达式中包含3.2
,因此它将被评估为最终翻倍。现在,您已经在格式字符串中使用了%d
,但是传递了一个double,这是未定义的行为,因为printf
中相应的参数类型必须匹配。
在第二个示例中,该表达式的计算结果是以前的两倍,但是由于您将其分配给整数,因此它将被截断,这是定义好的行为,您将获得所需的结果。
答案 1 :(得分:1)
您在这里有未定义的行为。您的表达结果是两倍。但是printf需要一个整数值。
第二个示例是不同的,因为存在到int的隐式类型收敛。您可以通过显式强制转换“修复”您的第一个表达式
printf("%d",(int)(4*1/2+3/2*1+2+3.2));