2017-04-07 7 views
1
void base_aux(unsigned int n, unsigned int base, unsigned int x) { 
    if (n > (base - 1)) { 
     printf("%u", n % base); 
     base_aux(n/base, base, x++); 
    } else { 
     printf("%u", n); 
     zero_int(32 - x); 
     printf("\n %d \n", x); 
    } 
} 

私はxがインクリメントしていない理由を知りたいと考えています。私がzero_intと呼んだとき、それはゼロのままです。理由は何ですか?これをどうやって解決するのですか?引数と再帰のインクリメント

+0

'x ++'を '++ x'に変更するとどうなるか見てください – 4386427

+0

ありがとう!違いはなんですか? –

答えて

1

あなたは、このようにあなたはすべての再帰例に同じx値を持つことになり、xの値は呼び出し元のメソッドの範囲内でインクリメント、インクリメントせずに再帰呼び出しに渡されx++で、++xを使用する必要があります。

++の位置は、インクリメントのタイミングを決定します。この場合、メソッド呼び出しで評価される前にインクリメントのタイミングが決定されます。

More on this topic.

-1

あなたが関数の引数としてそれをインクリメントしてみてくださいので、あなたのxが増加されていません。最初にxを増やし、それを関数に渡します。あなたの問題を解決するかもしれません。

 void base_aux(unsigned int n, unsigned int base, unsigned int x) { 
if (n > (base - 1)) { 
    printf("%u", n % base); 
    x=x+1; 
    base_aux(n/base, base, x); 
} else { 
    printf("%u", n); 
    zero_int(32 - x); 
    printf("\n %d \n", x); 
} 
2

あなたは

foo(x++); 

を行うと、あなたが、その後x++戻っxとはxをインクリメントすることを言うことができ

temp = x; 
x = x + 1; 
foo(temp); 

に相当します。それは後置インクリメントと呼ばれます。

は、だからあなたのコード内であなたが行う場合はx

の同じ値を持つ関数を呼び出す保つ

foo(++x); 

あなたが言うことができ

x = x + 1; 
temp = x; 
foo(temp); 

に相当し++xxをインクリメントしてからxを返します。接頭辞増分と呼ばれます。

関連する問題