此代码打印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个?
在C实现中,函数通常通过将值放在为该值指定的处理器寄存器中来返回值.那么可能发生的事情是:
abc将5放入该寄存器中.m不返回值,因此不会更改寄存器.main尝试获取返回值时m,它会读取返回值所在的寄存器.由于abc在那里放了5并且m没有改变它,main得到5并打印它.上述所有内容都不受C标准的保证,并且在编译器执行优化时很容易被破坏,因此它不是您可以依赖的行为.
也就是说,任何质量的C实现都会报告存在冲突类型m,因为它在以下main任何一种中使用:
int,以及稍后与其发生冲突的显式声明(对于1999之前的C版本和C的非标准版本),或者