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

Après avoir lu Caractéristiques cachées et Dark Corners de C ++ / STL sur comp.> , j'ai été complètement surpris que l'extrait suivant ait été compilé et utilisé à 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 suggérerais que c'est C, comme cela fonctionne dans GCC. Où est-il défini dans la norme et d'où vient-il?

8054
29 окт. défini par GManNickG 29 oct. 2009-10-29 09:57 '09 à 9h57 am 2009-10-29 09h57
@ 25 réponses

--> pas un opérateur. En fait, il s’agit de deux opérateurs distincts, -- et > .

Un code conditionnel réduit la valeur de x en renvoyant la valeur d'origine (non réduite) de x , puis compare la valeur d'origine à 0 à l'aide de l'opérateur > .

Pour mieux comprendre l'expression, écrivez comme suit:

 while( (x--) > 0 ) 
7743
29 окт. réponse donnée à Charles Salvia le 29 octobre 2009-10-29 10:00 '09 à 10:00 2009-10-29 10:00

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

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

Pas si mathématiquement, mais ... chaque image appelle mille mots ...

2564
18 янв. la réponse est donnée non synchronisée le 18 janvier 2012-01-18 14:18 '12 à 14:18 2012-01-18 14:18

Il s'agit d'un opérateur très complexe. C'est pourquoi même le comité technique mixte ISO / CEI JTC1 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 dans les sections 5.2.6 / 2 et 5.9 du standard C ++ 03.

2265
29 окт. la réponse est donnée par Kirill V. Lyadvinsky le 29 octobre. 2009-10-29 11:38 '09 à 11h38 2009-10-29 11:38

Ceci est équivalent à

 while (x-- > 0) 

x-- (après décrément) est équivalent à x = x-1 le code est donc converti en:

 while(x > 0) { x = x-1; // logic } 
1183
29 окт. La réponse est donnée par Jay Riggs le 29 octobre. 2009-10-29 10:00 '09 à 10:00 2009-10-29 10:00

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 la flèche!

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

90 80 70 60 50 40 30 20 10

;)

961
28 дек. la réponse est donnée doc 28 déc. 2014-12-28 03:32 '14 à 3:32 2014-12-28 03:32

C'est

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

Juste l'espace rend les choses amusantes, diminue et > compare.

513
29 окт. la réponse est donnée à RageZ 29 oct. 2009-10-29 10:00 '09 à 10:00 2009-10-29 10:00

Utilisation --> a une signification historique. La décrémentation était (et est encore dans certains cas) plus rapide que l’incrémentation de l’architecture x86. En utilisant --> , supposons que x s'approche de 0 et se réfère à ceux qui ont un fond mathématique.

380
18 нояб. La réponse est donnée par Matt Joiner le 18 novembre. 2009-11-18 15:47 '09 à 15:47 2009-11-18 15:47
 while( x-- > 0 ) 

comment cela est analysé.

332
29 окт. réponse donnée par Grumdrig le 29 octobre. 2009-10-29 10:00 '09 à 10:00 2009-10-29 10:00

Totalement 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; } 
310
18 мая '10 в 23:33 2010-05-18 23:33 la réponse est donnée par Escualo le 18 mai '10 à 23:33 2010-05-18 23:33

Un livre que j’ai lu (je ne me souviens plus de quel livre il s’agissait) a déclaré: Les compilateurs essaient d’analyser les expressions dans le plus gros jeton en utilisant la règle gauche-gauche.

Dans ce cas, l'expression:

 x-->0 

Parsis pour les plus gros 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 

Après analyse:

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

J'espère que cela aide à comprendre l'expression complexe ^^

291
09 апр. la réponse est donnée par NguyenDat le 09 avril 2010-04-09 03:04 '10 à 3:04 2010-04-09 03:04

C'est exactement la même chose que

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

pour les nombres non négatifs

246
31 дек. La réponse est donnée par Good Person le 31 décembre. 2009-12-31 16:48 '10 à 16:48 2009-12-31 16:48

En tout cas, nous avons maintenant un opérateur "à venir". "-->" facile à retenir en tant que direction, et “tant que x disparaît” signifie “simple”.

De plus, il est légèrement plus efficace que "for (x = 10; x > 0; x --)" sur certaines plates-formes.

224
29 окт. réponse donnée test le 29 octobre. 2009-10-29 17:45 '09 à 17:45 2009-10-29 17:45

Ce code compare d'abord x et 0, puis décrémente x. (En outre, la première réponse dit: vous post-décrémentez x, puis comparez x et 0 avec l'opérateur > .) Voir Sortie de ce code:

 9 8 7 6 5 4 3 2 1 0 

Maintenant, nous comparons d’abord puis diminuons en voyant 0 à la sortie.

Si nous voulons d'abord réduire, 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 conclusion:

 9 8 7 6 5 4 3 2 1 
206
18 нояб. La réponse est donnée par Sajad Bahmani le 18 novembre. 2009-11-18 15:52 '09 à 15:52 2009-11-18 15:52

Mon compilateur imprimera 9876543210 lorsque vous exécutez ce code.

 #include <iostream> int main() { int x = 10; while( x --> 0 ) // x goes to 0 { std::cout << x; } } 

