10203 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?

8voto

chqrlie Punkte 110208

--> ist kein Operator, es ist die Aneinanderreihung von -- (nach der Dekrementierung) und > (größer als der Vergleich).

Die Schleife sieht dann eher so aus:

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

Diese Schleife ist ein klassisches Idiom zum Aufzählen von Werten zwischen 10 (die ausgeschlossene Obergrenze) und 0 die enthaltene untere Grenze, die nützlich ist, um über die Elemente eines Arrays vom letzten zum ersten zu iterieren.

Der Ausgangswert 10 ist die Gesamtzahl der Iterationen (z. B. die Länge des Arrays) und 1 plus der erste Wert, der innerhalb der Schleife verwendet wird. Die 0 ist der letzte Wert von x innerhalb der Schleife, daher der Kommentar x geht auf 0 .

Beachten Sie, dass der Wert von x nach Beendigung der Schleife ist -1 .

Beachten Sie auch, dass diese Schleife die dieselbe Weise, wenn x hat eine Typ ohne Vorzeichen wie zum Beispiel size_t was ein großer Vorteil gegenüber der naiven Alternative ist for (i = length-1; i >= 0; i--) .

Aus diesem Grund bin ich eigentlich ein Fan dieser überraschenden Syntax: while (x --> 0) . Ich finde diese Redewendung auffallend und elegant, genau wie for (;;) vs: while (1) (der verwirrend ähnlich aussieht wie while (l) ). Es funktioniert auch in anderen Sprachen, deren Syntax von C inspiriert ist: C++, Objective-C, Java, Javascript, C#, um nur einige zu nennen.

5voto

Ankit Mishra Punkte 458

Diese --> ist überhaupt kein Operator. Wir haben einen Operator wie -> , aber nicht wie --> . Es ist einfach eine falsche Interpretation von while(x-- >0) was einfach bedeutet, dass x den Post-Decrement-Operator hat und diese Schleife so lange läuft, bis es größer ist als Null .

Eine andere einfache Möglichkeit, diesen Code zu schreiben, wäre while(x--) . Die während Schleife stoppt immer dann, wenn sie eine falsche Bedingung erhält, und hier gibt es nur einen Fall, d.h., 0 . Es wird also angehalten, wenn der x-Wert auf Null .

5voto

Neeraj Bansal Punkte 342

Hier -- ist der unäre Post-Dekrement-Operator.

 while (x-- > 0) // x goes to 0
 {
     printf("%d ", x);
 }
  • Zu Beginn wird die Bedingung wie folgt bewertet (x > 0) // 10 > 0
  • Da die Bedingung nun erfüllt ist, wird die Schleife mit einem dekrementierten Wert fortgesetzt x-- // x = 9
  • Deshalb ist der erste ausgedruckte Wert 9
  • Und so weiter. In der letzten Schleife x=1 so dass die Bedingung erfüllt ist. Gemäß dem unären Operator ändert sich der Wert zu x = 0 zum Zeitpunkt der Drucklegung.
  • Jetzt, x = 0 , die die Bedingung auswertet (x > 0 ) als falsch und die während Schleife verlässt.

0 Stimmen

Sie haben vergessen zu beschreiben, wie die -- am Ende der Schleife.

0voto

Numan Gillani Punkte 447

Das ist es, was Sie meinen.

while((x--) > 0)

Wir haben es in unserer Kindheit gehört,

Stop don't, Loslassen ( )

Wo ein Komma Verwirrung stiftet

Halt, nicht loslassen. ( )

Das Gleiche passiert jetzt beim Programmieren, ein SPACE sorgt für Verwirrung :D

2 Stimmen

Diese Idee kann für weit entfernte Ziele im Stil von Pfeil und Bogen missbraucht werden: while((x --)> 0)

0 Stimmen

Das ist eine Frage des Verständnisses. Was immer einem Menschen leicht und verständlich erscheint, ist für ihn/sie in Ordnung. Das Hauptziel ist es, das Konzept zu verstehen und ein erfolgreicher Entwickler zu sein :)

0 Stimmen

Ja, natürlich. Und IMHO while (x --> 0) ist klar und wirksam. x nimmt alle Werte unterhalb des Ausgangswerts bis einschließlich 0 was sich perfekt für eine Schleife eignet, die Indexwerte für ein Array sowohl für vorzeichenbehaftete als auch vorzeichenlose Typen von x .

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