猿问

为什么c语言中自定义一个整形函数没有返回值依然能运行并得到应有的结果?

慕粉1472977826
浏览 3863回答 3
3回答

onemoo

你说的情况是:你的函数有返回类型,但你最后没有写 return XX; ,是吧?如果一个函数声明有返回类型,那么在所有返回的地方都必须return适当的值,否则返回的结果是不确定的! 这就是C标准中所谓的“未定义行为”。所以你的问题的直接答案就是:返回值是不确定的,所以你只是凑巧得到了看似“正确的”结果,这样的代码仍是错的。所谓“未定义行为”,就是C标准对此没有详细规定,其实就是为了让写编译器的人可以灵活实现。 所以如果你非要深究原因,那就必须了解你所用的编译器在你的硬件平台上的的实现细节、查看它编译出的汇编码才能确定。 那么如果你还不了解这些知识,那你也没有必要想这些——这和学习C语言没什么关系,你只需知道:千万不要写未定义行为的代码,即便它们看起来行为是对的。如果你非要听听这是怎么回事,下面我说一个可能:我看了你给出的函数体代码 { int z; if(x>y) z=x;else z=y; }, 这个代码中只有一个local变量z,gcc编译器可能会将z直接存到eax寄存器中,而函数返回这种简单的变量会直接利用eax寄存器传递返回值,所以就刚好将将z返回了...  也许你用的编译器也有类似的行为,所以能得到看似正确的结果。 但千万记住:这绝对是错误的代码!!

Yexiaomo

#include <stdio.h> int max(int x,int y) {      return (x>y ? x:y); } int main(){ printf("%d", max(5,3)); return 0; }抱歉, 以我现在的知识不能回答你的问题, 一开始我以为是 输出 栈顶的值, 又改成下面这个程序, 又解释不通了#include <stdio.h>int max(int x,int y){ }int main(){ printf("%d", max(2,3)); return 0;}结果只输出  1  哈哈哈哈, 我的头大了

Yexiaomo

函数, 定义的时候, 可以定义返回值类型. 但并不是说, 非得在 其他函数中(包括主函数main), 调用时就得 就收这个返回值这个视情况而定...... 需要就接收, 不需要,就不接收最简单的 main() 函数#include<stdio.h> int main() {     return 0; }很明显, 这个函数也没有谁能够就收返回值, 但可以运行......这个, 我刚学脑海中也会出现一些 很奇怪的想法, 等你以后学了多了....就慢慢就知道啦啦啦------------------------------------------分----割-----线--------------------------------------------------------啦啦~~Imcainiao
随时随地看视频慕课网APP
我要回答