为了账号安全,请及时绑定邮箱和手机立即绑定

请麻烦给解释下

#include<stdio.h>

int a(int b)

{

    int c;//阶乘结果

    if(b<0)

    {

        printf("输入错误!\n");


    }

    else if(b==0||b==1)

    {

        c=1;

    }

    else

    {

        c=a(b-1)*b;

    }

}

    int main()

    {

        int b=5;

        printf("%d\n",a(b));

        return 0;

    }

有以下几个问题想请教下大家:

  1. 由于粗心,没有在自定义函数里面添加return语句,但是发现这样也可以得到正确的结果(从网上了解到在c语言中如果没有return语句,软件会默认为return 0)如果默认为return 0的话,最后的结果不就应该是0吗,怎么答案还是正确的?

  2. 如果把b赋值为负数,由于return 0的关系程序输出的结果会为(输入错误!

    0)怎么把后面的0去除?

正在回答

3 回答

我用VS运行了下 结果是-96  不太明白其中的道理= =..

0 回复 有任何疑惑可以回复我~

我试运行了下你的代码,(虽然现在我对于堆栈概念还不理解)但我尝试将c和d的表达式换了下位置,所得结果似乎验证了你的猜想,但

#include<stdio.h>

int a(int b)

{

    int c=4*b-1;

    printf("%d\n",c);

}

int main()

{

    int b=2;

    printf("%d\n",a(b));

    return 0;

}

这段代码所输出的结果为7,2;这个我就理解不了了。

另:你对问题锲而不舍地精神值得学习

1 回复 有任何疑惑可以回复我~
#1

世末理想乡

我觉得这个第一个数是函数a里c的运算结果,第二个数是函数a中printf函数的返回值。 printf函数的返回值是输出的字符个数。\n算一个字符。你把a函数里的printf函数中的\n去掉就能发现第二个输出的值变成了1。
2018-03-22 回复 有任何疑惑可以回复我~

其实挺有意思的一个问题。先回答我能说清楚的。非void型函数不加return语句绝对错误,没报错是编译器比较宽容,大概在一些编译器那里是错的。
默认return 0是哪里说的能给个链接吗?我觉得return 0是主函数的默认返回值。具体的你再看看。我改成复述以后是输入错误14。你知道指针的概念吗?如果知道的话,先看看指针和函数名之间的关系吧。去掉后面的数字就把主函数里的printf换成a(b)就好了。
5ab238b40001b82303600640.jpg

0 回复 有任何疑惑可以回复我~
#1

慕牧羊6158366 提问者

有意思的是main函数,虽然也没有return语句,但在返回前有一条指令把eax设为0了,也就是编译器自动设置返回0。 https://www.zhihu.com/question/51597277
2018-03-21 回复 有任何疑惑可以回复我~
#2

世末理想乡 回复 慕牧羊6158366 提问者

你看一下这段代码的运行结果,感觉那个人说的不对或者是我对eax寄存器的理解不对。 #include<stdio.h> int a(int b) { int c;//阶乘结果 int d; if(b<0) { printf("输入错误!\n"); } else if(b==0||b==1) { c=1; d=0; } else { c=a(b-1)*b; d=a(b-2)*b; } } 主函数不变。
2018-03-21 回复 有任何疑惑可以回复我~
#3

世末理想乡 回复 慕牧羊6158366 提问者

你可以看一下堆栈的概念,个人认为是取了堆栈顶最后加入的值作为了函数的返回值。这个问题挺好。。。
2018-03-21 回复 有任何疑惑可以回复我~
#4

慕牧羊6158366 提问者 回复 世末理想乡

我试运行了下你的代码,(虽然现在我对于堆栈概念还不理解)但我尝试将c和d的表达式换了下位置,所得结果似乎验证了你的猜想,但 #include<stdio.h> int a(int b) { int c=4*b-1; printf("%d\n",c); } int main() { int b=2; printf("%d\n",a(b)); return 0; } 这段代码所输出的结果为7,2;这个我就理解不了了。 另:你对问题锲而不舍地精神值得学习
2018-03-22 回复 有任何疑惑可以回复我~
查看1条回复

举报

0/150
提交
取消

请麻烦给解释下

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号