Wenn Sie sich diese Frage ansehen und einen Teil des Codes ausprobieren:
int x = 100;
while ( 0 <-------------------- x )
{
printf("%d ", x);
}
Ich habe versucht, mit zu kompilieren gcc
und bekam folgenden Fehler:
file.c: In function 'main':
file:c:10:27: error: lvalue required as decrement operand
while ( 0 <-------------------- x )
Aber Kompilieren mit g++
funktioniert. Warum ist dieser Code in C++ gültig, aber nicht in C?
In C, --x
ist ein Wert, kein Lvalue. Seine Wirkung besteht darin, zu dekrementieren x
und mit dem neu zugewiesenen Wert von auswerten x
. Seit --x
kein Lvalue ist, kann er nicht dekrementiert werden.
In C++, --x
ist ein lvalue, kein rvalue. Seine Wirkung besteht darin, zu dekrementieren x
und auswerten x
als lvalue. Seit --x
wieder ein Lvalue ist, kann er wieder dekrementiert werden.
Der Grund, warum es sinnvoll ist --x
In C++ ein lvalue zu sein, liegt daran, dass C++ Referenztypen eingeführt hat. Gegeben
void f(int &);
int i;
Anrufen kann sinnvoll sein f(--i)
die geht i
durch Referenz nach dem Dekrementieren.
Da C keine Referenztypen hat, macht es wenig Sinn --i
ein lvalue sein. Historisch gesehen war dies nie der Fall, und im Gegensatz zu C++ erhielt C nie einen zwingenden Grund, die Regeln zu ändern.
Beachten Sie, dass C++ umfangreichere Änderungen erforderte als das Vornehmen --x
ein lvalue, um es tatsächlich funktionieren zu lassen. Herstellung --x
ein lvalue, ohne irgendetwas anderes, würde machen --x
undefiniertes Verhalten, weil es keinen Sequenzpunkt zwischen der Änderung zu geben würde x
und die anschließende lvalue-to-value-Konvertierung. Noch deutlicher also für ----x
. C++ musste die Sequenzierungsregeln ändern, damit es funktionierte. In C können Änderungen an den Sequenzregeln Probleme für vorhandene Compiler verursachen, um sich an die neuen Regeln anzupassen, sodass solche Änderungen wahrscheinlich abgelehnt werden, es sei denn, es gibt einen großen Vorteil.
Weil C und C++ zwei verschiedene Sprachen sind. Mit anderen Worten, C und C++ sind nicht dieselbe Sprache.
– Kerrek SB
20. Februar 2017 um 23:28 Uhr
@chqrlie Zirkelschluss. F: Warum kommt Wasser aus meinem Wasserhahn und nicht Pepsi? A: Weil Wasserhähne verwendet werden können, um leicht auf Wasser zuzugreifen.
– Benutzer253751
20. Februar 2017 um 23:45 Uhr
In C können Sie es umgehen, indem Sie schreiben
while (0 < (x -= 10))
.– dan04
20. Februar 2017 um 23:58 Uhr
Alternativ, um den ausgefallenen Stil des OP beizubehalten,
while (0 < (x +=-+-+- 10))
– chqrlie
21. Februar 2017 um 0:00 Uhr
“Aber das Kompilieren mit g++ funktioniert. Warum ist dieser Code in C++ gültig, aber nicht in C?” – Nur weil g++ (oder jeder andere Compiler) es akzeptiert, bedeutet das nicht automatisch, dass es sich um gültigen C++-Code handelt. Vergiss das niemals.
– Marcelm
21. Februar 2017 um 12:29 Uhr