「Lvalueが必要です」というエラーメッセージは実際にはどういう意味ですか?
5 に答える
左辺値は、割り当ての左側に表示できるもの、つまり「割り当て可能なもの」です。
したがって、左側が「割り当て可能」でない割り当てを探します。たとえば、これと同じくらい単純なものがそのようなエラーを引き起こす可能性があります
if (0 = foo)
{
}
ここでは、誤って == ではなく = を使用したため、定数に代入しようとしています。
こちらもご覧ください
これは、実装がオブジェクトを期待していることを意味しますが、値または関数を渡しただけです。これは、左辺以外の値を渡した割り当て、または関数以外に適用されたアドレス操作に対して発生します。
Lvalue は「ロケーション値」の略で、メモリ ロケーションとして宣言された、またはメモリ ロケーションを参照するオブジェクトを参照する式を意味しregister
ます。のようなもの42
は、どちらの基準にも一致しない値です。より正式には3つのカテゴリがあります
- 左辺値: オブジェクトの参照。これには、const と宣言されたオブジェクトが含まれます。これは変更不可能な左辺値です。
- 関数指定子: 関数の参照。
printf
は機能指定子ですが、&printf
そうではありません*&printf
。 - その他: 「右辺値」と呼ばれることもあり、標準では「式の値」と記述されています。例としては、
var + 0
(オブジェクトに関連付けられていない値を生成する)、または列挙型の列挙子があります。&printf
このカテゴリに属します。
C99 標準の状態 (6.3.2.1):
Anlvalue
は、オブジェクト型または void 以外の不完全な型を持つ式です。lvalue
評価時に an がオブジェクトを指定しない場合、動作は未定義です。オブジェクトが特定のタイプを持っていると言われる場合、タイプはlvalue
、オブジェクトを指定するために使用されるによって指定されます。変更可能lvalue
とは、lvalue
配列型を持たない、不完全な型を持たない、const 修飾された型を持たない、およびそれが構造体または共用体である場合、メンバー (再帰的にメンバーまたは要素を含む) を持たない です。含まれているすべての集約または共用体の) const 修飾された型。
この名前は、左オペランドが (変更可能) である必要があるlvalue
代入式 に由来します。オブジェクトの「ロケーター値」を表すと考えたほうがよいでしょう。この国際規格では、「式の値」と呼ばれることがあります。E1 = E2
E1
lvalue
rvalue
言い換えれば、lvalue
変更の可能性を見つけることができるものです。変更可能lvalue
とは、実際に変更が許可されているものです。
たとえば、C ステートメントは次のとおりです。
x = 7;
は であるため有効x
ですlvalue
。一方、声明は次のとおりです。
14 = 7;
は課題で見つけられるもの14
ではないため、無効です。
スニペット:
const int x = 7;
変更が許可されていなくても、実際にはlvalue
呼び出されたものを作成します(変更可能な `lvalue ではありません)。x
ほとんどの場合、割り当てられないものに値を割り当てようとしたことを意味します。たとえば、次の両方が原因でエラーが発生する可能性があります。
5 = 5; myObject-> myMethod()= 5;
function(parameter) = value;
可能なコンテナではないものに値を割り当てることができないため、何かをコーディングするとエラーが発生します。