5

K&R によるThe C Programming Language の123 ページから:

(p++)->x は、x にアクセスした後に p をインクリメントします。(この最後の括弧のセットは不要です。なぜですか?)

->より強いバインドを考えると、なぜ不要なの++ですか?

編集: 与えられた式を と対比してください。++p->x後者は、 ではなく++(p->x)をインクリメントするものとして評価されます。したがって、この場合は括弧必要であり、インクリメントしたい場合は記述する必要があります。xp(++p)->xp

4

5 に答える 5

5

他の可能な解釈は次のとおりです。

p++(->x)

それは何の意味もありません。それも有効ではありません。これを有効な方法で解釈する唯一(p++)->xの可能な方法はです。

于 2013-02-18T22:03:08.060 に答える
4

よりも-> 強力に結合するからです++。(そうではありません、@KerrekSBに感謝します。)

x にアクセスした後、 p をインクリメントします。

したがって、最初に にアクセスxp、次に をインクリメントしますp->これは、 and+演算子の評価順序と完全に一致します。

編集:ああ、これらの編集は...

したがって、あなたが書いたときに何が起こるか++p->xというと、それは asまたは as として解釈される可能性があります(どちらが実際に選択されるかは言語設計の問題であり、K&R は最初のケースのように評価することをお勧めします)。問題は、このあいまいさは の場合には存在しないということです。これは、 としてしか解釈できないためです。他の選択肢 、、およびは、実際には構文的に不正な「式」です。++(p->x)(++p)->xp++->x(p++)->xp(++->x)p(++->)xp++(->x)

于 2013-02-18T21:58:47.333 に答える
3

最大マンチ戦略ではp++->x、次の前処理トークンに分割されます。

pそれから++それ->からx

p++->x式には、後置演算子と後置演算子の 2 つの演算子があり++ます->。どちらの演算子も後置演算子であり、優先順位は同じで、式の解析にあいまいさはありません。p++->xと同等(p++)->xです。

++p->x表現に関しては、状況が異なります。

では++p->x++は後置演算子ではなく、++単項演算子です。C では、後置演算子がすべての単項演算子よりも優先されます。これ++p->xが実際に と同等である理由です++(p->x)

編集:スティーブのコメントの結果として、回答の最初の部分を変更しました。

于 2013-02-18T22:06:19.090 に答える
2

ポストインクリメントとメンバーアクセス演算子はどちらも後置式であり、同じものをバインドします。それらが左側の主式または後置式に適用されることを考えると、あいまいさはあり得ません。

p++->x

postfix-++ 演算子は、その左側の式 (つまり to p) にのみ適用できます。

同様に、->x はその左側の式へのアクセスのみ可能です。これはp++です。その式を as として記述する(p++)必要はありませんが、害はありません。

効果の説明の「後」は、インクリメントとメンバーアクセスの時間的な順序を表していません。p++の結果がインクリメント前の値pであり、その値がメンバー アクセスに使用される値であることのみを表します。

于 2013-02-18T22:05:30.303 に答える
1

式のp++結果は、 の値を持つポインターになりますp。後でその++パートが演奏されますが、表現を解釈する目的で、そこにない場合もあります。->xコンパイラにメンバーのオフセットをx元のアドレスに追加させ、pその値にアクセスさせます。

ステートメントを次のように変更した場合:

p->x; p++;

それはまったく同じことをします。

ここでわかるように、優先順位は実際にはまったく同じですが、実際には問題ではありません。

于 2013-02-18T22:00:58.703 に答える