C:使用变量后声明变量的效果/意义是什么?

C:使用变量后声明变量的效果/意义是什么?,c,syntax,C,Syntax,我正在阅读,遇到了一段我不太理解的示例代码(图3.*) 图3.1: compile(s) char *s; { ... } compile(s) char *s; { if (match(s, "pattern")) { compile("bug"); return; } ... } compile(s) char *s; { if (match(s, "pattern1")) { compile("bu

我正在阅读,遇到了一段我不太理解的示例代码(图3.*)

图3.1:

compile(s)
char *s;
{
    ...
}
compile(s)
char *s;
{
    if (match(s, "pattern")) {
        compile("bug");
        return;
    }
    ...
}
compile(s)
char *s;
{
    if (match(s, "pattern1")) {
        compile("bug1");
        return;
    }
    if (match(s, "pattern2")) {
        compile("bug2");
        return;
    }
    ...
}
图3.2:

compile(s)
char *s;
{
    ...
}
compile(s)
char *s;
{
    if (match(s, "pattern")) {
        compile("bug");
        return;
    }
    ...
}
compile(s)
char *s;
{
    if (match(s, "pattern1")) {
        compile("bug1");
        return;
    }
    if (match(s, "pattern2")) {
        compile("bug2");
        return;
    }
    ...
}
图3.3:

compile(s)
char *s;
{
    ...
}
compile(s)
char *s;
{
    if (match(s, "pattern")) {
        compile("bug");
        return;
    }
    ...
}
compile(s)
char *s;
{
    if (match(s, "pattern1")) {
        compile("bug1");
        return;
    }
    if (match(s, "pattern2")) {
        compile("bug2");
        return;
    }
    ...
}
chars[]的含义是什么
编译之后


另外,为什么有一块代码不属于函数初始化或if/else/while/do语句?

这是声明参数类型的K&R风格

名为compile的函数接受名为s的参数,其类型为char[],并返回一个int

很可能是旧代码

现在人们会用这样的东西

int compile(char *s)
{
}

这是一种陈旧的语法,用于声明函数的参数类型。在包含函数及其参数名称的行之后,但在开始函数体的大括号之前声明参数类型

compile(s)
    char *s;
{
    /* function body goes here */
}
这种奇怪语法的原因是它是从C的前身演变而来的,C没有任何类型声明:变量是一个机器字(“单元”),正确使用它取决于程序员。请参阅中的“B的问题”。如果没有类型,要定义函数,只需编写

compile(s)
{
    /* function body goes here */
}
在早期的C中,参数声明是可选的,因此现有代码可以继续工作。如果未声明某个对象的类型,则默认为
int

此声明语法是C语言第一个版本的一部分,以关于C的开创性著作Brian Kernighan和Dennis Ritchie的作者命名。在20世纪80年代末和90年代,有一种语言逐渐向新版本或C89或C90过渡(1989年和1990年是规定新版本语言的ANSI和ISO标准出台的年份)。ANSI C的主要变化之一是函数参数的声明方式。在1990年后的C语言中,您可以直接在括号内声明参数的类型,还可以声明函数的返回类型(从C99开始,这是强制性的,尽管如果省略返回类型,许多编译器仍然假定
int


我看到
char*s不是
chars[]char*s
char*s[]
除了函数参数之外都不同。@Achal作为函数参数(并且仅作为函数参数)是相同的。同意@SteveSummit请删除第一行中的分号。它们不在链接文件中。
compile(s)后没有分号。请逐字复制这些例子。@JohnBollinger在链接的文章中,没有分号,所以这个答案是正确的。我在投票。@tos,所提出的问题的答案是错误的,但在意识到问题没有准确引用来源后,我已经颠倒了我的DV。@JohnBollinger确实如此。然而,我认为这是对OP含义的回答。:)@tos-1,如果OP的实际要求明显不同,那么OP的意思并不重要。“当其他人经过,看到问题的当前形式,并认为这个答案正确地回答了这个问题时,会发生什么?”约翰。你认为什么是错误的?