Bonjour à tous,
Pouvez vous m'expliquez s'il vous plaît la différence entre && et | ?
Takout
Version imprimable
Bonjour à tous,
Pouvez vous m'expliquez s'il vous plaît la différence entre && et | ?
Takout
Bonjour,
Le symbole " & " représente la condition logique "et". L'autre symbole " | " représente la condition "ou" .
Je ne sais pas trop à quoi sert le fait d'en mettre un ou deux.
Cordialement
bonjour,
Il y a une différence entre le & et le &&.
le & représente la condition logique "et".
&& c'est différent, par exemple si on a l'expression suivant A && B, B est évalué que si la condition A est fausse.
Bonjour,
Deux symboles && ou || opèrent la condition sur deux scalaires seulement tandis qu'un seul symbole & ou | opère sur deux tableaux.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 A = [true ; false ; true ; false]; B = [true ; true ; false ; false]; [B A A|B A&B] ans = 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 >> A || B % tableaux => ERREUR ! ??? Operands to the || and && operators must be convertible to logical scalar values. >> A(1) || B(1) % scalaires => OK ans = 1
Ah d'accord, mais ce que je comprends pas c'est pourquoi sur le site mathwork ils disent :
Citation:
expr1 && expr2 represents a logical AND operation that employs short-circuiting behavior. With short-circuiting, the second operand expr2 is evaluated only when the result is not fully determined by the first operand expr1. For example, if A = 0, then the following statement evaluates to false, regardless of the value of B, so the MATLAB software does not evaluate B:
Heu là il y a un problème :aie: tu l'as parfaitement expliqué dans ton message précédent.
Ce qui est bizarre, c'est que pour moi le && revient à faire la condition logique "ou".
En effet bizarre...
Tu aurais un code reproduisant ce résultat ?
Non.
Avec l'opérateur &, MATLAB détermine la valeur booléenne des deux opérandes avant de faire le ET logique. Alors qu'avec &&, MATLAB commence par déterminer la valeur booléenne du premier opérande et ne test le second que si le premier a pour valeur 1
L'expression A & B revient à faire :
alors que l'expression A && B revient à faire :Code:
1
2
3 (if A==1) AND (if B==1) ... end
C'est pareil avec | et || mais avec un if-elseif à la place de deux if imbriqués.Code:
1
2
3
4
5 (if A==1) (if B==1) ... end end
L'expression A | B revient à faire :
alors que l'expression A || B revient à faire :Code:
1
2
3 (if A==1) OR (if B==1) ... end
Les opérateurs && et || sont appelés court-circuit car il permettent d’accélérer le code en diminuant le nombre de test à effectuer.Code:
1
2
3
4
5 (if A==1) ... (elseif B==1) ... end
malheureusement j'ai pas d'exemple simple.
L'exemple sur lequel je suis entrain de travailler c'est celui de l'extraction des extrema locaux du gradient dans une image.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 function res=extractionMaxLocal(gradV,gradH,grad) res=grad; [row,col]=size(grad); for i1=2:row-1 for j1=2:col-1 if gradV(i1,j1)>gradH(i1,j1) gradM1=gradH(i1,j1)/gradV(i1,j1)*grad(i1-1,j1) + (gradV(i1,j1)-gradH(i1,j1))/gradV(i1,j1)*grad(i1-1,j1+1) ; gradM2=gradH(i1,j1)/gradV(i1,j1)*grad(i1+1,j1-1) + (gradV(i1,j1)-gradH(i1,j1))/gradV(i1,j1)*grad(i1+1,j1) ; end if gradH(i1,j1)>gradV(i1,j1) gradM1=gradV(i1,j1)/gradH(i1,j1)*grad(i1,j1+1) + (gradH(i1,j1)-gradV(i1,j1))/gradH(i1,j1)*grad(i1-1,j1+1) ; gradM2=gradV(i1,j1)/gradH(i1,j1)*grad(i1,j1-1) + (gradH(i1,j1)-gradV(i1,j1))/gradH(i1,j1)*grad(i1+1,j1) ; end %condition pour que le pixel ne soit pas un maximum local dans l'image if grad(i1,j1)<gradM1 && grad(i1,j1)<gradM2 res(i1,j1)=0; end end end
Naturellement pour l'instruction en rouge j'aurais mis une condition "ou" mais ça ne marche pas. Et si je met le && ça marche, je ne sais pas pourquoi.
- Si tu mets une condition OU, cela signifie que la condition est vraie si la valeur grad(i1,j1) est inférieure à gradM1 ou à gradM2 (elle peut être entre les deux).
- Si tu mets une condition ET, cela signifie que la condition est vraie si la valeur grad(i1,j1) est inférieure à gradM1 et à gradM2 (elle est inférieure au minimum des deux).
Supposons gradM1 < gradM2 :
- if grad(i1,j1)<gradM1 || grad(i1,j1)<gradM2 englobe :
----------|----------------------|------------ gradM1 gradM2- if grad(i1,j1)<gradM1 && grad(i1,j1)<gradM2 englobe :
----------|----------------------|------------ gradM1 gradM2
ok !! d'accord