OVH Cloud OVH Cloud

And et Or

16 réponses
Avatar
Patrice Henrio
Comme l'indique l'exemple ci-dessous, lors de l'évaluation de "A or B", Vb
évalue A et B, même si c'est inutile puisque quelque soit la valeur
booléenne de B, le résultat est True.

Private Sub Command1_Click()
Dim X As Integer
Dim B As Boolean
B = True Or ((1 / X) = 0)
Debug.Print B
End Sub

Existe-t-il un moyen en Vb pour que l'évaluation d'une suite de "ou"
s'arrête dés que l'on rencontre True, et celle d'une suite de And, dés qu'on
rencontre False ?

6 réponses

1 2
Avatar
dark poulpo
> En fait, je pensait qu'on parlait de performance et donc
- If V Then
est "plus mieux" que
- If V = True Then

(sans vouloir pinailler)




oui si le test etait vraiment important pour la, mais le v = true etait tiré
au hasard et un peu forcé ds mon choix en voyant le true de son algo. mais
lexemple aurait pu etre j >= 11

mais dans les exemples que jai cité, ce n'ets pas le contenu du test de
comparaison qui compte, mais l'algo des if else.

d'ou le fait quon s'écarte.


--
-----
http://dark.freezee.org/
Avatar
Thierry Bertrand
Si t'as pas peur des goto,
alors il suffit de se rappeler que non(A ou B) = non(A) et non(B)

d'où l'horible algo suivant:

if not A then
if not B then goto YaPasAFaire
end if
'
' là ya à faire
'
....
'
YaPasAFaire:
'
' suite du bignz
'




"Patrice Henrio" a écrit dans le message de
news: #IGFhaM#
Comme l'indique l'exemple ci-dessous, lors de l'évaluation de "A or B", Vb
évalue A et B, même si c'est inutile puisque quelque soit la valeur
booléenne de B, le résultat est True.

Private Sub Command1_Click()
Dim X As Integer
Dim B As Boolean
B = True Or ((1 / X) = 0)
Debug.Print B
End Sub

Existe-t-il un moyen en Vb pour que l'évaluation d'une suite de "ou"
s'arrête dés que l'on rencontre True, et celle d'une suite de And, dés


qu'on
rencontre False ?




Avatar
Patrice Henrio
Je vous remercie de vos précisions, y compris le rappel de la loi de Morgan
sur le Et et le Ou.
En fait le problème que je vais me décider à traiter un jour est de savoir
si :

A,B,C,D sont des booléens

If A ou B ou C ou D then Action

est plus rapide que

If A then action
else if B then action
else if C then action
else if D then action
end if
enf if
end if

Je précise que A,B,C,D sont les résultats de fonctions booléennes qui
prennent déjà du temsp de calcul.

"Thierry Bertrand" <bertrand.thierry(nospam)@(nospam)numericable.fr> a écrit
dans le message de news: e2iSSSW%
Si t'as pas peur des goto,
alors il suffit de se rappeler que non(A ou B) = non(A) et non(B)

d'où l'horible algo suivant:

if not A then
if not B then goto YaPasAFaire
end if
'
' là ya à faire
'
....
'
YaPasAFaire:
'
' suite du bignz
'




"Patrice Henrio" a écrit dans le message de
news: #IGFhaM#
Comme l'indique l'exemple ci-dessous, lors de l'évaluation de "A or B",
Vb
évalue A et B, même si c'est inutile puisque quelque soit la valeur
booléenne de B, le résultat est True.

Private Sub Command1_Click()
Dim X As Integer
Dim B As Boolean
B = True Or ((1 / X) = 0)
Debug.Print B
End Sub

Existe-t-il un moyen en Vb pour que l'évaluation d'une suite de "ou"
s'arrête dés que l'on rencontre True, et celle d'une suite de And, dés


qu'on
rencontre False ?








Avatar
Thierry Bertrand
Tou dépendra de la fréquence de réponse vrai / faux aux tests a b c et d,
que tu auras intérêt à trier dans l'ordre de fréquence.

on négligera les goto et le test Vrai / faux lui même ( qui intègre un goto
en réalité)

Pour la première écriture, le temps celui d'évaluation des 4 valeurs
booleenes quoi qu'il arrive. soit
T = 4 * (t(a) + t(b) +t(c) +t(d))

t(i) temps de calcul des valeurs a b c d

Dans le cas

if non a then
if non b then
if non c then
if non d then goto suite
end if
end if
end if
'
' cas traitement a ou b ou c ou d vrai
'
suite:

