c++ &= arrow - Was ist der Operator "->" in C ++?



10 Answers

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 ...

:: operators pointer

Nachdem ich Hidden Features und Dark Corners von C ++ / STL unter comp.lang.c++.moderated , war ich völlig überrascht, dass das folgende Snippet in Visual Studio 2008 und G ++ 4.4 kompiliert 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 davon ausgehen, dass dies C ist, da es auch in GCC funktioniert. Wo ist das in der Norm definiert und woher kommt es?




Es ist gleichbedeutend mit

while (x-- > 0)

x-- (post x-- ) ist äquivalent zu x = x-1 daher wird der Code umgewandelt in:

while(x > 0) {
    x = x-1;
    // logic
}



Es ist

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

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

       printf("%d ", x);
     }

     return 0;
}

Allein der Platz macht die Dinge lustig, -- dekrementiert und > vergleicht.




while( x-- > 0 )

So wird das analysiert.




Ein Buch, das ich gelesen habe (ich weiß nicht genau, welches Buch), stellte fest: Compiler versuchen, Ausdrücke mit Hilfe der Links-Rechts-Regel zum größten Token zu analysieren .

In diesem Fall lautet der Ausdruck:

x-->0

Parses zu größten Spielmarken:

token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0

Die gleiche Regel gilt für diesen Ausdruck:

a-----b

Nach der Analyse:

token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b

Ich hoffe das hilft den komplizierten Ausdruck zu verstehen ^^




Jedenfalls haben wir jetzt einen Operator "Geht zu". "-->" ist leicht als Richtung zu merken, und "solange x gegen Null geht" bedeutet "gerade".

Außerdem ist es auf einigen Plattformen etwas effizienter als "for (x = 10; x > 0; x --)" .




Mein Compiler druckt 9876543210 aus, wenn ich diesen Code ausführen.

#include <iostream>
int main()
{
    int x = 10;

    while( x --> 0 ) // x goes to 0
    {
        std::cout << x;
    }
}

Wie erwartet. Das while( x-- > 0 ) bedeutet eigentlich while( x > 0) . Das x-- post dekrementiert x .

while( x > 0 ) 
{
    x--;
    std::cout << x;
}

ist eine andere Art, das Gleiche zu schreiben.

Es ist schön, dass das Original zwar aussieht als "x geht auf 0".




-- ist der Dekrementoperator und > der Größer-als- Operator.

Die beiden Operatoren werden wie --> als einzelne Operatoren angewendet.




Tatsächlich ist x nach Dekrementierung und mit dieser Bedingung wird geprüft. Es ist nicht --> , es ist (x--) > 0

Hinweis: Der Wert von x wird geändert, nachdem die Bedingung geprüft wurde, da sie nach dem Dekrementieren abnimmt. Einige ähnliche Fälle können auch auftreten, zum Beispiel:

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0



Warum all die Komplikation?

Die einfache Antwort auf die ursprüngliche Frage lautet:

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

Tut das gleiche Ich sage nicht, dass Sie es so machen sollen, aber es tut dasselbe und hätte die Frage in einem Beitrag beantwortet.

Das x-- ist nur eine Abkürzung für das Obige und > ist nur ein normaler Größer-als- operator . Kein großes Rätsel!

Es gibt zu viele Leute, die einfache Dinge heutzutage kompliziert machen;)




Related