让我们考虑以下程序:
#include<stdio.h>
int test(a,b,c)
{
return a+b+c;
}
int main()
{
printf("%dn",test(1,2,3));
printf("%dn",test(1.5,2.2,2.3));
}
我不知道可以在不定义其参数类型的情况下在 C 中指定函数。这是ANSI C的一个功能?有人可以向我解释一下吗?
我认为这是不可能的。但是,我的编译器可以编译这个程序!在什么情况下我可以这样做?
另外,程序行为有点奇怪。当我使用整数值时,该函数会执行我们的预期。但是,当我使用浮点参数时,结果与我的预期大不相同。
如果你使用GCC
编译这段代码,它会显示类似type of 'a' defaults to ‘int’
的警告,因为C
隐式假定参数类型为int
,当未指定时。
添加了不必在函数中指定参数类型的功能,以便向后兼容该语言的旧版本,即该语言的K&R
版本。当GCC
遇到"old style"
函数时,它符合旧K&R C behaviour
这意味着在这种情况下没有警告。
您获得未定义结果的一个可能原因可能是因为调用代码不知道它需要将参数转换为int
,因此传递float
。 然后,您的函数test
读取floats
未复制到的寄存器/堆栈位置,或者接收float
参数的bit
表示形式,并将其视为int
。这两种will
中的任何一个都会导致接收的a, b, c
值不正确。
请注意,如果您显式指定参数的类型,例如int test(int a, int b, int c)
,那么它将对floats
进行类型转换,然后将它们传递给函数,输出5
。