2017-10-16 151 views
0
#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 vs a--,运算符优先级

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

+1

你知道'--a'和'a - '之间的区别吗?考虑第7行和第8行传递给'递归'的实际值。 – Ryan

+0

'int tmp = a--;递归(tmp);'< - 那怎么样? – zerkms

+0

递归(a - );'调用'递归(a);'每次减少a,但减小后的值不再使用 –

回答

2

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

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

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

+0

这是为什么呢?为什么a--是递减前的价值?我找不到解释。根据优先级a--和 - all将在函数调用之前执行,因为它们必须具有约束力。 –

+1

@ChuanyuanLiu无论哪种情况,在函数调用之前'a'总是会被更新。不同之处在于_expressions_的计算方式不同,因此在执行该代码行后,传递给函数的值与“a”的值不同。 – Lundin