Qu'est-ce que l'opérateur "-- > " en C++?

après avoir lu Hidden Features and Dark Corners of C++/STL sur comp.lang.c++.moderated , j'ai été complètement surpris que l'extrait suivant compilé et travaillé à la fois dans Visual Studio 2008 et g++ 4.4.

voici le code:

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

je suppose que C'est C, puisqu'il fonctionne aussi dans GCC. Où cela est-il défini dans la norme et d'où vient-il?

7886
demandé sur GManNickG 2009-10-29 09:57:45

21 réponses

faites attention

--> n'est pas un exploitant. Il s'agit en fait de deux opérateurs distincts, -- et > .

le code du conditionnel décrète x , tout en retournant la valeur originale (non décrémentée) de x , puis compare la valeur originale avec 0 en utilisant l'opérateur > .

pour mieux comprendre, le déclaration pourrait être écrit comme suit:

while((x--) > 0)
7581
répondu Potatoswatter 2018-08-28 22:44:30

ou pour quelque chose de complètement différent... x glisse à 0

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

Non mathématique, mais... chaque image vaut mille mots. ...

2462
répondu unsynchronized 2018-02-04 06:04:41

c'est un opérateur très compliqué, donc même ISO/IEC JTC1 (Joint Technical Committee 1) a placé sa description dans deux parties différentes de la norme C++.

blague à part, ce sont deux opérateurs différents: -- et > décrits respectivement aux §5.2.6/2 et §5.9 de la norme C++03.

2243
répondu Kirill V. Lyadvinsky 2017-03-02 06:49:17

c'est l'équivalent de

while (x-- > 0)

x-- (décrément postal) est équivalent à x = x-1 donc, le code se transforme en:

while(x > 0) {
    // logic
    x = x-1;
}
1156
répondu Shubham 2018-10-05 20:49:58

x peut aller à zéro encore plus vite dans la direction opposée:

int x = 10;

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

8 6 4 2

vous pouvez contrôler la vitesse avec une flèche!

int x = 100;

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

90 80 70 60 50 40 30 20 10

;)

897
répondu doc 2017-10-11 02:51:48

Il est

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

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

       printf("%d ", x);
     }

     return 0;
}

l'espace de rendre les choses de l'air bizarre, -- décrémente et > compare.

509
répondu RageZ 2018-03-08 17:02:25

l'usage de --> a une pertinence historique. La décrémentation était (et est encore dans certains cas), plus rapide que l'incrémentation sur l'architecture x86. L'utilisation de --> suggère que x va à 0 , et fait appel à ceux qui ont une formation mathématique.

379
répondu Matt Joiner 2009-11-18 12:47:41
while( x-- > 0 )

, c'est comme ça qu'on dit.

328
répondu Grumdrig 2009-11-19 19:46:56

complètement geek, mais je vais utiliser ceci:

#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;
}
301
répondu 3 revs, 2 users 76%Arrieta 2011-12-03 02:33:05

un livre que j'ai Lu (Je ne me souviens pas correctement quel livre) a déclaré: compilateurs essayer de parser des expressions pour le plus grand jeton en utilisant la règle de droite de gauche.

dans ce cas, l'expression:

x-->0

Analyse de plus de jetons:

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

la même règle s'applique à cette expression:

a-----b

D'après parse:

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

j'espère que cela aide à comprendre l'expression compliquée ^ ^

288
répondu NguyenDat 2015-04-23 09:02:58

c'est exactement la même chose que

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

pour les numéros non négatifs

246
répondu Good Person 2015-04-30 22:48:34

quoi qu'il en soit, nous avons un opérateur" goes to " maintenant. "-->" est facile à retenir comme une direction, et" alors que x va à zéro " signifie-Droit.

de plus, il est un peu plus efficace que "for (x = 10; x > 0; x --)" sur certaines plateformes.

222
répondu Test 2013-02-28 17:28:13

ce code compare d'abord x et 0 puis décrémente X. (Également dit dans la première réponse: vous Post-décrémentez x et puis comparer x et 0 avec l'opérateur > .) Voir la sortie de ce code:

9 8 7 6 5 4 3 2 1 0

nous comparons maintenant d'abord et ensuite décroissent en voyant 0 dans la sortie.

si nous voulons d'abord décrémenter puis comparer, utilisez ce code:

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

    while( --x> 0 ) // x goes to 0
    {
        printf("%d ", x);
    }
    return 0;
}

cette sortie est:

9 8 7 6 5 4 3 2 1
204
répondu SjB 2016-01-03 17:48:14

mon compilateur imprimera 9876543210 quand j'exécuterai ce code.

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

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

comme prévu. Le while( x-- > 0 ) signifie en fait while( x > 0) . Le x-- post décrémente x .

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

est une autre façon d'écrire la même chose.

C'est beau que l'original ressemble à "tandis que x va de 0" si.

159
répondu cool_me5000 2015-04-30 22:49:12

il manque un espace entre -- et > . x est décrémenté après vérification de la condition x>0 ? .

131
répondu 2 revs, 2 users 50%Mr. X 2010-11-22 19:02:21

-- est le décrément opérateur et > est le plus grand-que opérateur.

les deux opérateurs sont appliqués en un seul comme --> .

123
répondu muntoo 2011-10-29 21:42:06

C'est une combinaison de deux opérateurs. D'abord -- pour décrémenter la valeur, et > pour vérifier si la valeur est supérieure à l'opérande de droite.

#include<stdio.h>

int main()
{
    int x = 10;

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

    return 0;
}

la sortie sera:

9 8 7 6 5 4 3 2 1 0            
115
répondu Rajeev Das 2015-04-30 22:50:01

en fait, x est post-décrémentant et avec cette condition est vérifiée. Ce n'est pas --> , c'est (x--) > 0

"

Note: la valeur de x est modifiée après vérification de la condition, car elle post-décrémente. Certains cas similaires peuvent également se produire, par exemple:

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0
111
répondu AndroidLearner 2014-04-12 09:52:33

C et C++ obéir "au maximum munch" la règle. De la même façon que a---b est traduit par (a--) - b , dans votre cas x-->0 se traduit par (x--)>0 .

ce que la règle dit essentiellement, c'est qu'en allant de gauche à droite, les expressions sont formées en prenant le maximum de caractères qui formeront une expression valide.

104
répondu Peter Mortensen 2014-04-12 09:55:16

pourquoi toutes ces complications?

la réponse simple à la question initiale est juste:

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

Fait la même chose. Ne dis pas que vous devriez faire comme cela, mais il fait la même chose et aurait répondu à la question dans un post.

le x-- est juste un raccourci pour ce qui précède, et > est juste un plus grand normal-que operator . Pas de grand mystère!

il y a trop beaucoup de gens faire des choses simples compliquées de nos jours ;)

25
répondu Garry_G 2018-06-30 10:10:56

façon conventionnelle nous définissons la condition dans tandis que la parenthèse de boucle " () "et la condition finale à l'intérieur des accolades" {} ", mais cette -- & > est une façon que l'on définit tout à la fois. For E. g:

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

il est dit, décrément a et exécuter la boucle jusqu'à ce que le temps a est plus grand que 0

D'une autre façon, il aurait dû être comme:

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

les deux moyens, nous faisons la même chose et les mêmes objectifs.

19
répondu Zohaib Ejaz 2017-07-05 10:10:51