0
void reverse(char *s,int j,int i) {
      printf("%d\t%d\n",i,j);
      if(i<j) {
        swap(s, i, j);
        reverse(s,--j,++i);
      }
    }

関数呼び出しでポストインクリメント演算子を使用すると問題が発生する可能性があることを Stack Overflow で読みましたが、関数呼び出しでプリインクリメントを使用することも間違っていますか??

助けてください。

4

2 に答える 2

4

インクリメント演算子は、同じシーケンス ポイント (ステートメント) 内の同じ変数を変更すると、未定義の動作を引き起こします。たとえば、次のような関数を呼び出した場合: foo(++i, ++i)C 標準ではインクリメントを実行する順序が規定されておらず、関数に何が渡されるかを予測できません。

ここではそうではないので、プログラムのセマンティクスは明確に定義されています。つまり、i と j がインクリメントされてから、それらの値が関数に渡されます。

于 2013-07-21T13:02:15.737 に答える
1

あなたが書いた関数で私が目にする唯一の問題は、条件 i!=j を使用していることです。これにより、偶数長の文字列で問題が発生する可能性があります。
文字列の長さ = 4 の場合を考えると、reverse(s,3,0)-> reverse(s,2,1)->reverse(s,1,2) として関数呼び出しが行われるため、次のことができます。 'i' が 'j' と等しくなることはなく、ループが終了しないことを確認してください。代わりに、j が負になり、i が文字列の長さよりも大きくなると、メモリの一部にアクセスするときに実行時エラーが発生する可能性があります。することは許可されていません。これが理にかなっていることを願っています。:)

于 2013-07-21T14:07:30.223 に答える