2017-10-16 5 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 - 、演算子の優先度

副作用が1つしかないので、定義されていない動作によって再帰(a--)が間違っているとは思われません。これは、1を減らすことです。この副作用は、私が欲したものです。ありがとう。

+1

'--a'と' a - 'の違いは何ですか? 7行目と8行目に 'recursion'に渡される実際の値を考えてみてください。 – Ryan

+0

' int tmp = a--;再帰(tmp); '< - それはどうですか? – zerkms

+0

'recursion(a - );'回帰(a);を呼び出すたびにaを減少させますが、減少した値はもう使用されません –

答えて

2

--aおよびa--はいずれも、増分の副作用がaです。違いはa--の値がデクリメント前aの値である式--aの値は、デクリメント後aの値であることです。

したがって、後者の場合、同じ値のaが再帰的に関数に渡されます。その結果、スタックオーバーフローを引き起こす無限ループが発生します。

のデクリメントされた値を関数に渡すには、再帰呼び出しにrecursion(--a)を使用する必要があります。

+0

これはなぜそうですか?どうして、aは前の値を減じるのですか?私は説明を見つけることができません。優先順位に関しては、関数呼び出しの前にすべてが最初に実行されます。なぜなら、関数呼び出しはバインディングでなければならないからです。 –

+1

@ChuanyuanLiuどちらの場合でも、 'a'は関数が呼び出される前に常に更新されます。相違点は、_expressions_が異なって評価されるため、 'a - 'の場合に関数に渡される値は、そのコード行が実行された後に 'a'の値と同じではありません。 – Lundin

関連する問題