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

时间:2018-03-24 13:07:43

标签: c

即使我没有在m()中返回任何内容,此代码也会打印5个。

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

int abc(){
    return 5;
}

void m(){
    abc();
}

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

2 个答案:

答案 0 :(得分:7)

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

  • 要返回5,abc将5个放入该注册表中。
  • 由于m未返回值,因此不会更改寄存器。
  • main尝试获取m的返回值时,它会读取返回值所在的寄存器。由于abc放置了5而m没有更改它,main得到5并打印出来。

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

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

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

答案 1 :(得分:3)

从C标准的角度来看,您的代码调用未定义的行为(您使用与定义它的类型签名不同的类型签名调用函数)并且可能产生任何可能的输出(或崩溃)或以其他方式意外行事)。

从实现的角度来看,int可能是通过您的平台/调用约定上的寄存器返回的。所以abc将其值放入该寄存器中。 m未触及该注册表,因为mvoid且未返回任何内容。 main然后查看寄存器以查找m的返回值(因为main认为mint函数)并在那里找到5。< / p>