2009-09-04 10 views

risposta

82

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

A & B (A e B vengono valutati)

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

+56

Attenzione: '&' può funzionare su array ma '&&' può funzionare solo su scalari. – gnovice

+0

Nota a margine: dopo 15 anni di lavoro con Matlab quasi quotidianamente uso sempre '&' e non mi ha mai morso nel culo. OTOH, conosco molte persone che si infastidiscono usando "&&" perché devono ricordare che non è universale (sì, mi rendo conto che "&" non è efficiente perché non è un cortocircuito, ma io praticamente non margherita- catena i miei operandi in modo che i risparmi oggigiorno siano trascurabili). – neuronet

+0

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

8

Entrambe sono operazioni AND logiche. Lo & & è un operatore "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.

Altre informazioni here.

3

& & e || sono operatori short circuit che operano su scalari. & e | valutare sempre entrambi gli operandi e operare sugli array.

5

Simile alle altre lingue, '&' è un operatore logico bit a bit, mentre '& &' è un'operazione logica.

Ad esempio (scusate la mia sintassi).

Se A = [Vero Vero Falso Vero] B = False

A & B = [Falso Falso Falso Falso]

..o se B = Vero A & B = [True True False True]

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

x = (b ~ = 0) & & (a/b> 18,5)

Speranza che è chiaro.

11

Come già menzionato da altri, & è un logical AND operator e && è un short-circuit AND operator.Essi differiscono per il modo operandi vengono valutati così come se essi operano su array o scalari:

  • & (operatore AND) e | (operatore OR) può operare su array in un elemento- modo saggio.
  • && e || sono versioni di cortocircuito per le quali il secondo operando viene valutato solo quando il risultato non è completamente determinato dal primo operando. Questi possono funzionare solo sugli scalari , non sugli array.
24

&& e || prendere ingressi scalari e cortocircuito sempre. | e & accettano gli ingressi array e cortocircuitano solo nelle istruzioni if ​​/ while. Per l'assegnazione, questi ultimi non cortocircuitare.

Vedere these doc pages per ulteriori informazioni.

+0

Hai qualche informazione su quali versioni di Matlab scorgi '' '' e '|' nelle istruzioni if ​​/ while? Non sembra essere il caso in R2012b e R2014a. – Tim

+0

@Loren qualche idea * perché * ne hanno progettato uno per funzionare solo con gli scalari? Sembra strano ... – neuronet

2

Una buona regola nel costruire argomenti da utilizzare nelle istruzioni condizionali (IF, WHILE, ecc) è di sempre usa la & &/|| forme, a meno che non ci sia un buon motivo per non farlo. Ci sono due ragioni ...

  1. Come altri hanno già detto, il comportamento cortocircuito & &/|| è simile alla maggior parte delle lingue simili a C. Tale somiglianza/familiarità è generalmente considerata un punto a suo favore.
  2. Utilizzo di & & o || forme forza di scrivere il codice completo per decidere il tuo intento per argomenti vettoriali. Quando a = [1 0 0 1] e b = [0 1 0 1], è un & b vero o falso? Non riesco a ricordare le regole per MATLAB &, puoi? La maggior parte delle persone non può. D'altra parte, se si utilizza & & o ||, si è FORZATI a scrivere il codice "per intero" per risolvere la condizione.

In questo modo, piuttosto che basarsi sulla risoluzione del MATLAB di vettori in & e |, porta a codice che è un po 'più prolisso, ma molto più sicuro e più facile da mantenere.

+1

+1, ma occorre notare che la tua risposta si applica solo ai casi in cui ** vuoi ** il risultato finale dell'operazione deve essere scalare.Ci sono molti usi per & e | | dove && e || sono inutili perché non possono restituire matrici, ad esempio quando si fa indicizzazione di fantasia come "selezionando tutto r tra 1 e 2:' r ((r <2) & (r <2)) '". –

+0

Buon punto, Jonas. Stavo pensando a condizionali, non "indicizzazione logica" (il termine MATLAB per "l'indicizzazione di fantasia" che hai menzionato) quando ho scritto questo. Ho cambiato la prima frase del mio post per riflettere questo. Grazie del promemoria! –