10169 Stimmen

Was ist der Operator "-->" in C/C++?

Nach der Lektüre Versteckte Funktionen und dunkle Ecken von C++/STL en comp.lang.c++.moderated Ich war völlig überrascht, dass das folgende Snippet sowohl in Visual Studio 2008 als auch in G++ 4.4 kompiliert wurde und funktionierte.

Hier ist der Code:

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

Ausgabe:

9 8 7 6 5 4 3 2 1 0

Ich würde annehmen, dass dies C ist, da es auch in GCC funktioniert. Wo ist dies in der Norm definiert, und woher kommt es?

3983voto

unsynchronized Punkte 4729

Oder für etwas ganz anderes... x Folien zu 0 .

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

Nicht so mathematisch, aber... jedes Bild sagt mehr als tausend Worte...

77voto

hydrechan Punkte 71

Anstelle des normalen Pfeiloperators (-->) kannst du den panzerbrechenden Pfeiloperator verwenden: --x> (beachte die scharfen Widerhaken an der Pfeilspitze). Er erhöht die Durchschlagskraft der Rüstung um +1, so dass die Schleife 1 Iteration schneller beendet wird als mit dem normalen Pfeil. Probieren Sie es selbst aus:

int x = 10;
while( --x> 0 )
    printf("%d ", x);

14 Stimmen

Vergessen Sie nicht die Extra Long Arrow Operator, der sich doppelt so schnell bewegt, x ----> 0

9 Stimmen

Und die Extra Long Armor Piercing Arrow Betreiber, ----x> 0 für Ihr schnelles Piercing

55voto

lxr196 Punkte 78
char sep = '\n'  /1\
; int i = 68    /1  \
; while (i  ---      1\
                       \
                       /1/1/1                               /1\
                                                            /1\
                                                            /1\
                                                            /1\
                                                            /1\
                            /           1\
                           /            1 \
                          /             1  \
                         /              1   \
                         /1            /1    \
                          /1          /1      \
                           /1        /1        /1/1> 0) std::cout \
                              <<i<<                               sep;

Für größere Zahlen führt C++20 einige erweiterte Schleifenfunktionen ein. Zuerst fangen i können wir eine umgekehrte Schleife bilden und sie auf die std::ostream . Allerdings ist die Geschwindigkeit der i ist implementierungsdefiniert, so dass wir den neuen C++20-Geschwindigkeitsoperator verwenden können <<i<< um es zu beschleunigen. Wir müssen es auch auffangen, indem wir eine Mauer bauen, wenn wir es nicht tun, i verlässt den Geltungsbereich und eine De-Referenzierung führt zu undefiniertem Verhalten. Um das Trennzeichen anzugeben, können wir verwenden:

 std::cout \
           sep

und dort haben wir eine for-Schleife von 67 bis 1.

34voto

Zohaib Ejaz Punkte 359

Auf herkömmliche Weise definieren wir die Bedingung in der while-Schleife in Klammern". () "und abschließende Bedingung innerhalb der geschweiften Klammern" {} ", aber das -- & > ist ein Weg, den man auf einmal definiert. Zum Beispiel:

int abc(){
    int a = 5
    while((a--) > 0){ // Decrement and comparison both at once
        // Code
    }
}

Es heißt, Dekrement a und führen Sie die Schleife bis zum Zeitpunkt a größer ist als 0

Es hätte anders sein sollen:

int abc() {
    int a = 5;
    while(a > 0) {
        a = a -1 // Decrement inside loop
        // Code
    }
}

In beiden Fällen tun wir das Gleiche und erreichen die gleichen Ziele.

6 Stimmen

Dies ist falsch. Der Code in der Frage lautet: "test-write-execute" (zuerst testen, neuen Wert schreiben, Schleife ausführen), Ihr Beispiel ist "test-execute-write".

0 Stimmen

@v010dya Die Antwort wurde korrigiert, jetzt lautet sie test-write-execute wie in der Frage, danke für den Hinweis!

0 Stimmen

@S.S.Anne Deine Bearbeitung ist immer noch falsch. Die a-- nach der Weile nicht mehr da sein sollte.

34voto

Kalana Punkte 5073

(x --> 0) bedeutet (x-- > 0) .

  1. Sie können verwenden (x -->)
    Output: 9 8 7 6 5 4 3 2 1 0

  2. Sie können verwenden (-- x > 0) Das ist gemein (--x > 0)
    Output: 9 8 7 6 5 4 3 2 1

  3. Sie können verwenden

    (--\ \ x > 0)

Output: 9 8 7 6 5 4 3 2 1

  1. Sie können verwenden

    (\ \ x --> 0)

Output: 9 8 7 6 5 4 3 2 1 0

  1. Sie können verwenden

    (\ \ x --> 0 \ \ )

Output: 9 8 7 6 5 4 3 2 1 0

  1. Sie können auch verwenden

    ( x --> 0 )

Output: 9 8 7 6 5 4 3 2 1 0

Ebenso können Sie viele Methoden ausprobieren, um diesen Befehl erfolgreich auszuführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X