Nach dem Lesen Versteckte Funktionen und dunkle Ecken von C ++ / STL auf comp.lang.c++.moderated
Ich war völlig überrascht, dass der folgende Code in Visual Studio 2008 und G ++ 4.4 kompiliert und bearbeitet wurde.
Hier ist der Code:
#include <stdio.h>
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d ", x);
}
}
Ich würde annehmen, dass dies C ist, da es auch in GCC funktioniert. Wo ist das im Standard definiert und woher kommt es?
-->
ist kein Operator. Es ist in der Tat zwei getrennte Betreiber, --
und >
.
Der Code der Bedingung wird dekrementiert x
, während der Rückkehr x
ist der ursprüngliche (nicht dekrementierte) Wert und vergleicht dann den ursprünglichen Wert mit 0
Verwendung der >
Operator.
Zum besseren Verständnis könnte die Aussage wie folgt geschrieben werden:
while( (x--) > 0 )
Oder für etwas ganz anderes ... x gleitet auf 0
while (x --\
\
\
\
> 0)
printf("%d ", x);
Nicht so mathematisch, aber ... jedes Bild sagt mehr als tausend Worte. ...
Das ist ein sehr komplizierter Operator, also sogar ISO / IEC JTC1 (Gemeinsames Technisches Komitee 1) hat seine Beschreibung in zwei verschiedene Teile des C ++ Standards gestellt.
Scherz beiseite, sie sind zwei verschiedene Betreiber: --
und >
beschrieben in §5.2.6 / 2 und §5.9 der C ++ 03 Norm.
Es ist gleichbedeutend mit
while (x-- > 0)
x
kann in umgekehrter Richtung noch schneller gegen Null gehen:
int x = 10;
while( 0 <---- x )
{
printf("%d ", x);
}
8 6 4 2
Sie können die Geschwindigkeit mit einem Pfeil steuern!
int x = 100;
while( 0 <-------------------- x )
{
printf("%d ", x);
}
90 80 70 60 50 40 30 20 10
;)
Es ist
#include <stdio.h>
int main(void){
int x = 10;
while( x-- > 0 ){ // x goes to 0
printf("%d ", x);
}
return 0;
}
Nur der Raum lässt die Dinge lustig aussehen, --
dekrementiert und >
vergleicht.
Die Verwendung von -->
hat historische Relevanz. Dekrementierung war (und ist in manchen Fällen immer noch), schneller als die x86-Architektur zu inkrementieren. Verwenden -->
schlägt vor, dass x
wird 0
und appelliert an diejenigen mit mathematischen Hintergründen.
while( x-- > 0 )
ist, wie das geparst ist.