#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
作为输出。任何人都可以解释为什么会这样吗?
答案 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!
}
免责声明:即使看起来这是正在发生的事情,也很可能是这样,但这不是捷径,我会不指望这种情况发生每次。行为仍然是未定义!最好的办法是正常返回函数。