2010-10-09 12 views
9

Co właściwie oznacza komunikat o błędzie "Wymagana wartość L"?Wymagana wartość l

+0

możliwy duplikat błędu ["wymagany l-wartość"] (http://stackoverflow.com/questions/1353384/l-value-required-error) –

+0

@Paul to o C++. –

Odpowiedz

7

lwartością jest coś, co może pojawić się na lewej stronie przypisania, innymi słowy, „coś, co można przypisać”

Więc szukać cesji gdzie lewa strona nie jest „przypisane” na przykład coś tak proste, jak mogłoby to wywołać takiego błędu

if (0 = foo) 
{ 

} 

Tutaj mamy próbę przypisania na stałe z powodu przypadkowo używając = zamiast ==

Zobacz również

5

Oznacza to, że realizacja oczekuje obiektu, ale po prostu przyjął wartość lub funkcję. Dzieje się tak w przypadku przydziałów, które przeszły nie-lwartość lub operacji adresowych stosowanych do niefunkcyjnych.

L-value oznacza "wartość lokalizacji" i oznacza wyrażenie, które odnosi się do obiektu zadeklarowanego jako register lub do lokalizacji w pamięci. Coś takiego jak 42 jest wartością, która nie pasuje do żadnego z kryteriów. Bardziej formalnie istnieją trzy kategorie:

  • L Wartości: Odwołanie do obiektów. Obejmuje to obiekty zadeklarowane jako const. Takie są niemodyfikowalne wartości l.
  • Oznaczenia funkcji: w odniesieniu do funkcji. printf to nazwa funkcji, ale &printf nie jest, a *&printf jest ponownie.
  • Inne: Czasami nazywane "rwartością" a standardem jest "wartość wyrażenia". Przykładami są var + 0 (z wartością niezwiązaną z obiektami) lub z wylicznikiem wyliczenia. &printf należy do tej kategorii.
0

błąd pojawia się, jeśli kodujesz coś takiego, jak function(parameter) = value;, ponieważ nie możesz przypisać wartości do niczego, co nie jest dla niej możliwym kontenerem.

2

Do C99 stan standardowy (6.3.2.1):


lvalue jest wyrażeniem typu obiektu lub niekompletnym, inne niż pusty; jeśli lvalue nie wyznacza obiektu podczas jego oceny, zachowanie jest niezdefiniowane. Kiedy mówi się, że obiekt ma określony typ, typ jest określony przez lvalue używany do oznaczenia obiektu. Modyfikowalny lvalue to nie ma typu tablicowego, nie ma niekompletnego typu, nie ma typu const-kwalifikowanego, a jeśli jest strukturą lub związkiem, nie ma żadnego członka (w tym rekurencyjnie dowolnego członka lub element wszystkich zawartych agregatów lub związków) o typie stałym.

Nazwa lvalue pochodzi pierwotnie z wyrażenia przypisania E1 = E2, w którym lewy argument E1 jest wymagane a (modyfikowalne) lvalue. Być może lepiej uznać go za reprezentujący obiekt "wartość lokalizatora". To, co jest czasami nazywane rvalue, jest w niniejszym standardzie międzynarodowym opisanym jako "wartość wyrażenia".


Innymi słowy, lvalue jest coś, co można znaleźć na potencjalnie zmienia. Zmodyfikowany lvalue to taki, w którym można zmienić .

Na przykład, oświadczenie C:

x = 7; 

jest ważna ponieważ x jest lvalue. Z drugiej strony, stwierdzenie:

14 = 7; 

nie jest prawidłowy, ponieważ 14 jest nie coś można znaleźć na zadania.

Fragment:

const int x = 7; 

faktycznie stwarza obraz lvalue nazywa x chociaż nie jesteś wolno go zmienić (to nie jest modyfikowalny `lwartość).

+1

wybieranie nitów, ale technicznie może to być również zmienna zadeklarowana za pomocą 'register', więc może nie mieć adresu. –

+0

"if wartość l nie oznacza obiektu podczas jego oceny, zachowanie jest niezdefiniowane._", chyba że zachowanie jest _nie_ niezdefiniowane: '& * (int *) 0;' (sic) – curiousguy

0

Najprawdopodobniej oznacza to, że próbowałeś przypisać wartość do czegoś, do czego nie można przypisać. Na przykład obie następujące czynności prawdopodobnie spowodują ten błąd:

5 = 5; myObject-> myMethod() = 5;

Powiązane problemy