le temps d'evaluation sera
T = t(a) + t(b) (1 - freq(a faux)) + t(c) ((1 - freq(a faux)) ( 1 - freq(b
faux))) + t(d) ( 1 - freq(a faux))(1-freq(b faux))(1-freq(c faux)))
où freq est la fréquence.

Pour gagner le plus de temps il faut que freq(a faux) > freq b(faux) >
freq(c faux) > freq(d faux)





"Patrice Henrio" a écrit dans le message de
news: #Anf9sg#
Je vous remercie de vos précisions, y compris le rappel de la loi de


Morgan
sur le Et et le Ou.
En fait le problème que je vais me décider à traiter un jour est de savoir
si :

A,B,C,D sont des booléens

If A ou B ou C ou D then Action

est plus rapide que

If A then action
else if B then action
else if C then action
else if D then action
end if
enf if
end if

Je précise que A,B,C,D sont les résultats de fonctions booléennes qui
prennent déjà du temsp de calcul.

"Thierry Bertrand" <bertrand.thierry(nospam)@(nospam)numericable.fr> a


écrit
dans le message de news: e2iSSSW%
> Si t'as pas peur des goto,
> alors il suffit de se rappeler que non(A ou B) = non(A) et non(B)
>
> d'où l'horible algo suivant:
>
> if not A then
> if not B then goto YaPasAFaire
> end if
> '
> ' là ya à faire
> '
> ....
> '
> YaPasAFaire:
> '
> ' suite du bignz
> '
>
>
>
>
> "Patrice Henrio" a écrit dans le message de
> news: #IGFhaM#
>> Comme l'indique l'exemple ci-dessous, lors de l'évaluation de "A or B",
>> Vb
>> évalue A et B, même si c'est inutile puisque quelque soit la valeur
>> booléenne de B, le résultat est True.
>>
>> Private Sub Command1_Click()
>> Dim X As Integer
>> Dim B As Boolean
>> B = True Or ((1 / X) = 0)
>> Debug.Print B
>> End Sub
>>
>> Existe-t-il un moyen en Vb pour que l'évaluation d'une suite de "ou"
>> s'arrête dés que l'on rencontre True, et celle d'une suite de And, dés
> qu'on
>> rencontre False ?
>>
>>
>
>




Avatar
Thierry Bertrand
Pour la première écriture, le temps celui d'évaluation des 4 valeurs
booleenes quoi qu'il arrive. soit
T = (t(a) + t(b) +t(c) +t(d)) <- j'avais mis 4 * et c'était une erreur
bien sûr ...

t(i) temps de calcul des valeurs a b c d

Dans le cas

if non a then
if non b then
if non c then
if non d then goto suite
end if
end if
end if
'
' cas traitement a ou b ou c ou d vrai
'
suite:

le temps d'evaluation sera
T = t(a) + t(b) (1 - freq(a faux)) + t(c) ((1 - freq(a faux)) ( 1 - freq(b
faux))) + t(d) ( 1 - freq(a faux))(1-freq(b faux))(1-freq(c faux)))
où freq est la fréquence.

Pour gagner le plus de temps il faut que freq(a faux) > freq b(faux) >
freq(c faux) > freq(d faux
Avatar
Patrice Henrio
Effectivement je n'avais pas pensé à faire tout simplement le calcul.
Cela indique d'ailleurs que dans tous les cas la deuxième solution est
meilleure puisque au pire on calcule les quatre valeurs.

et dans le cas des And on aura bien sûr


If A and B and C and D then

équivalent logique de

If A then if B then if C then if D then action

mais cette dernière expression est plus rapide




"Thierry Bertrand" <bertrand.thierry(nospam)@(nospam)numericable.fr> a écrit
dans le message de news: %23MHHBKh%
Pour la première écriture, le temps celui d'évaluation des 4 valeurs
booleenes quoi qu'il arrive. soit
T = (t(a) + t(b) +t(c) +t(d)) <- j'avais mis 4 * et c'était une
erreur
bien sûr ...

t(i) temps de calcul des valeurs a b c d

Dans le cas

if non a then
if non b then
if non c then
if non d then goto suite
end if
end if
end if
'
' cas traitement a ou b ou c ou d vrai
'
suite:

le temps d'evaluation sera
T = t(a) + t(b) (1 - freq(a faux)) + t(c) ((1 - freq(a faux)) ( 1 - freq(b
faux))) + t(d) ( 1 - freq(a faux))(1-freq(b faux))(1-freq(c faux)))
où freq est la fréquence.

Pour gagner le plus de temps il faut que freq(a faux) > freq b(faux) >
freq(c faux) > freq(d faux




1 2