printf("%f\n",x);
x
具有类型long
,但%f
转换器需要一个浮点值(类型double
)。通常,当您将整数传递给需要浮点值的函数时,该值会被静默转换。但是,这仅适用于具有固定数量参数和指示每个参数类型的原型的函数。它不适用于诸如 的可变参数函数printf
,因为编译器没有足够的信息来知道将值转换为什么:格式字符串只能在运行时进行分析。
语言规范未定义该程序的行为:它可以做任何事情。在这种情况下可能发生的事情x
是存储在某个整数寄存器中,并f
存储在某个浮点寄存器中。由于printf
调用正在查找浮点值,因此编译后的代码将查找第一个浮点寄存器。如果您已将浮点值传递给printf
,则参数将最终出现在该寄存器中。但你没有,所以该寄存器中的值是存储在那里的最后一个值:读取的值scanf
。
一个好的编译器会警告你你做错了什么。例如,这是我在编译代码时得到的gcc -O -Wall
:
a.c:2: warning: return type of 'main' is not 'int'
a.c: In function 'main':
a.c:7: warning: format '%d' expects type 'int', but argument 2 has type 'double'
a.c:9: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
a.c:12: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
a.c:15: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
a.c:18: warning: format '%f' expects type 'double', but argument 2 has type 'long int'
我建议配置您的编译器以打印此类警告并注意它们。
要使您的程序正常工作,请在期望的地方传递一个浮点值,或者告诉printf
期望一个整数值。任何一个
printf("%f", (double)x);
或者
printf("%ld", x);