C 中的默认参数提升会导致错误,但我不知道具体原因

问题描述 投票:0回答:1

以下代码示例来自 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;
}

我运行了程序,但它不起作用,但我想知道运行时到底是什么问题导致了它

c types parameters casting implicit-conversion
1个回答
0
投票

问题正是引用中提到的,当需要

double
时,您正在发送
int
值。由于
double
int
不是兼容类型,因此该程序会调用未定义的行为。输出无法以任何方式证明是合理的。

如果您需要知道是什么导致程序的某个执行产生精确输出,您需要参考该过程中使用的硬件和编译器(以及运行环境,如果适用)的文档。

© www.soinside.com 2019 - 2024. All rights reserved.