即使我没有在m()
中返回任何内容,此代码也会打印5个。
#include <stdio.h>
int abc();
int main(){
printf("%d", m());
}
int abc(){
return 5;
}
void m(){
abc();
}
该功能也是无效的。那么有人可以解释为什么要打印5个?
答案 0 :(得分:7)
在C实现中,函数通常通过将值放在为该值指定的处理器寄存器中来返回值。所以可能发生的事情是:
abc
将5个放入该注册表中。m
未返回值,因此不会更改寄存器。main
尝试获取m
的返回值时,它会读取返回值所在的寄存器。由于abc
放置了5而m
没有更改它,main
得到5并打印出来。上述任何一项都不受C标准保证,并且在编译器执行优化时很容易被破坏,因此它不是您可以依赖的行为。
也就是说,任何质量的C实现都会报告m
存在冲突类型,因为它在main
中使用:
int
的函数的隐式声明,以及稍后与其发生冲突的明确声明(对于1999之前的C版本和C的非标准版本),或答案 1 :(得分:3)
从C标准的角度来看,您的代码调用未定义的行为(您使用与定义它的类型签名不同的类型签名调用函数)并且可能产生任何可能的输出(或崩溃)或以其他方式意外行事)。
从实现的角度来看,int
可能是通过您的平台/调用约定上的寄存器返回的。所以abc
将其值放入该寄存器中。 m
未触及该注册表,因为m
为void
且未返回任何内容。 main
然后查看寄存器以查找m
的返回值(因为main
认为m
是int
函数)并在那里找到5。< / p>