salut,
petite question concernant l'opérateur && dans une condition if, par exemple :
la fonction calc rendant bien évidemment un booléen...Code:if (toto && calc(a,b))
si toto est à FALSE, est-ce que calc est tout de même executée?
merci !!
Version imprimable
salut,
petite question concernant l'opérateur && dans une condition if, par exemple :
la fonction calc rendant bien évidemment un booléen...Code:if (toto && calc(a,b))
si toto est à FALSE, est-ce que calc est tout de même executée?
merci !!
Non, l'évaluation se fait de gauche à droite et si toto est false calc(a,b) ne sera pas calculé.
Ce genre de truc est potentiellement dangereux.
à ma connaissance il n'y a pas de type booléen en C.Citation:
la fonction calc rendant bien évidemment un booléen...
C considère que 0==false et a==true où a est du type int et different de 0.
le resultat des operateurs logiques est du type int.
Trap D, à ton sens mieux vaut le faire en temps temps, genre tester toto puis eventuellement executer calc et tester son résultat ??
Ce n'est pas un problème lié à if(...)Code:toto && calc(a,b)
C'est un des rares cas où l'ordre d'évaluation des termes d'une expression est imposé et où tous les opérandes ne seront pas forcémént évalués. C'est extrèmement commode dans certans cas. Mais Trap D le signale justement il FAUT connaître ce comportement parce que celà signifie que la fonction calc(...) n'est appelée QUE si toto est Vrai et tirer avantage de ce comportement.
Ce comportement rend l'opérateur effectivement non commutatif puisquene fait pas la même chose queCode:toto && calc(a,b)
Code:calc(a,b) && toto
OK j'avais bien compris ca
bonne soirée et bonne semaine !!!
a++
Ah ? Je dirais plutôt que le fait que le sens de l'évaluation soit défini est au contraire une source de sécurité. Par exemple :Citation:
Envoyé par Trap D
Ca, ce serait dangereux :Code:
1
2
3
4 if (p != NULL && *p != 0) { }
Code:
1
2
3
4 if (*p != 0 && p != NULL) { }
afrikha :C'est très discutable (même en Ansi C)Citation:
à ma connaissance il n'y a pas de type booléen en C
Du moins pas en C90.Citation:
Envoyé par afrikha
et les valeurs sont 0 ou 1.Citation:
C considère que 0==false et a==true où a est du type int et different de 0.
le resultat des operateurs logiques est du type int.
Emmanuel, je veux bien un peu plus d'explications sur ton exemple, je vois pas le truc là
merci
l'expression de gauche p != NULL est évaluée en premier, ce qui fait que si elle est vrai, l'expression de droite n'est pas évaluée. Comme celle de droite comporte un déréférencement de pointeur, ça tombe bien!Citation:
Envoyé par arthix
Si on avait écrit l'expression dans l'autre sens (2ème exemple), on aurait eu un risque de déréférencement d'un pointeur NULL, ce qui entraine un comportement indéfini (autrement dit, c'est un bug, mais pas forcément visible, ce qui le rend extrèmement dangereux).
ok thanks !!
bonne soirée
Emmanuel, je disais potentiellement dangereux car de la manière donc c'est écrit avec une lecture un peu rapide on peut oublier qu'il n'y a pas toujours appel à la fonction.
Moi je ne conseille vraiment pas cette écriture.
Oui, ok, c'est un peu de l'écriture ... d'apprenti gourou.Citation:
Envoyé par Trap D
En ce qui me concerne, j'y suis habitué, pas de problème.
C'est vrai, tu n'es plus un débutant :wink: