【发布时间】:2016-02-15 00:17:03
【问题描述】:
在 C 中,当我将此 printf 行:printf("%f\n", 5 / 2); 移动到不同的行时,它的输出会发生变化。有什么想法吗?
代码如下:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int a = 65;
char c = (char)a;
int m = 3.0/2;
printf("%c\n", c);
printf("%f\n", (float)a);
printf("%f\n", 5.0 / 2);
printf("%f\n", 5 / 2.0);
printf("%f\n", (float)5 / 2);
printf("%f\n", 5 / (float)2);
printf("%f\n", (float)(5 / 2));
printf("%f\n", 5.0 / 2);
printf("%d\n", m);
printf("%f\n", 5 / 2);
system("PAUSE");
return(0);
}
输出如下:
A
65.000000
2.500000
2.500000
2.500000
2.500000
2.000000
2.500000
1
2.500000
如果我将printf("%f\n", 5 / 2); 移动到第一行之一(在输出 A 的行和输出 65.000000 的行之间),它将打印 0.000000(这是有道理的)而不是现在的 2.500000。
有什么想法吗?
【问题讨论】:
-
printf("%f\n", 5 / 2);产生未定义的行为。 (整数)除法5 / 2的结果是一个整数操作数,其值为2。您正在尝试以float格式打印它(更不用说编译器在将其传递给printf之前将其扩展为double,因此printf将尝试从堆栈中读取8 个字节的数据,虽然它只保存sizeof(int)字节的数据)。 -
你不能用
%f打印整数,就这么简单。 -
根据 C99 标准关于 printf “如果任何参数不是相应转换规范的正确类型,则行为未定义。” (WG14 N1570,7.21.6.1/p9)。
-
..所以它与 pintf 语句的含义无关,除了当 printf 尝试将整数解释为双精度时堆栈包含不同的(垃圾)值。
-
这是一个愚蠢的问题。您是在问“如果我做了一些定义不明确的事情,结果是什么?”但这是未定义行为的本质,没有保证的结果。