即使它的签名说它应该,f()也不会返回.为什么允许这个编译?C标准是否有理由不要求编译器使其失败?
我知道它是未定义的行为和所有,但为什么它首先被允许?有历史原因吗?
double f(){}
int main()
{
f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C 标准不要求编译器使其失败是否有原因?
通过调用未定义的行为,C 标准使编译器变得不那么复杂。确实有一些情况,比如if语句,很难说函数是否有返回值:
int f(int n)
{
if (n > 0) return 1;
}
Run Code Online (Sandbox Code Playgroud)
f(5),编译器很容易判断该函数是正确的。 f(-5),也很容易检测到未定义的返回值。但是,如果参数来自用户输入,编译器应该如何知道函数是否返回值?由于这可能是一个有效的程序,也可能是一个错误的程序,C 标准允许编译器做他们想做的事情。C 被设计得尽可能智能和简单。