C 为什么不能将多个参数正确传递给外部函数?

C 为什么不能将多个参数正确传递给外部函数?,c,C,我的程序中有以下代码: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int print_numbers_above(double x, float y, int z) { printf("x=%lf, y=%f, z=%d\n", x, y, z); } int main() { double x = 1.25; float y = 1.25; int z = 3; print_numb

我的程序中有以下代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int print_numbers_above(double x, float y, int z)
{
    printf("x=%lf, y=%f, z=%d\n", x, y, z);
}
int main()
{
    double x = 1.25;
    float y = 1.25;
    int z = 3;
    print_numbers_below(x, y, z);
    print_numbers_above(x, y, z);
    return 0;
}
int print_numbers_below(double x, float y, int z)
{
    printf("x=%lf, y=%f, z=%d\n", x, y, z);
}
\define\u CRT\u SECURE\u NO\u警告
#包括
上面的整数打印(双x,浮点y,整数z)
{
printf(“x=%lf,y=%f,z=%d\n”,x,y,z);
}
int main()
{
双x=1.25;
浮动y=1.25;
int z=3;
打印下面的数字(x、y、z);
打印上面的数字(x、y、z);
返回0;
}
整数打印数字(双x,浮点y,整数z)
{
printf(“x=%lf,y=%f,z=%d\n”,x,y,z);
}
输出:

x=1.25,y=0.000000,z=垃圾

x=1.250000,y=1.250000,z=3

现在,我知道函数print_numbers_below()应该更早声明(或者应该在main之前定义)。
但它不会抛出错误。它假定它是一个外部函数(由于它返回int,所以返回类型没有任何冲突)。 现在,我不明白为什么我不能正确地传递1个以上的参数


(我使用的是Visual Studio 2013)

当您调用编译器尚未看到原型的函数时,它将应用于所有参数。Chars和shorts升级为int,float升级为double。当下面的
打印\u数字\u实际需要一个浮动时,这会中断


如果尚未定义函数,请始终使用原型。

合理的编译器会给您以下错误:

foo.c:12:5: warning: implicit declaration of function 'print_numbers_below' is invalid in C99 [-Wimplicit-function-declaration]
    print_numbers_below(x, y, z);
    ^
foo.c:16:5: error: conflicting types for 'print_numbers_below'
int print_numbers_below(double x, float y, int z)
    ^
foo.c:12:5: note: previous implicit declaration is here
    print_numbers_below(x, y, z);
    ^

“%lf”?这适用于
long double
使用编译器命令行中给出的/ANALYSIS运行编译:)@nos-error.%如果和%f在printf格式中执行完全相同的操作,“但不会引发错误”-则编译器已损坏。至少试着提高警告级别,甚至告诉它警告是错误。@nos P.S.长双精度的格式是%Lf,而不是%Lf。。。请不要发布错误信息。在“更正”某人的代码之前,请确认它确实是错误的,并且您的代码是正确的。对投票错误评论的人也是如此。@user2684198是的,那么呢?int没有提升;浮动有促销活动。有人告诉你:在使用函数之前定义它,或者为它声明一个原型。那么为什么“z”在那里打印一个垃圾值呢?我知道我需要声明一个原型。但我正在准备能力倾向测试。所以我尝试了不同的东西。好的,我知道了。非常感谢:)能力倾向测试包括随机的C类琐事?奇怪的是,如果不解释类型冲突的原因和方式,我觉得这个答案没有什么帮助。