5

以下の事実を知りました。

  • プレフィックスインクリメント (++var_name) の結果は、C の R 値 (少なくとも、C の L 値ではないことは確かです) ですが、C++ の L 値です。

  • 後置インクリメント (var_name++) の結果は、C の R 値です (少なくとも、C の L 値ではないことは確かです)。これは C++ にも当てはまります (結果は prvalue であると言います)。

これらを VS2010 (.cpp および .c) および Ubuntu (gcc および g++) で確認しました。

C++ Standard http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdfの p.109 (5.3.2) に書かれています

プレフィックス ++ のオペランドは、1 を追加することによって変更されるか、bool の場合は true に設定されます (この使用は非推奨です)。オペランドは変更可能な左辺値でなければなりません。オペランドの型は、算術型または完全に定義されたオブジェクト型へのポインターでなければなりません。結果は更新されたオペランドです。それは左辺値であり、...

p.101、(5.2.6)

後置 ++ 式の値は、そのオペランドの値です。...結果は prvalueです。結果の型は、オペランドの型の cv 非修飾バージョンです。5.7 および 5.17 も参照してください。

(ただし、R値とprvalueの違いはわかりません)。

C標準http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdfについては、6.5.3.1に接頭辞++、6.5.2.4に接尾辞が記載されていますが、の説明ですが、明確で明確な答えが得られません。

R値やL値になっている理由が知りたいです。私が知っているのはそれだけです

We can assign a value to a (modifiable) L-value, for example, a variable name. R-value is a value of an expression.

しかし、C と C++ で接尾辞 ++ が L 値ではない理由、および接頭辞 ++ が C ではない理由の詳細はわかりません("postfix ++...store...in一時的なアドレス、それから...」ですが、まだ取得できません)。

もう 1 つの質問は、C と C++ でプレフィックス ++ が異なるのはなぜですか? プレフィックス ++ を L 値にする (C++ で) 多くの利点がありますか? もしそうなら、なぜCはこれを変更しないのですか? (下位互換性以外の理由、または少なくとも変更すると多くの問題が発生する理由)。

4

2 に答える 2

1

C と C++ は異なる言語です。C++ には演算子のオーバーロードがありますが、C にはありません。++演算子は、前置か後置かを問わず、C++ でオーバーロードできる演算子です。C++ にも参照がありますが、C にはありません。

C では、++ii++の両方が左辺値ではない値を生成します。そうしないと、同じシーケンス ポイント境界内で同じスカラーを変更しようとすることで、未定義の動作に違反する可能性があるため、これは望ましいことです。

考察のヒント: C では、カンマ演算子も左辺値ではない値を生成するため、左辺値を「削除」するには、次のようにします。

(0, lvalue)
于 2014-08-15T00:43:45.017 に答える