调用一个没有参数的函数,虽然它需要一个[K&R-C]

Joe*_*oey 5 c

这是K&R-C,这里是代码:http://v6shell.org/history/if.c

看看main-Method.有一行"if(exp())".

但函数exp声明为:exp(s).所以它需要一个论点.

为什么这样做?你为什么要这样做?

Jon*_*ler 8

最终,它是Unix V6 shell支持命令中的一个错误if.

该函数的代码是:

exp(s) {
    int p1; 

    p1 = e1();
    if (eq(nxtarg(), "-o")) return(p1 | exp());
    ap--;
    return(p1);
}
Run Code Online (Sandbox Code Playgroud)

函数参数s,隐含的类型int(就像函数iteself),在函数中实际上是未使用的,因此错误是s调用的存在,而不是缺少参数exp().所有具有零实际参数的调用都是正确的.


Ale*_*lex 6

如果你看一下定义:

exp(s) {
    int p1;

    p1 = e1();

    if (eq(nxtarg(), "-o")) return(p1 | exp());
        ap--;

    return(p1);
}
Run Code Online (Sandbox Code Playgroud)
  1. s 未使用
  2. C不需要编译时类型检查.它甚至不需要检查功能参数.一切都是一系列的字节

为什么C不进行任何检查?据我所知,这是因为在C的最初几年,计算机相当薄弱.执行这些检查需要多次扫描源代码,这基本上会使编译时间增加n次.所以它只进行一次传递,并按原样取名,这就是不支持函数重载的原因

因此,如果定义确实s以某种方式使用,那么很可能会在控制台上获得一些可怕的运行时错误