这段代码导致了一个段错误,但是当我将 x--
改为 --x
时,它打印出了正确的结果。
它们不是一样的吗???
int main()
{
myFunc(5);
return 0;
}
void myFunc (int x) {
if (x > 0) {
myFunc(x--);
printf("%d, ", x);
}
else
return;
}
这段代码导致了一个段错误,但是当我将 x--
改为 --x
时,它打印出了正确的结果。
它们不是一样的吗???
int main()
{
myFunc(5);
return 0;
}
void myFunc (int x) {
if (x > 0) {
myFunc(x--);
printf("%d, ", x);
}
else
return;
}
不,它们不一样。
x--
和 --x
的区别在于返回值是在递减之前还是之后。
在 myFunc(x--)
中,x--
返回旧值。 因此,myFunc()
会重复调用相同的值-> 无限递归。
在 myFunc(--x)
中,--x
返回新值。 因此,myFunc()
每次都会以递减的数字调用-> 没有无限递归。
如果您将 printf
移到函数调用的开头,则更容易看到此情况:
void myFunc (int x) {
printf("%d, ", x);
if (x > 0) {
myFunc(x--);
}
else
return;
}
输出:(当输入为10时)
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, ...
后置递减操作(x--
)在参数计算完成之后进行,因此myFunc
将以同一个值重复调用。而前置递减操作(--x
)在参数计算之前进行,可以按预期运行。
因为--的修改是后缀或前缀。当你调用x--时,它是后缀,因此在调用myFunc之后运行,在这种情况下什么都不做。--x将在myFunc之前被调用,因此会影响x。
x--在使用后递减变量。这就是为什么你总是向函数传递相同的值,该值应递减,但实际上并没有递减,因此函数会重复执行。
printf()
移动到函数调用的开头(就像我的答案中一样),才能使它成为尾递归。 - Mysticial