由于一些奇怪的原因,我正在复制另一种不使用类型的语言的示例,并且忘了在函数定义参数中添加一个,并且它有效。
#include <stdio.h>
char toChar(n) {
//sizeof n is 4 on my 32 bit system
const char *alpha = "0123456789ABCDEF";
return alpha[n];
}
int main() {
putchar(toChar(15)); //i.e.
return 0;
}
我确信某些标准的大多数编译器的main默认为int(但只返回),对于其他函数,这也是一种行为,或者这个实现是否定义了?这似乎与众不同,我的编译器只是一个稍微过时的GCC端口(MinGW)。
答案 0 :(得分:13)
K&amp; R风格的函数声明:
void foo(n)
int n;
{
}
如果未指定type,则默认为int。这在C89中有效,而不是C99
答案 1 :(得分:5)
@ Erik的答案是正确的,但(IMO)可能会被误解。
你所拥有的是K&amp; R风格的定义,这是完全正确的。由于int
被视为默认类型,如果您有类似foo(n) { }
的内容,则表示默认情况下返回类型和n
的类型均为int
。
C99(主要)删除了“default int”规则,但并未完全删除K&amp; R样式定义。这意味着不再允许上面的定义;要使用与上面相同的类型定义foo
,您仍然可以使用:
int foo(n)
int n;
{
}
即,仍然允许K&amp; R样式定义,但是 do 必须指定返回类型和参数类型,即使类型为int。
然而,这种功能定义是过时的(根据§6.11.7)。它实际上只是为了古代(预标准)代码而被允许。您不希望以这种方式编写新代码,即使它在技术上仍然允许。对于新代码,您显然希望使用原型样式定义:
int foo(int n) {}
对于那些关心此类事物的人来说,K&amp; R风格定义仍然在一些新代码中使用。它的terser风格在代码高尔夫中很有用(使用松散的术语)。
只要我们这样做:@stijn的回答也是正确的。特别是当以这种方式定义函数时(即,K&amp; R样式),所有参数都受默认促销的约束。这意味着如果您传递的小于int
的整数类型,则会在传递之前将其提升为int
,如果您传递float
,则会将其提升为{{ 1}}。
答案 2 :(得分:0)
afaik这称为参数推广。我不记得确切的规则,但它归结为编译器被允许使用 int 作为参数,而他(她?)还不知道函数原型。