1

このベロプログラムを実行すると、5無限に印刷されます。なんで?デクリメントが発生していないためですか、それともデクリメントが発生する前に関数呼び出しが発生していますか?

別の方法で作成してみましたが、fun(--n)正しい答えが得られました。しかし、なぜそれが機能しないのfun(n--)ですか?

void fun(int n)
{
    if(!n)
    {
        cout << n << " " << endl;
    }
    else
    {
        cout << n << " "<<endl;
        fun(n--);
    }
}

int main()
{
    int n = 5;
    fun(n);
system("pause");
return 0;
}
4

7 に答える 7

3

foo( n-- )が返されてから 1 ずつn減少することに注意してください (これを参照)。したがって、5、5、5、... が返されます。次のいずれかを実行する必要があります。n

foo( --n ); // or,
foo( n - 1 );

...したがって、コードは次のようになります。

void fun( int n ) {
  if( !n ) {
    cout << n << " " << endl;
  } else {
    cout << n << " "<< endl;

    n--;
    fun( n );
  }
}

int main( void ) {
  int n = 5;

  fun( n );
  system("pause");

  return 0;
}

余談:別の式内にインクリメントまたはデクリメント操作を含めないことをお勧めします。次のことを行っていれば、問題ありませんでした。

n--;
foo( n );

...式内でインクリメントとデクリメントを開始すると、クライアントとして (さらにはプログラマーとしても) 混乱を招く可能性があります。これは、そうすることが悪い考えである別の例と考えてください。

if ( ( condition_1 == true ) && ( i++ == val ) )

...最初の条件が である場合false、2 番目の条件に達することはなく、増分されませんi

于 2013-08-14T07:45:44.657 に答える
3

なぜなら、値を指定してfun(n--);呼び出してからデクリメントすることを意味ます。funnn

于 2013-08-14T07:44:58.753 に答える
3

その値をデクリメントする前にn--戻るためです。そのように関数を呼び出しているため、常に同じ値が付属しています。あなたはそのように書くことができます:n nfunc(n--)

int temp = n;
n = n - 1;
func(temp);
于 2013-08-14T07:45:24.230 に答える
2

試す :

void fun(int n)
{
    if(!n)
    {
        cout << n << " " << endl;
    }
    else
    {
        cout << n << " "<<endl;
        fun(--n);
    }
}
于 2013-08-14T07:47:12.913 に答える
2

fun(--n)の代わりに使用fun(n--)

これがこのように発生する理由はn--、関数が実行された後のデクリメントが、--n前のデクリメント中に繰り返し 5 を返すためです。

于 2013-08-14T07:45:32.780 に答える
1

前の呼び出しで提供されたものと同じ値を fun() に提供します。

于 2013-08-14T07:45:55.430 に答える