Qual è la differenza tra & e && in MATLAB?


Risposte:


93

La singola e commerciale & è l'operatore logico AND. La doppia e commerciale && è ancora un operatore logico AND che impiega un comportamento di cortocircuito. Cortocircuito significa solo che il secondo operando (lato destro) viene valutato solo quando il risultato non è completamente determinato dal primo operando (lato sinistro)

A e B (vengono valutati A e B)

A && B (B viene valutato solo se A è vero)


75
Attenzione: &può operare su array ma &&può operare solo su scalari.
gnovice

Nota a margine: dopo 15 anni di lavoro con Matlab quasi quotidianamente uso sempre '&' e non mi ha mai morso il culo. OTOH, conosco molte persone che si infastidiscono usando "&&" perché devono ricordare che non è universale (sì, mi rendo conto che "&" non è così efficiente perché non va in cortocircuito, ma praticamente non ho mai daisy- concatena i miei operandi in modo che i risparmi al giorno d'oggi siano trascurabili).
Eric

7
@neuronet non si tratta veramente di efficienza, più che permette un costrutto in cui la prima espressione garantisce una condizione senza la quale la seconda espressione può causare un errore di runtime. es. d != 0 && 1/dvs d !=0 & 1/d- il primo non garantisce la divisione per zero, il secondo no.
Fraser

2
Questa risposta è incompleta e imprecisa. &fa cortocircuito se in una ifdichiarazione. E &&accetta input scalari. La risposta di @ Loren di seguito è corretta.
Cris Luengo

2
Notare inoltre che Loren è un dipendente di MathWorks. Una risposta non diventa più autorevole di così. Se sei disposto a fare un sacrificio, puoi contrassegnare la tua risposta per una mod per eliminarla (non puoi eliminarla da solo, perché è accettata). Manterresti la reputazione che hai ottenuto (se comprendo correttamente il sistema) e ci ritroveremmo con una risposta migliore tecnicamente corretta e autorevole.
Andras Deak

35

&&e ||prendere sempre input scalari e cortocircuiti. |e &prendere input di array e cortocircuitare solo nelle istruzioni if ​​/ while. Per l'assegnazione, questi ultimi non vanno in cortocircuito.

Vedere queste pagine di documentazione per ulteriori informazioni.


1
Hai qualche informazione su quale scorciatoia di versioni di Matlab &e |nelle istruzioni if ​​/ while? Non sembra essere il caso di R2012b e R2014a.
Tim

@ Loren hai idea del perché ne abbiano progettato uno per funzionare solo con gli scalari? Sembra strano ...
Eric

@neuronet: non è possibile cortocircuitare se si opera su array.
Cris Luengo

17

Come già accennato da altri, &è un operatore logico AND ed &&è un operatore AND di cortocircuito . Differiscono nel modo in cui gli operandi vengono valutati e se operano o meno su array o scalari:

  • &(Operatore AND) e |(Operatore OR) possono operare su array in modo saggio per gli elementi.
  • &&e ||sono versioni in cortocircuito per le quali il secondo operando viene valutato solo quando il risultato non è completamente determinato dal primo operando. Questi possono funzionare solo su scalari , non su array.

8

Entrambe sono operazioni AND logiche. Tuttavia, && è un operatore di "cortocircuito". Dai documenti MATLAB:

Sono operatori di cortocircuito in quanto valutano il loro secondo operando solo quando il risultato non è completamente determinato dal primo operando.

Vedi di più qui .


6

Simile ad altri linguaggi, &è un operatore logico bit per bit, mentre &&è un'operazione logica.

Ad esempio (scusate la mia sintassi).

Se..

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

..o..

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

Per &&, l'operando di destra viene calcolato solo se l'operando di sinistra è vero e il risultato è un singolo valore booleano.

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

Spero sia chiaro.


3
Non è bit per bit, è per elemento.
Cris Luengo

3
Sono appena guarito 10 anni dopo? 😺
Erik Kerber

Bene, questa domanda ha ottenuto finora ~ 115k visualizzazioni, il che significa che molte persone hanno letto informazioni sbagliate qui. Molte di queste risposte sono incomplete o contengono informazioni errate. Tutto quello che devi fare è correggere la tua risposta o eliminarla. BTW: bitandè l'operatore AND logico bit per bit in MATLAB.
Cris Luengo


2

Una buona regola pratica quando si costruiscono argomenti da usare nelle istruzioni condizionali (IF, WHILE, ecc.) È usare sempre && / || forme, a meno che non ci sia una buona ragione per non farlo. Ci sono due ragioni ...

  1. Come altri hanno già detto, il comportamento di cortocircuito di && / || è simile alla maggior parte dei linguaggi C-like. Tale somiglianza / familiarità è generalmente considerata un punto a suo favore.
  2. Utilizzando && o || form ti obbliga a scrivere il codice completo per decidere il tuo intento per gli argomenti vettoriali. Quando a = [1 0 0 1] eb = [0 1 0 1], a & b è vero o falso? Non ricordo le regole per MATLAB e, vero? La maggior parte delle persone non può. D'altra parte, se usi && o ||, sei FORZATO a scrivere il codice "per intero" per risolvere la condizione.

In questo modo, piuttosto che fare affidamento sulla risoluzione dei vettori di MATLAB in & e |, si ottiene un codice un po 'più dettagliato, ma MOLTO più sicuro e facile da mantenere.


1
+1, ma va notato che la tua risposta si applica solo ai casi in cui desideri che il risultato finale dell'operazione sia scalare. Ci sono molti usi per & e | dove && e || sono inutili perché non possono restituire array, ad esempio quando si esegue un'indicizzazione di fantasia come "selezionare tutti i r tra 1 e 2: r((r<2)&(r<2))".
Jonas Heidelberg

Buon punto, Jonas. Stavo pensando ai condizionali, non all '"indicizzazione logica" (il termine MATLAB per l' "indicizzazione fantasia" che hai menzionato) quando ho scritto questo. Ho cambiato la prima frase del mio post per riflettere questo. Grazie del promemoria!
Bob Gilmore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.