左の値?正しい値?
左辺値と右辺値について話している場合、左辺値または右辺値であるというプロパティは式の結果に適用されます。つまり、およびの結果を考慮する必要が--i
ありi--
ます。また、C 言語では、との両方 が右辺値です。したがって、あなたの質問は、C 言語の領域における誤った前提に基づいています。どちらも左辺値ではないことが明確に述べられているため、C99標準を参照してどの点を指摘しようとしているのかわかりません。また、 a を返すことの意味が明確ではありません。いいえ、組み込みの接尾辞は を返しません。--i
i--
--i
i--
void
--
void
--i
との場合の左辺値と右辺値の違いはi--
、C++ にのみ存在します。
いずれにせよ、単なる--i;
andi--;
式のステートメントを見ているのであれば、これらの式の結果を使用していません。あなたはそれらを捨てています。スタンドアロンを使用する唯一のポイント--i
はi--
、その副作用 (の減少i
) です。しかし、それらの副作用は同じであるため、生成されるコードは同じであることが完全に予想されます。
--i
との式の違いを確認したい場合はi--
、それらの結果を使用する必要があります。例えば
int a = --i;
int b = i--;
初期化ごとに異なるコードを生成します。
ただし、この例は、結果の左辺値または右辺値とは何の関係もありません。その側(上で述べたように、C++にのみ存在する)との違いを観察したい場合は、これを試すことができます
int *a = &--i;
int *b = &i--;
最初の初期化は C++ でコンパイルされますが (結果が左辺値であるため)、2 番目の初期化はコンパイルされません (結果が右辺値であり、組み込み単項を右辺値に適用できないため&
)。
この仕様の背後にある理論的根拠はかなり明白です。は の新しい値に評価--i
されるため、この演算子がその結果として自身への参照を返すようにすることは完全に可能です(また、C とは対照的に、C++ 言語は可能な限り左辺値を返すことを好みます)。一方、の古い値を返す必要があります。結果を分析するまでには、それ自体が新しい値を保持している可能性が高いため、 への参照を返すことはできません。の古い値を補助的な一時的な場所に保存 (または再作成) し、次の結果として返す必要があります。i
i
i--
i
i--
i
i
i
i--
. その一時的な値は単なる値であり、オブジェクトではありません。メモリに常駐する必要がないため、左辺値にすることはできません。