以下の事実を知りました。
プレフィックスインクリメント (++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はこれを変更しないのですか? (下位互換性以外の理由、または少なくとも変更すると多くの問題が発生する理由)。