Ten błąd pojawia się, gdy ustawimy stałe po lewej stronie operatora =, a zmienne po prawej stronie. Przyjmują więc arr jako rozwiązanie, a strona stopu jest stała, więc ten błąd najprawdopodobniej pojawi się jako ważna wartość L.
ArchnzacJest używana jako dowolny rodzaj zmiennej globalnej i wskazuje użyteczny błąd, który wystąpił podczas wywołania funkcji. Możesz wierzyć różnym kodom błędów w treść nagłówka. Pozwala to dobremu programiście C ocenić zwracane wartości i na podstawie zwrotu z wartością podjąć odpowiednie działania.Arkansas
„lvalue” to cel pracy domowej. „L” oznacza lewą stronę, ponieważ kontynuacja boku jest symbolem. Rvalue to wartość ręki w kolorze i generuje wartość, której po prostu nie można i nie można przypisać bezpośrednio. Jeśli uzyskasz „wymaganą l-wartość”, ta osoba ma słowa, które zwracają r-wartość, gdy l-wartość jest zdecydowanie wymagana.
W modelu konsystentna jest wartością r, ale nie jest wartością l na. A więc:
1 = 2; // Niedobrze wyszkolony, przypisanie rvaluewew; (i + 1) wynosi 2; // Nieprawidłowo utworzony, rvalue z pewnością otrzyma bolgreat.
int i;ja równa się 2;
Zrób to. Zauważ, że możesz zwrócić lwartość z funkcji; Na przykład rodziny mogą uzyskać odniesienie do obiektu, w którym używany jest operator = ().
Jak zauważył Pavel Minaev w komentarzach, może to nie być zwykła definicja l-wartości i r-wartości w danym języku, ale raczej próba poinformowania kogoś, kto ma tu błąd w używaniu r-wartości i gdzie l-wartość jest uważana za niezbędne kryterium. C++ jest tekstem ze względu na wiele szczegółów; Jeśli musisz przybyć oficjalnie, musisz skontaktować się z możliwym przedstawicielem.
Grupy słów lwartość i rwartość nie są powszechnie spotykane w programach C/C++, ale kiedy tak się dzieje, ich znaczenie zwykle nie jest od razu widoczne. Najczęściej terminy te są zawarte w komunikatach o błędach i ostrzeżeniach kompilatora. Przykład kompilacji, jeśli zastosujemy gcc :
Zgadza się, ten kod jest z natury perwersyjny i nie jest to taki, jaki byś pisał, ale jak wspomniano w komunikacie o błędzie lvalue, jest to termin często używany w samouczkach C/C++. Innym przykładem jest kompilacja tego hasła za pomocą f ++ :
Tutaj błąd jest konsekwentnie powiązany z tajemniczą wartością r. Więc co oznacza l-wartość r-wartość w C i C++? To właśnie chcę zbadać, nosząc ten artykuł.
Fortect to najpopularniejsze i najskuteczniejsze narzędzie do naprawy komputerów na świecie. Miliony ludzi ufają, że ich systemy działają szybko, płynnie i bez błędów. Dzięki prostemu interfejsowi użytkownika i potężnemu silnikowi skanowania, Fortect szybko znajduje i naprawia szeroki zakres problemów z systemem Windows - od niestabilności systemu i problemów z bezpieczeństwem po zarządzanie pamięcią i wąskie gardła wydajności.
1. Pobierz Fortect i zainstaluj na swoim komputerze
2. Uruchom program i kliknij „Skanuj”
3. Kliknij „Napraw”, aby naprawić znalezione problemy
int foo () zwraca 2;wew główna () foo () to po prostu 2; Zwraca 0;
testcpp.cpp: działanie w funkcji int & foo ():testcpp.cpp: 5:12: Błąd: Nieprawidłowa inicjalizacja nietrwałego łączaTyp do ćwiczenia z „int &” typu „int”
Praktyczna definicja
Ta sekcja zawiera celowo proste wyjaśnienie l-wartości i r-wartości. Reszta związana z artykułem wyjaśni to.
Który jest przykład jakiegoś dobrego błędu l-wartości?
Błędy l-wartości występują, gdy nowa l-wartość nie jest zmienną, która mogłaby przechowywać jakąś wartość. LValue jest prawidłową stałą (lub) nigdy nie jest zmienną. Są to jednorazowe znaki alfanumeryczne. (5, a, 6,9, $ itd.) Przykład: zamiast ich = 5; w powyższym programie jeśli w którym może być 5 = a; niemniej jednak będzie to błąd LValue. LValue jest zmienną stałą.
lwartość (wartość lokalizatora) reprezentuje obiekt w tym również fakt, że zajmuje identyfikowalną lokalizację (czyli pamięć generuje adres).
rwartość jest odkrywana przez pominięcie, mówiąc, że każde wyrażenie jest dalej lwartością lub rwartością. Tak więc ładna r-wartość, daleka od powyższej definicji głównej l-wartości, jest terminem, który nie oznacza, że obiekt zajmuje identyfikowalną lokalizację, która zawiera pamięć.
Proste przykłady
Powyższe terminy mogą wydawać się niejasne, dlatego bardzo ważne jest, aby właściwie pominąć kilka niezbyt trudnych przykładów.
Załóżmy, że mamy postrzeganą i przypisaną zmienną całkowitą:
Przypisanie oczekuje dowolnej uroczej l-wartości jako swojego lewego operandu, z var prawdopodobnie pomocną l-wartością, ponieważ jest to element identyfikowalny. Kilka następnych elementów jest niepoprawnych w Twoim aktualnym poście internetowym:
Ani stała integer spójrz na ani wyrażenie var + dwa nie są lwartościami (co czyni je rwartościami). W rzeczywistości nie jest to l-wartość, ponieważ obie odpowiedzi są krótkimi wyrażeniami bez dokładnej, możliwej do zidentyfikowania lokalizacji (tzn. firmy te mogły ostatnio tymczasowo ubiegać się o najważniejszą część obliczeń). nie ma znaczenia semantycznego – nie może być miejsca do przypisania.
Zatem znaczenie związane z komunikatem o błędzie w pierwszym kodzie pomniejszej kwoty powinno być jasne. foo zwrot podatku to tymczasowa wartość, która jest bardzo fantastyczną wartością r. Próba przypisania go jest kwitniejącym błędem, jeśli tak, foo () radzi 2; kompilator skarży się, że oczekiwał, że zobaczysz lwartość z pracownikiem przydziału po lewej stronie.
Ocena 1 wysyła jedno wyrażenie do tego, jak obiekt, który istnieje po nim. Kapitał r jest ważną wartością tymczasową, która nie jest przechowywana poza wyrażeniem, które będzie go używać.
Jednak nie wszystkie mapowania do funkcji generycznych connect z wynikami są nieprawidłowe. Na przykład odwołania do C++ umożliwiają to:
Tutaj foo otrzymuje ogromny link, który jest użyteczną wartością, dzięki której można ją przypisać. W rzeczywistości zdolność C++ do akceptowania l cech z funkcji jest ważna dla implementacji innych przeciążonych dostawców. Typowym przykładem jest przeciążenie właściciela haka [] w klasach, które implementują wiele rodzajów dostępu do wyszukiwania. std :: przewodnik wykonuje następujące czynności:
Przypisanie wraz z mymap [10] działa, ponieważ niestałe przeciążenie std :: map :: founder [] zwraca mapę, którą można wyznaczyć.
4 oznacza var; // WINA!(var + 1) równa się 4; // WINA!
int globalvar równa się 20;int i foo () Zapłać, aby mieć zmienną globalną;wew główna () foo () to 10; suwerenny 0;
lwartość oznacza lewy wpis. W szczególności lewa strona zasługuje na przypisanie użytkownika. rvalue oznacza prawdziwą wartość witryny bloga. W szczególności jest to naprawdę zła ocena lub fraza od sprzedającego zlecenie.
Pierwotnie, po otrzymaniu lwartości dla It c, mogło to dosłownie oznaczać „wartości odpowiednie dla lewej strony dowolnego przypisania”. Jednak później, gdy ISO C zawierało jakiekolwiek słowo kluczowe const , definicja ta została poddana wyjaśnieniu. W końcu:
A więc jeszcze jedno wyjaśnienie, jako sposób na dodanie. Nie wszystkie lwartości mogą być nadal dotknięte. Te wartości można zmienić. Formalnie standard C99 staje się wartościami zmiennymi, dla sytuacji w punkcie:
bieżąca lwartość nie ma typu odmiany, nie używa niekompletnego typu, dostarcza nie ma ostatniego kwalifikowanego typu const dodatkowo, jeśli jest to pełna struktura lub unifikacja, n ‘nie ma zdefiniowanego subskrybenta (w tym rekursywnie każdego element lub część wszystkich bezpiecznie zawartych agregatów lub związków) z kwalifikowanym const.
const int oznacza 10; // 'a' to jakaś wartość 1a jest równe 10; // z drugiej strony nie można przypisać!
Konwersja między L-wartościami i R-wartościami
Zazwyczaj konstrukcje języka werbalnego obsługujące obiekty zakładają, że r-wartości są wymagane, mimo że argumenty. Na przykład kupujący z dodawaniem binarnym '+' przyjmuje dwie dostępne rwartości jako punkty i zwraca jedną rwartość:
Jak widzieliśmy wcześniej, a i ymca to dwie wartości L. Dlatego w linii informacyjnej domyślnie przeliczają wartość l na wartość r. Wszystkie l-wartości, które przypadkowo nie są w rzeczywistości tablicami, funkcjami lub niekompletnymi typami i można je zamienić na r-wartości.
I odwrotnie? Czy rwartości można zmienić na lwartości? Oczywiście nie! Prawdopodobnie naruszałoby to charakter rozsądnej l-wartości zdefiniowanej [1].
Z pewnością nie oznacza to, że l-wartości nie mogą być nigdzie jawnie generowane z r-wartości. Na przykład, każdy jednoargumentowy operator '*' (dereferencja) przyjmuje ładne nowe uzasadnienie r-wartości, ale zasadniczo daje wynik l-wartości. Rzuć okiem na ten prawidłowy kod: