0

これは、関数の引数で副作用を使用する再帰コードです。K&R で、関数が呼び出される前に引数のすべての副作用が有効になることを C 標準が指定しているという記述を見つけました (54 ページ K&R 第 2 版)。しかし、上記に出力します。コードは矛盾していました。誰か助けてください。

void reverse(int* array,int i,int j)
{
  `int temp;
  if(i>j)

    return ;
  else{
    temp=array[i];
    array[i]=array[j];
    array[j]=temp;
    //i++;
    //j--;
    reverse(array,i++,j--);
  }
} '

PS:出力はセグメンテーション違反です

4

2 に答える 2

3

変数が関数呼び出しの前にインクリメントされるのは事実ですが、これらの変数は宣言された関数(この場合は1つの再帰関数呼び出しフレーム)に対してローカルであり、後置演算子を使用すると、によって返される値は演算子は更新された値ではなく、初期値です。その結果、パラメーターとして渡すことになった値は適切に更新されず、関数は終了しません。変数をインクリメントし、同時に更新された値を返し、渡すには、プレフィックス演算子、つまり、を使用する必要が++iあり++jます。

于 2012-06-04T04:53:22.727 に答える
2

すべての副作用が完了するため、関数呼び出しの前に i と j の値が変更されます。

ただし、expressi++j--の値は、以前の i と j の値のままです。

于 2012-06-04T04:07:50.193 に答える