In den letzten Tagen haben uns ausgewählte Leser mitgeteilt, dass bei ihnen ein 1-Wert-Fehler aufgetreten ist.
Genehmigt: Fortect
Dieses Problem tritt auf, wenn wir links vom Operator = Konstanten und rechts Variablen setzen. Sie nehmen also arr als unsere eigene Adresse und die Stoppseite ist ebenfalls konstant, der Fehler wird höchstwahrscheinlich als der gesamte erforderliche L-Wert erscheinen.
ArchnzacSie wird dagegen als globale Variable verwendet und weist auf einen wichtigen Fehler hin, der während eines Funktionsaufrufs aufgetreten ist. Möglicherweise möchten Sie verschiedene Fehlercodes in
“lvalue” ist ein gutes Zuweisungsziel. “L” steht für links, da die linke Seite ein Symbol ist. Rvalue ist jeder korrekte Handwert und erzeugt einen Wert, der nicht direkt zugewiesen werden kann und kann. Wenn Sie einen “lvalue erforderlich” erhalten, hat diese Person einen einzigen Ausdruck, der einen rvalue zurückgibt, wenn ein sehr guter lvalue erforderlich ist.
Für das Modell ist eine Hauptkonstante ein r-Wert, aber nicht ihr l-Wert von an. Also:
1 impliziert 2; // Nicht gut trainiert, rvalue-Zuweisungint ich; (i + 1) ist 2; // Falsch gebildet, rvalue erhält bolgreat-Wert.
int i;i ist gleich 2;
Mach es. Beachten Sie, dass Sie sehr wohl einen lvalue von einer Funktion zurückgeben können; Sie können beispielsweise einen Verweis auf ein Problem abrufen, das den Operator = () verwendet.
Wie Pavel Minaev in den Kommentaren betonte, ist das Vorstehende nicht die übliche Definition von lvalues und rvalues in der jeweiligen Sprache, sondern jeder Versuch, jemanden zu informieren, der frustriert in der Verwendung von rvalues ist und wo ein l-Wert würde als notwendiges Kriterium angesehen. C++ ist wegen seiner vielen Details eine Sprache; Wenn Ihre Organisation offiziell kommen möchte, müssen Sie sich an einen ausgezeichneten autorisierten Vertreter wenden.
Die Begriffe lvalue und rvalue werden in der C / C ++-Programmierung nicht häufig entdeckt, aber während Sie es tun, ist ihre Bedeutung normalerweise nicht sofort ersichtlich. Meistens werden diese Begriffe in Compilerfehler- und Warnmeldungen eingefügt. Kompilierungsbeispiel für den Fall, dass Sie mit gcc folgen:
Das ist richtig, dieser Code ist von Natur aus verworren und kaum das, was Sie schreiben würden, aber wie diese lvalue-Fehlermeldung erwähnt, ist es ein Begriff, der wahrscheinlich in C / C ++-Tutorials zu finden ist. Ein weiteres Beispiel ist das Kompilieren dieses Passworts unter g ++ :
Hier wird angenommen, dass der Fehler wieder mit dem kryptischen rvalue zusammenhängt. Was bedeutet also lvalue rvalue in C und C ++? Dies möchte ich in diesem Artikel besprechen.
Genehmigt: Fortect
Fortect ist das weltweit beliebteste und effektivste PC-Reparaturtool. Millionen von Menschen vertrauen darauf, dass ihre Systeme schnell, reibungslos und fehlerfrei laufen. Mit seiner einfachen Benutzeroberfläche und leistungsstarken Scan-Engine findet und behebt Fortect schnell eine breite Palette von Windows-Problemen - von Systeminstabilität und Sicherheitsproblemen bis hin zu Speicherverwaltung und Leistungsengpässen.
int foo () 2 zurücknehmen;int main () foo () ist 2; Gibt 0 zurück;
test.c: Im "main"-Aspekt:test.c: 8: four: lvalue error: als zugänglicher Challenge-Operand erforderlich
Was ist die Definition? hinter dem L-Wert?
Der Wert von l ist tatsächlich einer der folgenden: das Konzept von Bedingungen jeglicher Art; Ein tiefgestelltes ([]) Wort, das wiederum nicht mit einem bestimmten Array übereinstimmt. Unärer schräger Ausdruck (*), der sich nicht auf eine Mischung beziehen kann. Ausdruck des L-Wertes in Klammern.
testcpp.cpp: den ganzen Weg durch int & foo () Funktion:testcpp.cpp: 5:12: Fehler: Fehlerhafte Initialisierung eines nicht persistenten LinksDer Typ at do mit 'int &' vom Typ 'int'
Praktische Definition
Dieser Abschnitt enthält eine bewusst vereinfachte Erklärung von lvalues und rvalues. Die Ruhe. des Artikels wird dies erklären.
Die
Was ist ein Beispiel mit einem lvalue-Fehler?
Lvalue-Fehler treten auf, wenn der Anfänger-Lvalue keine Variable ist, die in einem Wert bleiben könnte. LValue ist eine gültige häufige (oder) keine Variable. Dies sind einmalige alphanumerische Avatare. (5, a, 6.9, $, etc.) Beispiel: statt unter a = 5; im obigen Programm if könnte es vielleicht 5 = a sein; es wäre wahrscheinlich ein LValue-Fehler. LValue ist eine typische Variable.
lvalue (Locator-Wert) stellt das Objekt dar, als Teil dessen der Fakt einen identifizierbaren Urlaubsort belegt (dh der Speicher generiert eine Adresse).
rvalue ist durch Weglassen definiert, was besagt, dass jeder Ausdruck immer entweder ein lvalue oder ein rvalue war. Somit ist der beste große rvalue, weit entfernt von der Definition einer Art von lvalue oben, ein Begriff, der bedeutet und niemals bedeutet, dass ein Objekt eine identifizierbare Position einnimmt, die Speicher trägt.
Einfache Beispiele
Die obigen Begriffe mögen vage erscheinen, daher ist es äußerst wichtig, einige einfache Beispiele richtig wegzulassen.
Angenommen, wir haben eine gesehene und zugewiesene Integer-Variable:
Die Zuweisung hofft auf einen schönen lvalue als linken Operanden, und außerdem ist var wahrscheinlich eine Art lvalue, da es sich um ein identifizierbares Element handelt. Die folgenden Elemente sind auf Ihrer modernen Seite nicht gültig:
Weder die Integer-Konstante zahlreiche noch der Ausdruck var + first sind L-Werte (was sie zu R-Werten macht). Dies ist kein l-Wert, da beide Antworten temporäre Ausdrücke ohne eine exakt identifizierbare genaue Platzierung sind (dh sie könnten kürzlich für den wichtigsten Teil der Berechnung im Momentanregister gewesen sein). es gibt keine semantische Bedeutung – herum ist nirgendwo zuzuordnen.
Damit sollte die Fehlermeldung im ersten Wertschnipsel klar sein. foo levy gibt einen temporären Wert zurück, der ein wirklich guter rvalue ist. Der Versuch, es zuzuweisen, ist ein großartiger effektiver Fehler, wenn dies der Fall ist, schlägt foo () 2 vor; Der Compiler beschwert sich, dass es unvermeidlich ist, einen lvalue mit dem Projektoperator auf der linken Seite zu sehen.
Ein Wert von 1 sendet einen Ausdruck – das Objekt, das danach existiert. Der are-Wert ist ein wichtiger temporärer Wert, der definitiv nicht außerhalb des Ausdrucks gespeichert wird, der ihn verwendet.
Allerdings sind nicht alle Zuordnungen zu generischen Attributaufrufergebnissen ungültig. Die C++-Referenzen machen dies beispielsweise möglich:
Hier wird foo zu einem Link, der ein nützlicher Wert ist, dem er zugewiesen werden kann. Tatsächlich ist die Fähigkeit von C ++ , das Denken von Funktionen zu akzeptieren, wichtig für die Implementierung anderer gefüllter Operatoren. Ein typisches Beispiel ist das Überladen des Landoperators [] in Klassen, die eine Art Suchzugriff verwenden. eine std :: map macht folgendes:
Das Thema von mymap [10] funktioniert, weil es wirklich keine konstante Überladung ist. std :: map :: owner [] gibt eine Karte zurück, die am Ende als zugewiesen.
4 impliziert var; // SCHULD!(var + 1) = 4; // SCHULD!
int globalvar entspricht 20;int & foo () Zahlen Sie für eine globale Variable;int main () foo () ist 10; Kalifornien König 0;
lvalue bedeutet linkes Erscheinungsbild. Insbesondere die linke Seite verdient einen Challenge-Operator. rvalue bedeutet den wahren Wert der Seite. Insbesondere handelt es sich um eine wirklich ungünstige Bewertung oder Formulierung des Auftragsverkäufers.
Geschlechtskrankheiten :: mapmymap;mymap [10] bedeutet 5,6;
Bearbeitbare Werte I.
Ursprünglich wurden lvalues für It c gesetzt, dies könnte durchaus “geeignete Werte für die durch die Zuweisung erstellte linke Seite” bedeuten. Später jedoch, als ISO C das Schlüsselwort const sicher enthielt, wurde diese Definition zur Klärung entwickelt. Immerhin:
Also noch eine Vorsichtsmaßnahme zum Hinzufügen. Nicht praktisch lWerte können beeinflusst bleiben. Diese Werte können verbessert werden. Formal wird der C99-Standard zu veränderlichen Werten, um ein Beispiel zu haben:
const int bedeutet 10; // 'a' ist ohne Frage der Wert 1a gleich 10 ist; // aber trotzdem nicht zuordenbar!
Konvertieren zwischen L-Werten und R-Werten
Typischerweise gehen verbale Sprachkonstrukte in Bezug auf das Operieren von Objekten davon aus, dass rvalues als Argumente abgefragt werden. Zum Beispiel nimmt der Anbieter für binäre Addition '+' zwei verfügbare Rvalues als Gründe und gibt einen Rvalue zurück:
Wie wir alle bereits gesehen haben, sind a und l zwei L-Werte. Daher wandeln sie in der gesamten dritten Zeile implizit die l-Erkennung in den r-Wert um. Alle lvalues, die mit turn vielleicht nicht sind, können Arrays, Funktionen oder unvollständige Typen sein und können ein wenig mehr in rvalues umgewandelt werden.
Und umgekehrt? Können rvalues in lvalues geändert werden? Natürlich im Gegensatz zu! Dies würde wahrscheinlich die Natur des neuen guten lvalues im Sinne von [1] verletzen.
Dies kann nicht bedeuten, dass lvalues nicht ausdrücklich aus rvalues generiert werden können. Zum Beispiel nimmt jeder unäre Worker '*' (Dereferenzierung) ein schönes erfrischendes rvalue-Argument, liefert aber im Wesentlichen ein lvalue-Ergebnis. Sehen Sie sich diesen gültigen Code an:
Beschleunigen Sie jetzt die Leistung Ihres Computers mit diesem einfachen Download.