请麻烦给解释下

来源:5-7 递归函数(一)

慕牧羊6158366

2018-03-21 16:32

#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回答

  • 慕UI0344854
    2018-06-16 18:23:26

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

  • 慕牧羊6158366
    2018-03-22 15:31:36

    我试运行了下你的代码,(虽然现在我对于堆栈概念还不理解)但我尝试将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;这个我就理解不了了。

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

    世末理想乡

    我觉得这个第一个数是函数a里c的运算结果,第二个数是函数a中printf函数的返回值。 printf函数的返回值是输出的字符个数。\n算一个字符。你把a函数里的printf函数中的\n去掉就能发现第二个输出的值变成了1。

    2018-03-22 18:28:04

    共 1 条回复 >

  • 世末理想乡
    2018-03-21 18:51:29

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

    慕牧羊615... 回复世末理想乡

    我试运行了下你的代码,(虽然现在我对于堆栈概念还不理解)但我尝试将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 18:18:33

    共 4 条回复 >

C语言入门

C语言入门视频教程,带你进入编程世界的必修课-C语言

926895 学习 · 21509 问题

查看课程

相似问题