2017-07-03 5 views
1

Kann jemand bitte erklären, was im folgenden Code passiert? (Genommen von GeeksForGeeks)Kann die Funktionsweise von Pre-increment/Pre-decrement in C++ nicht verstehen

int main(){ 
int a = 10; 
++a = 20; // works 
printf("a = %d", a); 
getchar(); 
return 0; 
} 

Was genau passiert, wenn die Anweisung ++ a = 20 ausgeführt wird? Bitte erläutern Sie auch, warum dieser Code bei der Ausführung fehlschlägt.

int main(){ 
    int a = 10; 
    a++ = 20; // error 
    printf("a = %d", a); 
    getchar(); 
    return 0; 
} 

-Code Taken From: http://www.geeksforgeeks.org/g-fact-40/

+0

Ich glaube, das ist undefiniertes Verhalten. – tilz0R

+0

Das * sicherlich * funktioniert nicht in c. – EOF

+0

@eof funktioniert auch nicht in Python. Worauf willst du hinaus? Niemand hat hier über C. gesprochen. –

Antwort

0

Der linke Operand des Zuweisungsoperators sollte ein L-Wert sein.
Der Ausdruck ++a ist ein Lvalue, während a++ nicht ist und daher nicht der linke Operand des Zuweisungsoperators sein kann.

n3797-§ 5.3.3 (p1):

[...] Das Ergebnis ist die aktualisierte Operanden; es ist ein L-Wert [...]

+0

Sprechen Sie über C oder C++? In C sind AFAIK auch keine Werte. – EOF

+0

@ EOF; Es geht um C++. Und ja, in C++ ist '++ a' ein Lvalue. – haccks

+0

@EOF; Die Referenz hinzugefügt. – haccks

8

Wenn Sie das tun

++a = 20; 

es

a = a + 1; 
a = 20; 

ungefähr gleichwertig ist, aber wenn Sie

tun
a++ = 20; 

es ist grob entspricht

int temp = a; 
a = a + 1; 
temp = 20; 

Aber die Variable temp nicht wirklich existiert. Das Ergebnis von a++ ist etwas, das rvalue genannt wird und denen nicht zugewiesen werden kann. Rvalues ​​sollen auf der rechten Seite einer Zuordnung sein, nicht linke Seite. (Das ist im Grunde, was die l und r in lvalue und rvalue herkommt.)

Siehe z this values category reference für mehr Informationen über lvalues ​​und rvalues.

1

Dies ist der Unterschied zwischen den Werten r und l. Wenn Sie den zweiten Code-Schnipsel mit gcc kompiliert hätte würden Sie dies gesehen haben:

lvalue erforderlich, als linker Operand Zuordnung

Bedeutung, dass a++ rvalue ist und kein L-Wert, wie es sein sollte Wenn Sie etwas zuweisen möchten

1
int main(){ 
int a = 10; 
++a = 20; // works 
printf("a = %d", a); 
getchar(); 
return 0; 
} 

Dies ist eine Sprache. Erläuterung Zeile für Zeile int main() Diese Zeile definiert eine Eingabefunktion namens main, die einen Typ integer (int) zurückgeben soll. int a = 10 deklariert eine variable ganze Zahl, deren Wert 10 ist; ++ a = 20; An diesem Punkt erhöht Ihr Code den Wert von a um 1, bevor eine Operation an a ausgeführt wird. Dies bedeutet, dass der Wert von a um 1 erhöht wird, bevor a den Wert 20 zugewiesen wird; .... die Anweisung ++ a = 20 ist inkorect in dem Sinne, dass a anfänglich 10 ist und Sie es erhöhen bis 11. Ist wie gesagt 11 = 20; Dies kann keinen Fehler verursachen, da die Codezeile nicht nützlich ist. printf() ist eine c-Methode, um die Datei auf dem Bildschirm zu drucken, wobei eine Zeichenfolge übergeben wird "a =% d" weist den Compiler an, eine Dezimalzahl (% d) auszudrucken. getchar() wird verwendet das laufende Programm zu beenden und das Rück 0 gewaltsam ist dem Betriebssystem zu sagen, dass der Code erfolgreich ausgeführt und den Rückgabewert integer 0.

int main(){ 
    int a = 10; 
    a++ = 20; // error 
    printf("a = %d", a); 
    getchar(); 
    return 0; 
} 

Das hat nicht zu einem ++ = 20, weil rechts Value Increment Führen Sie die Operation vor der Erhöhung im Gegensatz zu ++ a wer erhöhen vor Durchführung der Operation. Also das ist nicht möglich und es funktioniert nie, weil a ist bereits 10, und Sie sagen den Wert ++ und zuweisen 20, Sie können ihm keinen Wert zuweisen, es sollte derjenige sein, der seinen eigenen Wert berechnet. Der Compiler wird also als Variable a ++ = 20 interpretieren wollen, und ++ kann kein gültiger Name sein. Deshalb funktioniert es nie.

Was das Wesen der Inkrementierung und Dekrementierung in c .... its nützlich für die for-Schleife bedingte Anweisung zB die Erstellung, während Anweisung usw. zum Beispiel:

for(int i = 0; i < 4; i++) 
{ 
printf('THis is c-language'); 
} 

oder

int i = 0; 
while(i < 4){ 
printf('THis is c-Language'); 
i++; 
} 

Daher ist es Ihnen gemäß den Programmierregeln und -regeln nicht erlaubt, entweder a ++ oder ++ a einen Wert zuzuweisen, den die Compiler manipulieren sollen, also geben Sie ihnen keinen Wert. Danke.

Verwandte Themen