Après avoir lu les fonctions cachées et coins sombres de C ++ / STL sur comp.lang.c++.moderated
, j'ai été complètement surpris que le suivant extrait compilé et a travaillé 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);
}
}
Production:
9 8 7 6 5 4 3 2 1 0
Je suppose que c'est C, car cela fonctionne également dans GCC. D'où cela est-il défini dans la norme et d'où vient-il?
c++
c
operators
code-formatting
standards-compliance
GManNickG
la source
la source
++
ou l' autre ou--
avant ...#define upto ++<
,#define downto -->
. Si vous vous sentez mal, vous pouvez le faire#define for while(
et#define do ) {
(et#define done ;}
) et écrirefor x downto 0 do printf("%d\n", x) done
Oh, l'humanité ...Réponses:
-->
n'est pas un opérateur. Il s'agit en fait de deux opérateurs distincts,--
et>
.Le code du conditionnel diminue
x
, tout en renvoyantx
la valeur d'origine (non décrémentée) de, puis compare la valeur d'origine avec l'0
utilisation de l'>
opérateur.Pour mieux comprendre, la déclaration pourrait être rédigée comme suit:
la source
while (x-- > 0)
serait donc plus approprié. Cela rend également plus clair ce qui se passe (au moins dans un éditeur de polices fixes), ce qui signifie que les parenthèses dans cette réponse ne seraient pas nécessaires.Ou pour quelque chose de complètement différent ...
x
glisse vers0
.Pas si mathématique, mais ... chaque image vaut mille mots ...
la source
why waste words when a picture does a better job
, utilisée comme plaisanterie dans ce contexte. (il y a en fait 2 motswhile
- clés etprintf
)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 au §5.2.6 / 2 et au §5.9 de la norme C ++ 03.la source
C'est équivalent à
x--
(post décrément) est équivalent àx = x-1
so, le code se transforme en:la source
0 >-- x
dans ce cas, ilx
est décrémenté avant la logique. En postfixe, la logique est exécutée avant la décrémentation et donc les deux échantillons sont équivalents. N'hésitez pas à les écrire dans unConsole
et à les tester.while(x=x-1,x+1 > 0)
est équivalent.x
peut aller à zéro encore plus vite dans la direction opposée:8 6 4 2
Vous pouvez contrôler la vitesse avec une flèche!
90 80 70 60 50 40 30 20 10
;)
la source
Ses
L'espace juste rend les choses drôles,
--
diminue et>
compare.la source
L'utilisation de
-->
a une pertinence historique. La décrémentation était (et l'est toujours dans certains cas), plus rapide que l'incrémentation sur l'architecture x86. L'utilisation-->
suggère que celax
va0
et fait appel à ceux qui ont des antécédents mathématiques.la source
est comment c'est analysé.
la source
Complètement geek, mais je vais utiliser ceci:
la source
do ... while
est une liste d'instructions. En C, c'est un bloc, donc ça doit l'êtredo { ... } while
.do statement while ( expression ) ;
. Cela dit, j'espère qu'il est entendu que je voulais dire l'exemple comme une blague.Un livre que j'ai lu (je ne me souviens pas correctement du livre) a déclaré: Les compilateurs essaient d'analyser les expressions sur le plus gros jeton en utilisant la règle de gauche à droite.
Dans ce cas, l'expression:
Analyse les plus gros jetons:
La même règle s'applique à cette expression:
Après l'analyse:
J'espère que cela aide à comprendre l'expression compliquée ^^
la source
a-----b
et réfléchira(a--)-- - b
, qui ne compile pas cara--
ne renvoie pas de valeur l.x
et--
sont deux jetons distincts.-->
être un opérateur (ce qui implique que la question a été posée), cette réponse n'est pas du tout utile - vous penserez que le jeton 2 l'est-->
, pas seulement--
. Si vous savez que ce-->
n'est pas un opérateur, vous n'avez probablement pas de problème à comprendre le code dans la question, donc, à moins que vous n'ayez une question complètement différente, je ne sais pas vraiment comment cela pourrait être utile.a
opérateur de post-décrémentation est surchargé, ce qui renvoie lvalue. coliru.stacked-crooked.com/a/e1effc351ae79e9fC'est exactement la même chose que
pour les nombres non négatifs
la source
for(--x++;--x;++x--)
?unsigned
est pour--x++
a un comportement indéfini selon §1.9.15unsigned
, il aurait utilisé%u
Quoi qu'il en soit, nous avons maintenant un opérateur "va à".
"-->"
est facile à retenir comme une direction, et "tandis que x va à zéro" est un sens direct.De plus, il est un peu plus efficace que
"for (x = 10; x > 0; x --)"
sur certaines plateformes.la source
for (size_t x=10; x-->0; )
le corps de la boucle exécuté avec 9,8, .., 0 alors que l'autre version a 10,9, .., 1. Sinon, il est assez difficile de quitter une boucle jusqu'à zéro avec une variable non signée.++>
pour faire le travail incrémentiel.int
, il pourrait donc tout aussi facilement manger votre chien que de le mettrex
à zéro s'il commence au négatif.0
. (À titre de comparaison, l'idiome consistant à omettre des tests pour zéro, comme écrire à lawhile (n--)
place pour non signén
, ne vous achète rien et pour moi entrave considérablement la lisibilité.) Il a également la propriété agréable que vous spécifiez un de plus que l'index initial, qui est généralement ce que vous voulez (par exemple, pour une boucle sur un tableau, vous spécifiez sa taille). J'aime aussi-->
sans espace, car cela rend l'idiome facile à reconnaître.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 comparez ensuite x et 0 avec l'
>
opérateur.) Voir la sortie de ce code:Nous comparons maintenant d'abord puis décrémentons en voyant 0 dans la sortie.
Si nous voulons d'abord décrémenter puis comparer, utilisez ce code:
Cette sortie est:
la source
Mon compilateur imprimera 9876543210 lorsque j'exécuterai ce code.
Comme prévu. Le
while( x-- > 0 )
signifie en faitwhile( x > 0)
. Lex--
poste diminuex
.est une façon différente d'écrire la même chose.
C'est bien que l'original ressemble à "tandis que x passe à 0".
la source
while( x-- > 0 ) actually means while( x > 0)
- Je ne suis pas sûr de ce que vous essayez de dire là-bas, mais la façon dont vous l'avez formulé implique que cela--
n'a aucun sens, ce qui est évidemment très faux.x
sera-1
après qu'il quitte la boucle, tandis que dans cette réponse, cex
sera0
.Il manque un espace entre
--
et>
.x
est post-décrémenté, c'est-à-dire décrémenté après avoir vérifié la conditionx>0 ?
.la source
#define foo()
versus#define foo ()
.--
est l' opérateur de décrémentation et>
est l' opérateur supérieur à .Les deux opérateurs sont appliqués comme un seul comme
-->
.la source
C'est une combinaison de deux opérateurs. La première
--
consiste à décrémenter la valeur et>
à vérifier si la valeur est supérieure à l'opérande de droite.La sortie sera:
la source
En fait,
x
est post-décrémentation et avec cette condition est en cours de vérification. Ce n'est pas-->
, c'est(x--) > 0
Remarque: la valeur de
x
est modifiée après la vérification de la condition, car elle post-décrémente. Certains cas similaires peuvent également se produire, par exemple:la source
x
démarré à 1, mais lewhile ( (x--) > 0 )
ferait. {edit} Eric Lippert a couvert les deux dans ses notes de version C # 4: blogs.msdn.microsoft.com/ericlippert/2010/04/01/…C et C ++ obéissent à la règle du "grignotage maximal". De la même manière que a --- b est traduit en
(a--) - b
, dans votre cas, sex-->0
traduit par(x--)>0
.Ce que la règle dit essentiellement, c'est que, de gauche à droite, les expressions sont formées en prenant le maximum de caractères qui formeront une expression valide.
la source
Pourquoi toutes ces complications?
La réponse simple à la question d'origine est juste:
Fait la même chose. Je ne dis pas que vous devriez le faire comme ça, mais cela fait la même chose et aurait répondu à la question dans un message.
C'est
x--
juste un raccourci pour ce qui précède, et>
c'est juste un normal supérieur àoperator
. Pas de grand mystère!Il y a trop de gens qui compliquent les choses simples de nos jours;)
la source
The OP's way: 9 8 7 6 5 4 3 2 1 0
etThe Garry_G way: 10 9 8 7 6 5 4 3 2 1
x=x-1
avantprintf
alors vous pouvez dire "ça fait la même chose".De la manière conventionnelle, nous définirions une condition dans la
while
parenthèse de boucle()
et une condition de terminaison à l'intérieur des accolades{}
, mais-->
définir les deux à la fois.Par exemple:
Cela décrémente
a
et exécute la boucle tandis quea
est supérieur à0
.Classiquement, ce serait:
Dans les deux sens, nous faisons la même chose et atteignons les mêmes objectifs.
la source
test-write-execute
comme dans la question, merci de l'avoir signalé!(x --> 0)
veux dire(x-- > 0)
(x -->)
output -: 9 8 7 6 5 4 3 2 1 0
(-- x > 0)
c'est méchant(--x > 0)
output -: 9 8 7 6 5 4 3 2 1
output -: 9 8 7 6 5 4 3 2 1
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
de même, vous pouvez essayer de nombreuses méthodes pour exécuter cette commande avec succès
la source