C 您如何解释这段代码输出中的差异?
这段代码给出了意外的输出。当我注释sumdig函数的printf时,a的返回值是6,b是12,但当printf被保留时,a是5,b是6。请解释一下C 您如何解释这段代码输出中的差异?,c,C,这段代码给出了意外的输出。当我注释sumdig函数的printf时,a的返回值是6,b是12,但当printf被保留时,a是5,b是6。请解释一下 main() { int a,b; a = sumdig(123); b = sumdig(123); printf("\na=%d b=%d",a,b); return 0; } int sumdig(int n) { static int s=0; int d; if(n!=0)
main()
{
int a,b;
a = sumdig(123);
b = sumdig(123);
printf("\na=%d b=%d",a,b);
return 0;
}
int sumdig(int n)
{
static int s=0;
int d;
if(n!=0)
{
d=n%10;
n=(n-d)/10;
s=s+d;
sumdig(n);
}
else
return s;
printf("\n s=%d",s);
}
如果没有显式的return语句,int c函数很容易返回上次调用的函数返回的任何值(尽管我认为实际行为尚未定义)。因此 当您打算返回对sumdig的递归调用的值时,您正在返回printf的结果
而不是
sumdig(n)代码>,尝试返回sumdig(n)代码>如果没有显式的return语句,int c函数很容易返回上次调用的函数返回的任何值(尽管我认为实际行为尚未定义)。因此
当您打算返回对sumdig的递归调用的值时,您正在返回printf的结果
而不是sumdig(n)代码>,尝试返回sumdig(n)代码>好的,首先,您应该在编译时尽可能多地发出警告
这将告诉您,尽管sumdig
返回一个值,但至少有一个代码路径不返回任何内容,因此调用者将得到垃圾
其次,您有一个静态变量,它永远不会被重新初始化,因此每次客户端调用都会在s中积累额外的内容。对,首先,您应该使用编译器提供的尽可能多的警告来编译它
这将告诉您,尽管sumdig
返回一个值,但至少有一个代码路径不返回任何内容,因此调用者将得到垃圾
其次,您有一个从未重新初始化的静态变量,因此每次客户端调用都会在s中累积额外的内容。非void函数的每个路径都必须返回一个值。如果没有,我认为在C中,只有使用返回值才是UB,但谁在乎呢?不管怎样,你的编译器没有至少警告过你吗?你在这里到底称什么为意外?添加/删除printf
的效果如何?或者,如果没有printf
两个看似相同的调用返回不同的值,那么非void函数的每个路径都必须返回一个值。如果没有,我认为在C中,只有使用返回值才是UB,但谁在乎呢?不管怎样,你的编译器没有至少警告过你吗?你在这里到底称什么为意外?添加/删除printf
的效果如何?或者在没有printf的情况下,两个看似相同的调用返回不同的值?