オブジェクト とは、検査が可能で保管場所とすることのできるストレージの領域のことです。左辺値 は、このようなオブジェクトを参照する式です。左辺値は、その指定するオブジェクトの変更を必ずしも許可するわけではありません。例えば、const オブジェクトは、変更が不可能な左辺値です。用語 変更可能な左辺値 は、左辺値によって指定オブジェクトの変更および検査が許可されていることを強調する場合に使 用します。次のオブジェクト・タイプは左辺値ですが、変更可能な左辺値ではありません。
これらの左辺値は変更可能ではないため、代入ステートメントの左辺に置くことはできません。
用語 右辺値 は、メモリー内の同じアドレスに保管されるデータ値を表します。右辺値 は、それに代入する値を持つことができない式です。リテラル定数および変数ともに、右辺値として使用することができます。右辺値を必要とするコンテキストに左辺値が現れる場合、左辺値は暗黙的に右辺値に変換されます。 ただし、この逆は true ではなく、右辺値を左辺値に変換することはできません。右辺値は常に、完全型または void 型を持っています。
ISO C は、関数指定機能
を、関数型を持つ式として定義します。関数指定機能は、オブジェクト型または左辺値とは異なります。
これは、関数の名前、または関数ポインターの間接参照の結果とすることができます。C 言語でも、その関数ポインターとオブジェクト・ポインターの処理を区別しています。
それ以外の場合、関数呼び出しは右辺値式です。C++ では、すべての式の結果は 左辺値、右辺値、または値なしとなります。
C および C++ ともに、演算子のなかには、
自身のいくつかのオペランドとして左辺値を必要とするものがあります。 次の表は、これらの演算子、およびその使用に関する追加の制約事項のリストです。
演算子 | 要件 |
---|---|
& (単項) | オペランドは左辺値である必要があります。 |
++ -- | オペランドは左辺値である必要があります。これは、前置および後置の両形式に適用されます。 |
= += -= *= %= <<= >>= &= ^= |= | 左方オペランドは左辺値である必要があります。 |
例えば、すべての代入演算子は、それらの右方オペランドを評価し、その値を左方オペランドに代入します。左方オペランドは、変更可能な左辺値、または変更可能なオブジェクトへの参照である必要があります。
アドレス演算子 (&) には、オペランドとして左辺値が必要です。
一方、増分演算子 (++) と減分演算子 (--) には、修正可能な左辺値がオペランドとして必要です。以下の例は、式およびその対応する左辺値を示します。
式 | 左辺値 |
---|---|
x = 42 | x |
*ptr = newvalue | *ptr |
a++ | a |
![]() | f() への関数呼び出し |
このセ
クションでの以降の説明は、プラットフォーム固有で、C のみに適用されます。
GNU C 言語拡張を使用可能にしてコンパイルした場合、複合式、条件式、 およびキャストは、そのオペランドが左辺値であれば、左辺値とすることができます。 この言語拡張は C++ コードには使用しないでください。
シーケンスの最後の式が左辺値である場合、複合式を割り当てることができます。 次の式は同じです。
(x + 1, y) *= 42; x + 1, (y *=42);
アドレス演算子は、 シーケンスの最後の式が左辺値である場合に、複合式で適用することができます。 次の式は同じです。
&(x + 1, y); x + 1, &y;
条件式は、その型がボイドでなく、その true と false の 2 つの分岐がともに有効な左辺値である場合に、有効な左辺値とすることができます。 キャストは、オペランドが左辺値である場合に、有効な左辺値となります。主な制約事項は、 左辺値キャストのアドレスを取得することができないことです。
関連参照