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
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
++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.
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. –
@Stephen: Sehr guter Punkt, ich werde das zur Antwort hinzufügen. – sepp2k
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 . –
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.
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.
'++ val ++' ist das gleiche wie '++ (val ++)', was ** nicht ** das gleiche wie '(++ val) ++' ist. (Obwohl in C, beide syntaktisch ungültig sind) –
@ 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
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!) –
auch beachten Sie, dass Sie die Adresse des Zeigers durch
int k = ++*p++;
ja, das weiß ich. Ich habe es der Einfachheit halber benutzt. Anstelle von int val hätte ich int array verwenden können. – understack
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
Niemand sollte jemals Code wie diesen schreiben. – duffymo
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. –