Comme prévu. La valeur while( x-- > 0 ) signifie while( x > 0) . x-- post décrémente x .

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

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

C'est bien que l'original ressemble à "pendant que x passe à 0".

160
17 янв. la réponse est donnée cool_me5000 le 17 janvier . 2010-01-17 03:46 '10 à 3:46 2010-01-17 03:46

Il -- pas d'espace entre -- et > . x poste est décrémenté, c.-à-d. diminue après avoir vérifié la condition x>0 ? .

133
la réponse est donnée à M. 28 дек. X 28 déc 2009-12-28 19:32 '10 à 19:32 2009-12-28 19:32

-- - opérateur décrémenté , et > - opérateur supplémentaire .

Deux opérateurs sont appliqués comme un seul, par exemple --> .

124
06 апр. répondre sam 06 avr. 2010-04-06 13:45 '10 à 13:45 2010-04-06 13:45

Ceci est une combinaison de deux opérateurs. Le premier -- destiné à réduire la valeur et à > 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 
117
02 апр. Réponse donnée par Rajeev Das le 02 avril 2013-04-02 14:22 13 à 14h22 2013-04-02 14:22

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

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

 --> x-->0 ++> x++>0 -->= x-->=0 ++>= x++>=0 
112
18 авг. La réponse est donnée par AndroidLearner le 18 août. 2012-08-18 10:34 '12 à 10:34 am 2012-08-18 10:34

C et C ++ suivent la règle "maximum munch". Tout comme --- b est traduit en (a--) - b , dans votre cas, x-->0 traduit en (x--)>0 .

Ce que la règle dit essentiellement, c'est que de gauche à droite, les expressions sont formées en adoptant un maximum de symboles qui formeront l'expression correcte.

105
10 февр. La réponse est donnée par Pandrei le 10 février. 2014-02-10 20:29 '14 à 20:29 2014-02-10 20:29

Pourquoi toutes les complications?

Une réponse simple à la question initiale:

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

Fait la même chose. Ne dites pas que vous devriez le faire comme ça, mais il fait la même chose et répondrait à une question.

x-- est juste un raccourci pour ce qui précède, et > est juste plus normal que l' operator x-- . Pas de grands secrets!

Il y a trop de gens qui font des choses simples en ce moment;)

23
27 окт. La réponse est donnée à Garry_G le 27 octobre. 2016-10-27 18:09 '16 à 18h09 2016-10-27 18h09

De la manière habituelle, nous définissons la condition dans les crochets de la boucle " () " et la condition de terminaison à l'intérieur des accolades " {} ", mais ceci et > est la façon dont tout le monde définit tout en même temps. Par exemple, par exemple:

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

Il dit, réduit a et commence le cycle jusqu'à ce que le temps a supérieur à 0

Une autre façon, cela aurait dû être:

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

dans les deux sens, nous faisons la même chose et atteignons les mêmes objectifs.

20
28 мая '17 в 23:10 2017-05-28 23:10 la réponse est donnée Zohaib Ejaz Le 28 mai '17 à 23:10 2017-05-28 23:10

C / C ++ ignore les espaces avec condition. Essentiellement, le code

 while (x --> 0) 

c'est pareil que

 while (x-- > 0) 

ou

 while(x > 0){ x = x - 1 ... 

Utilisation post-décrémentation en condition. Disons que x = 10 . L'opérateur de condition sera 10>0 et printf("%d ", x); l'opérateur dans la boucle donnera 9 au premier passage. Pour la deuxième exécution, la condition sera 9>0 et le sceau sera égal à 8 et ainsi de suite jusqu'à la condition 0>0 .

0
06 сент. la réponse est donnée Zirc 06 sep 2018-09-06 00:20 '18 à 0:20 2018-09-06 00:20

--> est fondamentalement la même chose que:

  for(x=10; x<1; ++x) cout<<x 

vous trouvez tous les nombres entre x et le nombre donné.

-1
Réponse donnée par Aleks. 14 апр. 14 avril 2018-04-14 21:59 '18 à 21h59 2018-14-14 21h59

Si vous deviez écrire une fonction pour faire l’inverse, la syntaxe est beaucoup plus évidente, sans compter que je ne pense pas l’avoir déjà vue:

  #include <stdio.h> int main() { int x {10}; while (x ++< 20) // x increments to 20 { printf("%d ", x); } } 

Résultat:

11 12 13 14 15 16 17 18 19 20

-1
13 июля '18 в 18:34 2018-07-13 18:34 TrevorLee a répondu le 13 juillet '18 à 18h34. 2018-07-13 18:34

En réalité → pas un opérateur. Ceci est une combinaison de deux opérateurs distincts - et>

Prenons un exemple. While (x → 0) Il s'agit d'une expression confidentielle avec une confirmation. Ici, le premier x est le décrément avec sa valeur, puis comparé à 0.

-4
06 дек. Réponse donnée par Lovekush Vishwakarma Dec 06 2017-12-06 16:45 '17 à 16h45 2017-12-06 16:45

Autres questions sur les balises ou Poser une question