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



出于某种奇怪的原因,我用另一种不使用类型的语言复制了一个示例,并且忘记在函数定义参数中添加一个示例,它起作用了。

#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;
}

我确信某些标准的大多数编译器的主要默认为 int(但仅返回),这是否也适用于其他函数的行为,或者是否定义了此实现?这似乎很不寻常,我的编译器只是一个稍微过时的 GCC 端口 (MinGW)。

K&R 风格的函数声明:

void foo(n) 
    int n; 
{
}

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

@Erik的答案是正确的,但(IMO)很容易被误解。

你拥有的是K&R风格的定义,这是完全正确的。由于int被认为是默认类型,如果您有类似以下内容: foo(n) { } ,这意味着默认情况下返回类型和n类型都是int的。

C99(大部分)删除了"默认int"规则,但并没有完全删除K&R样式定义。这意味着不再允许上述定义;要定义与上述类型相同的foo,您仍然可以使用:

int foo(n)
int n;
{
}

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

然而,这种风格的函数定义已经过时(根据§6.11.7)。实际上,它仍然只是为了古老的(预标准)代码而允许的。您不想以这种方式编写新代码,即使从技术上讲仍然允许这样做。对于新代码,您显然希望使用原型样式的定义:

int foo(int n) {}

对于那些关心这些事情的人来说,K&R风格的定义仍然在一些新代码中使用。它的更简洁的风格在代码高尔夫中很有用(松散地使用术语)。

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

> afaik 这称为参数提升。 我不记得确切的规则,但归根结底,当编译器(她?)还不知道函数原型时,允许使用 int 作为参数。

最新更新