5

K&R の TCPL を読んだとき、次の 2 つの表現が理解できませんでした。

*p++ = val;  /*push val onto stack */

ここに私の考えがあります:

  • 逆参照と後置の優先順位は同じで、結合性は右から左です。

    *p++ = val ポインタは通常 top の次の位置であるため、と同じかもしれません*(p++) = val。したがって、このコードでは、括弧のために p が最初に 1 増加するため、p は現在の top の 2 単位上ですが、1 単位上の位置ではありません。現在のトップ、val があるべき場所!!! どうも

4

3 に答える 3

7

前置インクリメント/デクリメントおよび逆参照演算子は同等の優先順位ですが、後置演算子の方が高いため*p++、 と同じです。これは、*(p++)書き込みのようなものです。*p = val; p++;

を書いた場合(*p)++ = val、数値に値を代入しようとするため、コンパイルされません。

于 2013-03-11T18:12:36.737 に答える
4

Precedence and Associativity of Operators in K&R, table 2-1, pg 53 は、Stroustrup, tC++PL,Sed, sec 6.2 Operator summary, p120-121 の最近の表ほど細かく完全ではありません。

C++ 演算子の優先順位 Agnew の回答は優れています。

彼は、連想は確かに単項演算子の場合は R->L であり、*(p++) の場合はそれであると指摘しています。

  1. 最初の p++ が評価されますが、前の p 値が返されます
  2. 次に *p がこの前の p 値で評価され、代入が発生します
  3. 次に、ステートメントが終了し、p++ ポスト インクリメント値がアクティブになります。つまり、ポインター p がバンプされます。
于 2013-06-01T23:41:53.523 に答える
1

演算子の優先順位は、コンパイラによる解釈の順序であり、実行の順序ではありません。

演算子の優先順位は、実際には「括弧を配置する場所」を意味します。*p++したがって、 と同じで正しいです*(p++)。しかし今、私たちは何が何であるかを理解する必要があり*(p++)ます。後置操作のため、をとっ*pてから増やすことを意味p++します。

つまり、要するに、コンパイラによる解釈の順序 (括弧または優先順位によって決定される) と実行の順序 (後置または前置の定義によって決定される) を混在させただけです。

于 2013-03-11T18:31:56.433 に答える