当函数包含printf时,打印递归函数返回值

时间:2017-10-28 15:46:10

标签: c

#include <stdio.h>

int c=0;

int check (int c)
{
    c=c+1;
    if (c<6)
        return check(c);
    printf("%d\n", c);
}

int main()
{
    printf("%d\n",check(c));
}

上面的代码给了我

6
2

作为输出。 6是来自checkf函数里面的printf函数但是我没弄到为什么2.如果我删除check函数里面的printf函数我得到

5

作为输出。任何人都可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

您正在调用undefined behavior。所以它表现得很奇怪。

您必须在check函数中有正确的return语句,因为您应该返回int

同时拥有printf或不拥有它 - 不会改变任何东西 - 它仍然是UB。(在这种情况下)

答案 1 :(得分:0)

我对您发布的代码进行了一些修改,以便明白发生了什么。看起来编译器超出了您的要求,并在return前面加printf("%d\n", c);所以您看到的2是打印6\n时打印的字符数。 check()的最后一次迭代。然后2一直向下传递到main内的原始调用,最终到达控制台窗口。 See this reference

  

[printf返回]传输到输出流的字符数,如果发生输出错误或编码错误(对于字符串和字符转换说明符),则返回负值。

请考虑以下代码。它表现出与您发布的代码相同的行为。

#include <stdio.h>

int check(int c)
{
    int ret = 0;
    c = c + 1;
    if (c < 6)
    {
        ret = check(c);
        return ret;//helps inspect ret
    }
    //looks like the compiler inserts that return statement 
    ret = printf("%d\n", c);// 2 <- number of characters in "6\n".
    return ret;
}

int main()
{
    int c = 0;
    int ret = 0; 
    ret = check(c);//ret comes out == 2. This is the return value of printf
    printf("%d\n", ret);
    getchar();
    return 0;//don't forget this guy!
}

免责声明:即使看起来这是正在发生的事情,也很可能是这样,但这不是捷径,我会指望这种情况发生每次。行为仍然是未定义!最好的办法是正常返回函数。