Bonjour
Dans un expression conditionnelle, par défaut, est-ce que toute l'expression est évaluée ?
Exemple:
if (1 == 2 & 3 == 3)
{
}
est-ce que 3 == 3 est évaluée ou pas ?
Y a t-il une directive de compilation pour jouer là-dessus ?
J-L
Version imprimable
Bonjour
Dans un expression conditionnelle, par défaut, est-ce que toute l'expression est évaluée ?
Exemple:
if (1 == 2 & 3 == 3)
{
}
est-ce que 3 == 3 est évaluée ou pas ?
Y a t-il une directive de compilation pour jouer là-dessus ?
J-L
salut
à priori, enfin, ca depend des compilos mais pourquoi évaluer TOUTES les expressions si on fait du ET logique si on en trouve 1 de fausse...
En terme d'optimisation, ca serait idiot... si on veut que du oui, dès qu'une condition est à False, autant arreter le traitement :)
C'est, je crois, l'approche logique souvent implémentée :)
Pourquoi aurais tu besoin d'évaluer les autres conditions ?
The Monz, Toulouse
C'est vrai que ç aparait idiot comme ça mais sous Delphi win 32 avec lequel je développais avant, il y avait cette possibilité. Ca devait bien avoir son utilité.
Dans mon cas actuel, j'ai besoin que ça ne soit pas évalué entièrement. J'espère donc que C# fait bien ça par défaut.
pour moi, ca ne sera pas évalué
Cela dit, je trouve cela "dangereux" de devoir coder des choses en ayant besoin de connaitre le fonctionnement du compilateur :)
The Monz, Toulouse
dans certain langage
& => tous est évalué
&&=> des que la condition est évalué on arrête
en c# je suis pas sur
Ok merci ...
à titre d'info, un extrait de l'aide Delphi 6 pour windows 32:
Citation:
Type Bascule
Syntaxe {$B+} ou {$B-}
{$BOOLEVAL ON} ou {$BOOLEVAL OFF}
Défaut {$B-}
{$BOOLEVAL OFF}
Portée Locale
Remarque
La directive $B permet d'alterner entre les deux modèles de génération de code pour les opérateurs booléens and et or.
En mode {$B+}, le compilateur génère un code évaluant entièrement les expressions booléennes. Tous les opérandes des expressions booléennes contenant des opérateurs and et or sont alors évalués, même si le résultat de l'expression totale est déjà connu.
En mode {$B-}, le compilateur génère un code d'évaluation "court-circuit" des expressions booléennes. Cela signifie que l'évaluation s'arrête à partir du moment où le résultat de l'expression devient évident dans l'ordre d'évaluation de gauche à droite.
Pour plus d'informations, recherchez "Opérateurs booléens" dans le Guide du langage Pascal Objet.
je confirme, c'est pareil en C#.Comme en C / C++ (et java probablement), ça permet d'écrire par exemple if (monObjet != null && monObjet.Machin) sans que ça pète un NullReferenceException.Code:
1
2
3
4
5 bool f() { UnTruc(); return false; } bool g() {UnTruc(); return true; } bool a = f() & g(); // UnTruc sera appelée deux fois bool b = f() && g(); // UnTruc sera appelée une seule fois car f retourne false
C'est justement ce que je veux éviter :-) . Il me faut donc un &&Citation:
Comme en C / C++ (et java probablement), ça permet d'écrire par exemple if (monObjet != null && monObjet.Machin) sans que ça pète un NullReferenceException.
Merci