Vraag Wat is de "->" -operator in C ++?


Na het lezen Verborgen functies en donkere hoeken van C ++ / STL op comp.lang.c++.moderated, Ik was volledig verrast dat het volgende fragment compileerde en werkte in zowel Visual Studio 2008 als G ++ 4.4.

Hier is de code:

#include <stdio.h>
int main()
{
    int x = 10;
    while (x --> 0) // x goes to 0
    {
        printf("%d ", x);
    }
}

Ik neem aan dat dit C is, omdat het ook werkt in GCC. Waar wordt dit in de norm gedefinieerd en waar komt het vandaan?


7773


oorsprong


antwoorden:


--> is geen operator. Het zijn in feite twee afzonderlijke operatoren, -- en >.

De code van de voorwaardelijke verlaagt x, tijdens het terugkeren xoorspronkelijke (niet-verlaagde) waarde, en vergelijkt vervolgens de oorspronkelijke waarde met 0 de ... gebruiken > operator.

Om beter te begrijpen, zou de verklaring als volgt kunnen worden geschreven:

while( (x--) > 0 )

7470



Of voor iets heel anders ... x dia's naar 0

while (x --\
            \
             \
              \
               > 0)
     printf("%d ", x);

Niet zo wiskundig, maar ... elke foto schetst duizend woorden. ...


2373



Dat is een erg ingewikkelde operator, dus zelfs ISO / IEC JTC1 (Joint Technical Committee 1) plaatste zijn beschrijving in twee verschillende delen van de C ++ -standaard.

Een grapje terzijde, het zijn twee verschillende operatoren: -- en > beschreven in respectievelijk §5.2.6 / 2 en §5.9 van de C ++ 03-norm.


2221



Het is equivalent aan

while (x-- > 0)

1142



x kan nog sneller naar nul gaan in de tegenovergestelde richting:

int x = 10;

while( 0 <---- x )
{
   printf("%d ", x);
}

8 6 4 2

Je kunt de snelheid met een pijl besturen!

int x = 100;

while( 0 <-------------------- x )
{
   printf("%d ", x);
}

90 80 70 60 50 40 30 20 10

;)


859



Haar

#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d ", x);
     }

     return 0;
}

Alleen de ruimte zorgt ervoor dat de dingen er leuk uitzien, -- decrement en > vergelijkt.


498



Het gebruik van --> heeft historische relevantie. Decrementeren was (en is nog steeds in sommige gevallen) sneller dan verhogen van de x86-architectuur. Gebruik makend van --> stelt x gaat naar 0, en een beroep op mensen met een wiskundige achtergrond.


371



while( x-- > 0 )

is hoe dat is geparseerd.


324



Volkomen geek, maar ik zal dit gebruiken:

#define as ;while

int main(int argc, char* argv[])
{
    int n = atoi(argv[1]);
    do printf("n is %d\n", n) as ( n --> 0);
    return 0;
}

291