以下代码示例来自 K.N.KING 的《C 编程》。 A Modern Approach”,无法正常工作,输出是1而不是9。作者说这是默认参数提升导致的问题:
调用 square 时,编译器还没有看到原型,因此它不知道 square 需要一个 int 类型的参数。相反,编译器对 x 执行默认参数提升,但没有任何效果。由于它需要一个 int 类型的参数,但已被赋予一个 double 值,
但是他没有给出很具体的解释,我想知道问题到底是怎么发生的?
#include <stdio.h>
int main(void)
{
double x = 3.0;
printf("Square: %d\n", square(x));
return 0;
}
int square(int n)
{
return n * n;
}
我运行了程序,但它不起作用,但我想知道运行时到底是什么问题导致了它
问题正是引用中提到的,当需要
double
时,您正在发送 int
值。由于 double
和 int
不是兼容类型,因此该程序会调用未定义的行为。输出无法以任何方式证明是合理的。
如果您需要知道是什么导致程序的某个执行产生精确输出,您需要参考该过程中使用的硬件和编译器(以及运行环境,如果适用)的文档。