2010-09-07 14 views
6
int val = 5; 

printf("%d",++val++); //gives compilation error : '++' needs l-value 

int *p = &val; 
printf("%d",++*p++); //no error 

Könnte jemand diese 2 Fälle erklären? Vielen Dank.Erklärung von ++ val ++ und ++ * p ++ in C

+0

In Fällen wie diesem sind zu ändern, hilft es oft, auch die Fehlermeldungen schreiben Sie sehen und den Compiler (Version) du bist verwenden. – sbi

+7

Niemand sollte jemals Code wie diesen schreiben. – duffymo

+0

Wählen Sie, um als keine echte Frage zu schließen. Code wie dieser wird im wirklichen Leben nicht gefunden. Alles, was nur ein Zufall der Syntax ist, sollte auf eine FAQ verwiesen werden, die nur sagt, sei nicht albern. –

Antwort

27

++val++ ist das gleiche wie ++(val++). Da das Ergebnis von val++ kein Wert ist, ist dies illegal. Und wenn Stephen Canon darauf hinwies, dass das Ergebnis von val++ ein Lvalue wäre, wäre ++(val++) ein undefiniertes Verhalten, da es keinen Sequenzpunkt zwischen den ++ s gibt.

++*p++ ist das gleiche wie ++(*(p++)). Da das Ergebnis *(p++) ein Wert ist, ist dies zulässig.

+1

Ausgezeichnete Antwort, obwohl ich bemerken würde, dass, selbst wenn "val ++" ein Lvalue wäre, das Verhalten immer noch undefiniert wäre. '(++ val) ++' in C++ zum Beispiel würde undefiniertes Verhalten aufrufen. –

+0

@Stephen: Sehr guter Punkt, ich werde das zur Antwort hinzufügen. – sepp2k

+1

Post-Inkrement-Operator gibt immer einen 'rvalue' zurück (sowohl in C als auch in C++). In C++ ruft '(++ val) ++' Undefined Behavior auf, weil der Operator pre-increment ('++') einen Lvalue (in C++) zurückgibt und der Wert von 'val' zwischen zwei Sequenzpunkten mehr als einmal geändert wird . –

0

int j = ++val++; //gives compilation error

, weil Sie nicht im Voraus Schritt kann ein rvalue. ++val++ wird als ++(val++) interpretiert, da der Post-Inkrement-Operator eine höhere Priorität hat als der Pre-Inkrement-Operator. val++ gibt einen rvalue zurück und der Operator für die Vorinkrementierung benötigt seinen Operanden als lvalue. :)

int k = ++*p++; //no error

++*p++ als ++(*(p++)) interpretiert, die perfekt gültig ist.

4

Der Ausdruck ++val++ ist der gleiche wie (++val)++ (oder vielleicht ++(val++), jedenfalls ist es nicht sehr relevant). Das Ergebnis des Operators ++ ist nicht die Variable, sondern der Wert, und Sie können den Operator nicht auf einen Wert anwenden.

Der Ausdruck ++*p++ ist der gleiche wie ++(*(p++)). Das Ergebnis von p++ ist der Wert, aber das Ergebnis von *(p++) ist ein Speicherort, auf den der Operator ++ angewendet werden kann.

+0

'++ val ++' ist das gleiche wie '++ (val ++)', was ** nicht ** das gleiche wie '(++ val) ++' ist. (Obwohl in C, beide syntaktisch ungültig sind) –

+0

@ Stephen Canon: Ja, es ist einfach nicht offensichtlich, welche es bewertet. Da der Ausdruck ungültig ist, habe ich mich nie gefragt, welche von zwei ungültigen Varianten es ist.:) – Guffa

+0

ah, aber in C++ ist einer von ihnen ungültig, während der andere syntaktisch gültig aber semantisch undefiniert ist. (C++ ist verrückt!) –

1

auch beachten Sie, dass Sie die Adresse des Zeigers durch

int k = ++*p++; 
+0

ja, das weiß ich. Ich habe es der Einfachheit halber benutzt. Anstelle von int val hätte ich int array verwenden können. – understack