2017-03-12 40 views
0

代码1: -C代码的区别?

int f(int val) { 
    int x=0; 
    while(val > 0) { 
     x = x + f(val--); 
    } 
    return val; 
} 

代码2: -

int g(int val) { 
    int x = 0; 
    while(val > 0) { 
     x= x + g(val-1); 
    } 
    return val; 
} 

是什么在代码f(3)g(3)执行的区别?


Code 1对我来说很清楚。然后f(3)将继续调用自己,越来越深,当用于跟踪递归函数的空间被填满时,我们得到堆栈溢出错误。

但是,我其实停留在第二码的执行。我跑了它,并有无限循环。

另外,我还读到val--可以写成val-1。那么,我怎么在解释val-1行时出错,因为他们两人的表现都截然不同。

+2

你得到了一个无限循环,因为'val'的值永远不会改变'g'。你会注意到你曾经调试过它。 – StoryTeller

+0

这是一个很好的例子,纸张调试可以有所帮助。在执行的每一步中,写下所有变量的值并决定接下来会发生什么代码。 –

+1

'val - '和'val-1'是两个完全不同的东西。第一个改变'val'的值,但第二个不改变。 –

回答

1

val--相当于val = val -1,因此它将val的值减1并存储新值(递减)。而val -1只是减少并返回新值,而不将其存储在变量val(不实际递减拖尾)中。这就是为什么你有一个无限循环。我建议这些变化:

int g(int val) { 
    int x = 0; 
    while(val > 0) { 
     val = val - 1; 
     x= x + g(val); 
    } 
    return val; 
} 

这里是递减和增加运营商的参考:http://en.cppreference.com/w/cpp/language/operator_incdec

0

val--减少1 VAL并保存它放回VAL,而VAL - 1简单地从VAL减去1这意味着你永远不会逃脱你的while循环。