为什么这个void函数返回一个整数,即使没有return语句?

Kra*_*ash 4 c

此代码打印5即使我没有返回任何内容m().

#include <stdio.h>
int abc();
int main(){
    printf("%d", m());
}

int abc(){
    return 5;
}

void m(){
    abc();
}
Run Code Online (Sandbox Code Playgroud)

该功能也是无效的.那么有人可以解释为什么要打印5个?

Eri*_*hil 7

在C实现中,函数通常通过将值放在为该值指定的处理器寄存器中来返回值.那么可能发生的事情是:

  • 要返回5,abc将5放入该寄存器中.
  • 由于m不返回值,因此不会更改寄存器.
  • main尝试获取返回值时m,它会读取返回值所在的寄存器.由于abc在那里放了5并且m没有改变它,main得到5并打印它.

上述所有内容都不受C标准的保证,并且在编译器执行优化时很容易被破坏,因此它不是您可以依赖的行为.

也就是说,任何质量的C实现都会报告存在冲突类型m,因为它在以下main任何一种中使用:

  • 导致函数返回的隐式声明int,以及稍后与其发生冲突的显式声明(对于1999之前的C版本和C的非标准版本),或者
  • 是不允许使用未声明的函数名称(以后的C标准).