在这个 C 程序中,由于某种奇怪的原因,代码中的第 5 行打印了 1.799999,这是没有意义的

Jim*_*one 7 c printf

#include<stdio.h>
void main(){
   printf("%f\n",5/9);  // prints 0.000000
   printf("%f\n",9.0/5.0); // prints 1.800000
   printf("%f\n",5/9);  // prints 1.799999
}
Run Code Online (Sandbox Code Playgroud)

第 5 行值应像第 3 行一样打印 0.000000

我在本地机器和在线编译器中尝试过,结果是相同的

jpa*_*jpa 12

printf("%f\n",5/9); // 打印 1.799999

您正在传递整数值,同时指定双精度浮点格式。实际上,这会导致printf()读取未初始化的内存,其中几乎可以包含任何内容。

在这种情况下,它包含先前打印的剩余部分,1.8并且整数 0 仅替换它的低位,导致值发生微小变化。

打开编译器警告(例如-Wall在 GCC 和 clang 中),您应该会收到类似 的警告warning: format '%f' expects argument of type 'double', but argument 2 has type 'int'

  • 尝试解释未定义的行为时要小心。您可能会给人留下错误的印象,即“在这种情况下”可以依赖您所描述的行为。如果“这个案子”被误解,人们可能会完全误解。 (5认同)
  • @Yunnosch 我同意依赖这种行为是没有意义的。但是在调试时,了解未定义行为通常会产生什么样的影响是非常有用的。“发生了一些奇怪的事情,这可能是由程序中任何地方的未定义行为引起的”的严格解释对于查找错误没有用。 (3认同)

Som*_*ude 9

除法5 / 9是一个整数运算,结果为整数(类型为int)。

格式说明符%f需要一个double值。

格式说明符和参数类型不匹配会导致未定义的行为