C如何评估这些程序?

C如何评估这些程序?,c,printf,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); }

在学习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语言是史前的,我想可能有人已经问过类似的问题了。我找了一点。如果有人能给我指出这样一个问题,那就太好了


如果有人能为这个问题提供一个更好的标题,我将不胜感激。

第一个版本调用未定义的行为。第二个没有

当一个操作数为整数,另一个操作数为双精度时,该整数将转换为双精度,表达式的计算结果将为双精度。因为表达式中有3.2,所以它的计算结果最终将加倍。现在有%d个格式字符串,但传递了一个double,这是未定义的行为,因为printf中相应的参数类型必须匹配


在第二个示例中,表达式的计算结果与前面一样是双精度的,但由于您将表达式赋给integer,因此它将被截断,这是一种已定义的行为,您将得到所需的结果。

这里有未定义的行为。您的表达式结果是双重的。但是printf需要一个整数值

第二个例子不同,因为存在到int的隐式类型converrison。您可以通过显式cast修复第一个表达式

  printf("%d",(int)(4*1/2+3/2*1+2+3.2));

在启用警告的情况下编译-Wall,所有内容都将被清除。我已删除编译器错误标记。编译器100%正常,您的代码不正确。您的C语言书或printf文档怎么样?通过最简单的搜索可以找到的%d转换类型说明符不清楚?如果您的编译器没有就不正确的格式说明符(如“printf”)向您发出警告:格式字符串“%d”需要类型为“int”的参数,但是变量参数1的类型为“double”,或者正确的形式为int main,您应该调整设置或使用更好的编译器。但是double不应该降级为整数,以便C可以按指定的方式打印吗?不,printf没有任何方法确定。它完全取决于格式字符串来确定类型。这就是为什么当参数计数和/或类型与格式字符串不匹配时会出现这种情况。因此,如果格式类型不匹配,则C变得异常?是的,如果它们不匹配,则行为未定义,这意味着可能会发生任何情况。你不能在程序中调用UB。你说的UB是什么意思?我想我明白了。谢谢