0

コード セグメントで、この圧縮されていないフォームを見ました。

while(p1>=str1)
 {
  *p2 = *p1;
  p1--;
  p2++;
}

圧縮されたフォームは次のようになります。

 while(p1>=str1)
 {
   *p2++ = *p1--;
 }

コードが行うことは、圧縮されていない形式で明確に示されているように、最初にポインターの内容をコピーしてから、p2 をインクリメントし、p1 をデクリメントしますが、++ の優先順位が C の代入演算子よりも高いとはどのように考えられるのでしょうか? これを強制する () 演算子があると思いましたが、本では正しいです。誰でもこれを説明できますか?ありがとう

4

3 に答える 3

3

優先順位は、コードがどのように解析されるか、つまり が++参照するものに影響を与えるだけです。その理由は次のとおりです。

*p2++ = *p1--;

これと同等です:

(*(p2++)) = (*(p1--));

しかし、 のセマンティクスは++、元の値に評価してから、後で値をインクリメントすることです。したがって、割り当ては と の古い値を使用しp1p2割り当てが実行された後、それらをインクリメントおよびデクリメントします。

于 2012-07-27T15:00:07.200 に答える
1

++および接尾辞演算子は--、それらが含まれているステートメントが実行された後に有効になります。優先順位は、トークンのグループ化方法と、ステートメントの構文ツリー(ここではおそらく間違った語彙を使用しています)の生成方法に影響します。

基本的に*p2++ = *p1--;は、*p2 = *p1; p2 += 1; p1 -= 1;

ただし、post-およびprefix演算子には注意してください。のようなことをすることp2 = p1++ * p1--;は未定義の振る舞いと考えられていると私は信じています。

于 2012-07-27T15:01:01.047 に答える
1

p2++p2式はand notの値を生成しますp2 + 1。インクリメント操作は、シーケンス ポイントで実行されます。

于 2012-07-27T14:59:29.713 に答える