为什么标准允许不返回编译的函数?

nis*_*tjr 5 c c99

即使它的签名说它应该,f()也不会返回.为什么允许这个编译?C标准是否有理由不要求编译器使其失败?

我知道它是未定义的行为和所有,但为什么它首先被允许?有历史原因吗?

double f(){}

int main()
{
    f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

md5*_*md5 4

C 标准不要求编译器使其失败是否有原因?

通过调用未定义的行为,C 标准使编译器变得不那么复杂。确实有一些情况,比如if语句,很难说函数是否有返回值:

int f(int n)
{
  if (n > 0) return 1;
}
Run Code Online (Sandbox Code Playgroud)
  • 如果我写f(5),编译器很容易判断该函数是正确的。
  • 如果我写f(-5),也很容易检测到未定义的返回值。

但是,如果参数来自用户输入,编译器应该如何知道函数是否返回值?由于这可能是一个有效的程序,也可能是一个错误的程序,C 标准允许编译器做他们想做的事情。C 被设计得尽可能智能和简单。

  • @njr:如果一个函数采用“int”,那么强制执行它应该为所有“int”输入定义行为可能是一个坏主意。例如,`int plusone(int i) { return i + 1; }` 对于输入 `INT_MAX` 有未定义的行为。这就是 C 的运作方式,如果您不愿意,它不会强迫您添加代码来处理所有情况。 (3认同)