函数定义 C

10

可能是重复问题:
C函数语法,在参数列表之后声明参数类型

我在《精通C编程》中看到了以下函数定义的语法

int compare(s1, s2)
    char * s1, *s2;
{
    while (*s1++ == *s2) {
        if (*s2++ == 0) return (0);
    }
    return (*--s1 - *s2);
}

上述定义为什么有效?它可以编译并完美运行,没有任何错误。

我更喜欢以下函数定义的语法

int compare(char * s1,char *s2)
{
    while (*s1++ == *s2) {
        if (*s2++ == 0) return (0);
    }
    return (*--s1 - *s2);
}

我在学院或其他地方学习C语言时,从未见过书中给出的方法,请问是否有人能够阐明书中所述的方法。


5
这是函数声明的旧式和已弃用语法,有时被称为“K&R风格”。 - cnicutar
3
这是一种古老的风格,但在语言中仍然被接受。顺便说一下,我认为“专家级C编程”书籍不应包含return(0) - wildplasser
20年前,仍然很常见的是无法处理第二种语法的编译器。 - Amadan
编译器接受它不会有任何影响(不会与其他语法冲突),因此仍然接受它是一个不错的选择。 - wildplasser
@peoro 很抱歉,但在遭遇这个语法后,我不确定它是书中的错别字还是与旧式C相关。 - Kartik Anand
@peoro 其实我甚至不知道旧的K&R风格C语言存在语法 :) - Kartik Anand
2个回答

6
这个话题之前已经在这里讨论过,它是函数定义的“Kernighan和Ritchie风格”。
现在你应该更喜欢第二种语法,第一种语法由于向后兼容性原因仍被某些编译器接受,但对于所有实际目的来说,应该被视为弃用

1
感谢您的回答,如果有些用户认为这是重复的,我很抱歉。为自己辩护,我从来不知道C语言存在K&R风格的语法,我一直看到的是ANSI C,甚至在互联网上的程序中也有类似ANSI C的语法...所以我脑海中浮现的第一件事就是书中的错别字,我的问题确实是这仍然可以运作的原因。谢谢。 - Kartik Anand
1
@Kartik 不需要道歉!看起来这个问题将被关闭为那个问题的重复,但这不应该被视为侮辱。这并不意味着你问了一个糟糕的问题或其他什么。不知道 K&R 风格是很正常的,这就是我们在这里的原因! - Cody Gray

3
这是早期 ANSI 语法,有时被称为 K&R C。它是 C 语言最初的语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接