为什么--x; work和x--给出了递归代码中的seg错误

时间:2012-01-13 03:44:30

标签: c recursion segmentation-fault

这段代码给了我一个seg错误,但当我将x--更改为--x时,它会正确打印。

它们不一样????

int main()
{    
    myFunc(5); 
    return 0;
}

void myFunc (int x) {  
    if (x > 0) {
        myFunc(x--);
        printf("%d, ", x);
    }
    else
        return;
}

4 个答案:

答案 0 :(得分:13)

不,他们不一样。

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, ...

答案 1 :(得分:5)

在评估参数之后,发生后递减操作(x--),因此使用相同的值重复调用myFunc 。在评估参数之前,进行预递减(--x)操作,该操作按预期工作。

答案 2 :(得分:3)

因为 - 的修改是post或pre。当你调用x--时它是post,因此在调用myFunc之后运行,在这种情况下什么都不做。 --x将在myFunc之前调用,因此会影响x。

答案 3 :(得分:1)

x--在使用后递减变量。这就是为什么你传递给你的函数总是相同的值,应该减少,但不是,以及函数重复自己。