--a vs a--,运算符优先级

时间:2017-10-16 01:30:11

标签: c recursion operator-precedence

#include <stdio.h>
#include <stdlib.h>

#define TRUE  1
#define FALSE 0

void recursion (int a) {
    if (a != 0) {
        recursion(--a); //works
        recursion(a--); //does not work
        printf("%d\n", a);
    } 
}

int main (int argc, char *argv[]) {
    printf("start\n");
    recursion(10);
    printf("finished\n");
    return 0;
}

当我递归(a--)时为什么会出现分段错误但是当我递归(-a)时工作正常?

我不认为递归(a--)由于未定义的行为是错误的,因为只有一个副作用,即将a减少1.这种副作用正是我想要的。谢谢。

1 个答案:

答案 0 :(得分:2)

--aa--都有增加a的副作用。不同之处在于,表达式--a的值是递减后a 的值,而a--的值是a的值在递减之前

因此在后一种情况下,a的相同值递归地传递给函数。结果,你有一个无限的递归循环,导致堆栈溢出。

您需要使用recursion(--a)进行递归调用,以便将递减的a值传递给函数。