没有定义类型的函数参数默认为int?我疯了吗?

Ale*_*der 9 c standards function

由于一些奇怪的原因,我正在复制另一种不使用类型的语言的例子,并忘了在函数定义参数中添加一个,并且它有效.

#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;
}
Run Code Online (Sandbox Code Playgroud)

我确信某些标准的大多数编译器的main默认为int(但只返回),对于其他函数,这也是一种行为,或者这个实现是否定义了?这似乎与众不同,我的编译器只是一个稍微过时的GCC端口(MinGW).

Eri*_*rik 13

K&R风格的功能声明:

void foo(n) 
    int n; 
{

}
Run Code Online (Sandbox Code Playgroud)

如果未指定type,则默认为int.这在C89中有效,而不是C99


Jer*_*fin 5

@Erik的答案是正确的,但(IMO)可能会被误解.

你所拥有的是K&R风格的定义,这是完全正确的.因为int被认为是默认类型,所以如果你有类似于:foo(n) { },则表示默认情况下返回类型和类型n都是int.

C99(主要)删除了"default int"规则,但并未完全删除K&R样式定义.这意味着不再允许上面的定义; 要foo使用与上面相同的类型定义,您仍然可以使用:

int foo(n)
int n;
{
}
Run Code Online (Sandbox Code Playgroud)

即,K&R样式定义仍然是允许的,但你必须指定返回类型和参数类型,即使类型是int.

然而,这种功能定义是过时的(根据§6.11.7).它实际上只是为了古代(预标准)代码而被允许.您不希望以这种方式编写新代码,即使它在技术上仍然允许.对于新代码,您显然希望使用原型样式定义:

int foo(int n) {}
Run Code Online (Sandbox Code Playgroud)

对于那些关心此类事物的人来说,K&R风格定义仍然在一些新代码中使用.它的terser风格在代码高尔夫中很有用(使用松散的术语).

只要我们这样做:@stijn的回答也是正确的.特别是当以这种方式定义函数(即,K&R样式)时,所有参数都受默认促销的约束.这意味着如果你传递一个小于的整数类型int,它将int被传递到传递之前,如果你传递一个float,它将被提升为double.