Quelle est la différence entre & et && dans MATLAB?

Réponses:

93

L'esperluette unique & est l'opérateur logique AND. La double esperluette && est à nouveau un opérateur ET logique qui utilise un comportement de court-circuit. Un court-circuit signifie simplement que le deuxième opérande (côté droit) est évalué uniquement lorsque le résultat n'est pas entièrement déterminé par le premier opérande (côté gauche)

A & B (A et B sont évalués)

A && B (B n'est évalué que si A est vrai)

Fraser
la source
75
Attention: &peut fonctionner sur des tableaux mais &&ne peut fonctionner que sur des scalaires.
gnovice le
Remarque: après 15 ans de travail avec Matlab presque quotidiennement, j'utilise toujours '&' et cela ne m'a jamais mordu le cul. OTOH, je connais beaucoup de gens qui s'énervent en utilisant '&&' parce qu'ils doivent se souvenir que ce n'est pas universel (oui je me rends compte que '&' n'est pas aussi efficace parce qu'il ne court-circuit pas mais je ne fais pratiquement jamais de marguerite- enchaîner mes opérandes pour que les économies de nos jours soient négligeables).
eric
7
@neuronet ce n'est pas vraiment une question d'efficacité, plus qu'il permet une construction où la première expression garantit une condition sans laquelle la seconde expression peut provoquer une erreur d'exécution. par exemple d != 0 && 1/dvs d !=0 & 1/d- le premier ne garantit aucune division par zéro, le second ne le fait pas.
Fraser
2
Cette réponse est incomplète et inexacte. &fait un court-circuit si dans une ifdéclaration. Et &&prend des entrées scalaires. La réponse de @ Loren ci - dessous est correcte.
Cris Luengo
2
Notez également que Loren est une employée de MathWorks. Une réponse ne fait pas plus autorité que cela. Si vous êtes prêt à faire un sacrifice, vous pouvez marquer votre réponse pour qu'un mod le supprime (vous ne pouvez pas le supprimer vous-même, car il est accepté). Vous conserveriez le représentant que vous en avez tiré (si je comprends bien le système), et nous nous retrouverons avec une réponse de premier ordre techniquement correcte et faisant autorité.
Andras Deak
35

&&et ||prendre des entrées scalaires et toujours court-circuiter. |et &prendre les entrées de tableau et court-circuiter uniquement dans les instructions if / while. Pour l'affectation, ces derniers ne court-circuitent pas.

Consultez ces pages de documentation pour plus d'informations.

Loren
la source
1
Avez-vous des informations sur les raccourcis des versions de Matlab &et |dans les instructions if / while? Cela ne semble pas être le cas dans R2012b et R2014a.
Tim
@Loren une idée de la raison pour laquelle ils en ont conçu un pour fonctionner uniquement avec des scalaires? Ça semble étrange ...
eric
@neuronet: Vous ne pouvez pas court-circuiter si vous opérez sur des tableaux.
Cris Luengo
17

Comme déjà mentionné par d'autres, &est un opérateur ET logique et &&est un opérateur ET de court-circuit . Ils diffèrent par la manière dont les opérandes sont évalués et par le fait qu'ils fonctionnent ou non sur des tableaux ou des scalaires:

  • &(Opérateur AND) et |(opérateur OR) peuvent opérer sur des tableaux de manière élémentaire.
  • &&et ||sont des versions en court-circuit pour lesquelles le deuxième opérande n'est évalué que lorsque le résultat n'est pas entièrement déterminé par le premier opérande. Ceux-ci ne peuvent fonctionner que sur des scalaires , pas sur des tableaux.
novice
la source
8

Les deux sont des opérations ET logiques. Le && cependant, est un opérateur de "court-circuit". À partir de la documentation MATLAB:

Ce sont des opérateurs de court-circuit en ce qu'ils évaluent leur deuxième opérande uniquement lorsque le résultat n'est pas entièrement déterminé par le premier opérande.

En savoir plus ici .

marque
la source
6

Semblable à d'autres langages, &est un opérateur logique au niveau du bit, tandis que &&c'est une opération logique.

Par exemple (pardonnez ma syntaxe).

Si..

A = [True True False True]
B = False
A & B = [False False False False]

..ou..

B = True
A & B = [True True False True]

Pour &&, l'opérande de droite n'est calculé que si l'opérande de gauche est vrai et le résultat est une valeur booléenne unique.

x = (b ~= 0) && (a/b > 18.5)

J'espère que c'est clair.

Erik Kerber
la source
3
Ce n'est pas au niveau du bit, c'est au niveau des éléments.
Cris Luengo
3
Est-ce que je viens de me rétablir, 10 ans plus tard? 😺
Erik Kerber
Eh bien, cette question a obtenu ~ 115k vues jusqu'à présent, ce qui signifie que beaucoup de gens ont lu des informations erronées ici. Beaucoup de ces réponses sont incomplètes ou contiennent des informations erronées. Tout ce que vous avez à faire est de corriger votre réponse ou de la supprimer. BTW: bitandest l'opérateur AND logique au niveau du bit dans MATLAB.
Cris Luengo
4

&& et || sont des opérateurs de court-circuit fonctionnant sur des scalaires. & et | fonctionnent sur des tableaux et n'utilisent le court-circuit que dans le contexte d' expressions de boucle ifou while.

Dima
la source
2

Une bonne règle de base lors de la construction d'arguments à utiliser dans des instructions conditionnelles (IF, WHILE, etc.) est de toujours utiliser le && / || formulaires, à moins qu'il y ait une très bonne raison de ne pas le faire. Il y a deux raisons ...

  1. Comme d'autres l'ont mentionné, le comportement de court-circuit de && / || est similaire à la plupart des langages de type C. Cette similitude / familiarité est généralement considérée comme un point en sa faveur.
  2. Utilisation de && ou || forms vous oblige à écrire le code complet pour décider de votre intention pour les arguments vectoriels. Quand a = [1 0 0 1] et b = [0 1 0 1], est-ce que a & b est vrai ou faux? Je ne me souviens plus des règles de MATLAB &, n'est-ce pas? La plupart des gens ne peuvent pas. D'un autre côté, si vous utilisez && ou ||, vous êtes FORCÉ d'écrire le code "en entier" pour résoudre la condition.

Faire cela, plutôt que de compter sur la résolution MATLAB des vecteurs dans & et |, conduit à un code un peu plus détaillé, mais BEAUCOUP plus sûr et plus facile à maintenir.

Bob Gilmore
la source
1
+1, mais il convient de noter que votre réponse ne s'applique qu'aux cas où vous souhaitez que le résultat final de l'opération soit scalaire. Les utilisations de & et | où && et || sont inutiles car ils ne peuvent pas renvoyer de tableaux, par exemple lors d'une indexation sophistiquée comme "sélectionner tous les r entre 1 et 2: r((r<2)&(r<2))".
Jonas Heidelberg
Bon point, Jonas. Je pensais aux conditions, pas à "l'indexation logique" (le terme MATLAB pour "l'indexation sophistiquée" que vous avez mentionnée) quand j'ai écrit ceci. J'ai changé la première phrase de mon message pour refléter cela. Merci pour le rappel!
Bob Gilmore