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