C如何评估这些程序?

时间:2018-07-10 10:04:47

标签: c printf

学习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的历史悠久,我希望有人可能已经问过类似的问题。我搜索了一下。如果有人可以指出我这样的问题,那将是很好的。


如果有人可以对此问题提供更好的标题,我将不胜感激。

2 个答案:

答案 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));