Bonjour,
j'aimerais avoir des precisions sur cette ligne de code et en particulier sur les operandes.
Merci d'avance
Voici la ligne en question :
vitesse = ((vitesse < 0) ? 0 : ((vitesse > 999) ? 999 : vitesse));
Version imprimable
Bonjour,
j'aimerais avoir des precisions sur cette ligne de code et en particulier sur les operandes.
Merci d'avance
Voici la ligne en question :
vitesse = ((vitesse < 0) ? 0 : ((vitesse > 999) ? 999 : vitesse));
Ce code est équivalent à ça :Citation:
Envoyé par ptitbob61
Code:
1
2
3
4
5
6
7
8
9 if (vitesse < 0) { vitesse = 0; } else if (vitesse > 999) { vitesse = 999; }
Question basique : K&R2 Pages 51 et 208.Citation:
Envoyé par ptitbob61
Salut,
En gros, cette ligne limite la vitesse à une fourchette de valeurs comprises entre 0 et 999 inclus:
Si la vitesse est inférieure à 0, elle est forcée à 0
Si la vitesse est supérieure à 999, elle est forcée à 999
Si la vitesse est entre les deux, elle garde sa valeur.
C'est une utilisation de l'operateur ternaire ? qui fonctionne selon le principe de
et a exactement le meme résultat qu'une strucutre de test classique "if (test) else"Code:
1
2 TEST ? faire_si_vrai : faire_si_faux
Plutôt que
koala01
il faudrait écrire :Citation:
TEST ? faire_si_vrai : faire_si_faux
car si les expressions derriere ? et : ne comporte pas d'effets de bord, ceci n'a aucune action,Citation:
TEST ? valeur_si_vrai : valeur_si_faux
il s'agit d'une expression dont l'évaluation est conditionnelle et qui peut se placer à tout endroit où on a le droit de placer une expression. Ceci la différencie du if , avec lequel elle ne fait pas double emploi.
Ceci étant, imbriquer dans une expression conditionnelle une ou plusieurs expressions conditionnelles n'incite pas à la clarté surtout si il y a un parenthésage excessif
Code:
1
2
3
4
5
6 vitesse = ((vitesse < 0) ? 0 : ((vitesse > 999) ? 999 : vitesse)); //plus clair (pour moi) à lire vitesse = vitesse < 0 ? 0 : (vitesse > 999 ? 999 : vitesse); //ou encore, en mettant en évidence la structure de l'expression vitesse = vitesse < 0 ? 0 : vitesse > 999 ? 999 : vitesse;
On peut décider de couper un poil de c:aie: en quatre ;)...
En effet, une valeur n'a un sens que si elle est assignée à quelque chose (qu'elle définit ce quelque chose)...
Alors, on peut considérer que c'est la valeur, mais on peut aussi considérer que c'est l'action d'assignation/définition du "quelque chose" concerné...
et comme l'operateur ternaire permet tout autant d'appeler des fonctions que de préciser la valeur d'une variable, il devient plus générique de dire "faire si", vu que meme le fait de préciser une valeur... c'est l'action de précisier qui serait prise en compte ;)
Ceci dit, à titre tout à fait personnel, je trouve que l'operateur ternaire est toujours beaucoup moins facile à relire que la structure de test équivalente...
C'est la raison pour laquelle j'essaye d'en limiter l'usage au strict minimum ;)
mais permettez-moi juste de souligner que, malgré la parfaite conformité aux standards de C, cette formulation est plûtot à éviter....(comme les incréments multiples dans les boucles)
Pas très lisible , pas compatible avec la formulation des autres langages, et donc difficilement maintenable , d'autant plus que quelqu'un programmant comme ça ne s'arrête généralement pas à ça.. (incréments multiples, incréments à l'intérieur d'un élément d'un tableau, plusieurs instructions sur la même ligne, etc...)
D'autant plus que une fois compilé c'est exactement la même chose que si c'était pas écrit comme ça .. :mouarf:
Disons qu'il ne faut pas en abuser et que les imbrications sont illisibles. Mais dans certains cas simple, c'est très pratique.Citation:
Envoyé par souviron34
J'aime bien celui ci :
Code:
1
2
3
4
5
6
7
8
9
10 #include <stdio.h> int main (void) { int i; for (i = 0; i < 4; i++) printf ("%d banane%s\n", i, i != 1 ? "s" : ""); return 0; }
Tu mettrais un 's' à banane lorsqu'il y en a zéro !!!! Curieux !!!:cfou:Citation:
Envoyé par Emmanuel Delahaye
Pour le français, j'ai un doute, mais en anglais, oui.Citation:
Envoyé par crocodilex
pas de bananes, no bananas... Ca ne me choque pas...
Alors est-ce que lorsqu'on utilise 0 ou zéro, on ne met pas d's, c'est possible. Ca dépasse mes compétences linguistiques. En tout cas, c'est pas trop dur à corriger...
Ca ne me choque pas non plus, mais je n'aurais pas mis d'"s".Citation:
Envoyé par Emmanuel Delahaye
La seule source que j'ai trouvée dit que zéro correspond à "aucune, pas une seule". Donc, logiquement, pas de "s".
A vérifier, cependant.Citation:
Envoyé par Grammaire
hello,
la technique des if imbriqué, c'est super bien ;)
mieux queCode:
1
2
3
4
5
6
7
8
9 if(...){ .... } else if(...){ ... } else{ ...}
car gain de temps et lu facile à lire le code ;)Code:
1
2
3
4
5
6
7
8 if(...){ ...} else{ if(...){ ... } }
euhhhh.. Tu peux m'expliquer stp ??Citation:
wkd a écrit :
car gain de temps
Je demande a voir.Citation:
Envoyé par wkd
Ca depends. Si la signification des deux tests est equivalents, oui. Si les deux tests ont une signification totalement differente non.Citation:
Envoyé par wkd