Warum gibt mein Bedingungsoperator einen Fehler?

8
%Vor%

Dieser Code gibt mir einen Fehler. Ich denke, das liegt daran, dass der bedingte Operator den Wert von a oder b basierend auf der Bedingung zurückgibt, sodass der Wert nicht als Lvalue verwendet werden kann. In meinem Fall ist 22 = 222, also ist es ein Fehler.

%Vor%

Der Compiler gibt auch in diesem Fall einen Fehler aus. Nach meiner Annahme, wie im vorherigen Fall, gibt es hier einen Wert von i oder j zurück. Also 0x123 = & amp; a; [Lassen Sie 0x123 ist die Adresse in j gespeichert]. Ist nicht gültig?

An dieser Stelle habe ich eine Suche vorgenommen. Und ich versuchte 0x123 = &a; , aber der Compiler wirft immer noch einen Fehler. Ich denke, der Compiler erlaubt mir nicht, Speicherorte aus Sicherheitsgründen zu ändern.

Bitte lassen Sie mich wissen, dass alle meine Annahmen gültig sind, und sagen Sie mir, welcher Sicherheitsfehler auftreten wird, wenn ein Programmierer Speicherplätze manipulieren darf. Ich nehme an, dass ein Speicherort möglicherweise einen Wert enthält, der nicht geändert werden sollte.

BEARBEITEN    Der Fehler ist error: lvalue required as left operand of assignment .

    
Gops AB 29.10.2014, 06:23
quelle

2 Antworten

12

Es ist ein Syntaxfehler. Es gibt kein Problem mit Adressen:

%Vor% Die

C-Syntax erlaubt nicht, dass ein ?: -Ausdruck auf der linken Seite eines Zuweisungsoperators verwendet wird. Die obige Version ist syntaktisch korrekt, da der Ausdruck auf der linken Seite der Zuweisung ein Dereferenzierungsausdruck mit einem Argument in Klammern ist.

Die einzige Möglichkeit, über einen Zeiger zuzuweisen, ist *ptr = val; . Es spielt keine Rolle, wie der Zeiger berechnet wird, solange es ein gültiger Zeiger auf den Typ der rechten Seite ist. Es könnte sogar eine Konstante sein - aber auf einen Zeiger gewandelt -, wenn Sie wissen wollten, dass die Konstante eine gültige Adresse ist: *(int*)(0x124) = 42; . Aber Sie benötigen immer den Dereferenzierungsoperator, um anzugeben, dass Sie durch den Zeiger zuweisen.

Die detaillierte grammatische Erklärung:

Es gibt zwei relevante grammatische Produktionen, die den Unterschied zwischen C und C ++ in Bezug auf den ursprünglichen Ausdruck ('a & gt; b? a: b = 222')

demonstrieren

In C haben wir (§§ 6.5.15-16): (Hervorhebung hinzugefügt)

%Vor%

In C ++ die äquivalenten Produktionen (§§5.16-17): (Hervorhebung hinzugefügt)

%Vor%

Beachten Sie, dass in C vor einem Zuweisungsoperator nur ein unärer Ausdruck vorkommen kann, also muss alles komplex wie ein Bedingungsausdruck sein Klammern. Außerdem muss der rechte Operand eines Bedingungsausdrucks ein Bedingungsausdruck sein, was bedeutet, dass ein Zuweisungsausdruck nicht gültig ist.

In C ++ hingegen kann der zugewiesene Operand in einem Zuweisungsausdruck ein logischer oder Ausdruck sein, was immer noch bedeutet, dass ein Ausdruck ist nicht gültig, erlaubt aber andere Möglichkeiten (von denen viele nur nützlich sind, wenn Operatoren überladen sind). Aber ein C ++ Bedingungsausdruck kann einen Zuweisungsausdruck als seinen am weitesten rechts stehenden Operanden haben.

Also ist a>b?a:b=222 in C ein Syntaxfehler. Es kann von keiner Produktion für expression produziert werden. Aber in C ++ ist derselbe Ausdruck legal, und der am weitesten rechts stehende Operand für den bedingten Operator ist b=222 ; mit anderen Worten, es ist das gleiche wie a>b?a:(b=222) .

Es muss angemerkt werden, dass ein Ausdruck, der der Syntax der Sprache entspricht, nicht bedeutet, dass der Ausdruck legal ist. Die linke Seite eines Zuweisungsoperators muss ein "modifizierbarer L-Wert" sein. Daher sind keine der folgenden syntaktisch korrekten Ausdrücke zulässig:

%Vor%

In C ++ ist dieser möglicherweise zulässig, wenn SomeType::operator!(int) eine Referenz zurückgibt:

%Vor%     
rici 29.10.2014, 06:28
quelle
-1
%Vor%

Ich habe Ihren obigen Code in GCC Version 4.8.1 ausgeführt es hat gut funktioniert.  Dann habe ich es in folgendes geändert, das deinen Blick frei macht.

%Vor%

ergibt folgende Ausgabe

Antwort: 222

%Vor%

über Zeile könnte als

geschrieben werden %Vor%

Wenn wir es ausführen, wird 222 zuerst der Variablen b und dann?: operator zugewiesen.

    
nitish005 29.10.2014 06:49
quelle

Tags und Links