2009-09-04 15 views

Respuesta

82

El signo único & es el operador AND lógico. El ampersand doble & & es de nuevo un operador AND lógico que emplea un comportamiento de cortocircuito. Cortocircuitos sólo significa se evalúa el segundo operando (lado derecho) sólo cuando el resultado no se determina completamente por el primer operando (lado izquierdo)

A & B (A y B son evaluados)

A & & B (B solo se evalúa si A es verdadero)

+56

Advertencia: '&' puede operar en arreglos pero '&&' solo puede operar en escalares. – gnovice

+0

Nota al margen: después de 15 años trabajando con Matlab casi a diario, siempre uso '&' y nunca me ha mordido el culo. OTOH, conozco a mucha gente que se molesta al usar '&&' porque tienen que recordar que no es universal (sí, me doy cuenta de que '&' no es tan eficiente porque no hace cortocircuito, pero casi nunca lo hago) encadenar mis operandos para que los ahorros actuales sean insignificantes). – neuronet

+0

@neuronet en realidad no se trata de eficiencia, más de lo que permite una construcción donde la primera expresión garantiza una condición sin la cual la segunda expresión puede causar un error en tiempo de ejecución. p.ej. 'd! = 0 && 1/d' vs' d! = 0 & 1/d' - el primero no garantiza ninguna división por cero, el segundo no. – Fraser

8

Ambas son operaciones lógicas Y. El & & es un operador de "cortocircuito". De los documentos de MATLAB:

Son operadores de cortocircuito en que evalúan su segundo operando solo cuando el resultado no está completamente determinado por el primer operando.

Ver más here.

3

& & y || son operadores short circuit que operan en escalares. & y | siempre evalúe ambos operandos y opere en arreglos.

5

Similar a otros idiomas, '&' es un operador lógico a nivel de bit, mientras que '& &' es una operación lógica.

Por ejemplo (disculpe mi sintaxis).

Si A = [Verdadero Verdadero Falso Verdadero] B = False

Un & B = [Falso Falso Falso Falso]

..o si B = True Un & B = [Verdadero Verdadero False True]

Para '& &', el operando derecho solo se calcula si el operando de la izquierda es verdadero, y el resultado es un valor booleano único.

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

esperanza que está claro.

11

Como ya se mencionó por otros, & es un logical AND operator y && es un short-circuit AND operator.Se diferencian en cómo se evalúan los operandos así como si son o no operan en arrays o escalares:

  • & (Y operador) y | (OR operador) puede operar en arrays en un element- moda sabia.
  • && y || son versiones de cortocircuito para las cuales el segundo operando se evalúa solo cuando el resultado no está completamente determinado por el primer operando. Estos solo pueden operar en escalares, no en arreglos.
24

&& y || toman entradas escalares y cortocircuito siempre. | y & toman entradas de matriz y cortocircuito solo en sentencias if/while. Para la asignación, este último no cortocircuita.

Consulte these doc pages para obtener más información.

+0

¿Tiene alguna información sobre qué atajos de las versiones de Matlab '&' y '|' en declaraciones if/while? No parece ser el caso en R2012b y R2014a. – Tim

+0

@Loren alguna idea * ¿por qué * diseñaron una para trabajar solo con escalares? Parece extraño ... – neuronet

2

Una buena regla del pulgar cuando la construcción de argumentos para su uso en sentencias condicionales (IF, WHILE, etc.) es siempre utilice el & &/|| formas, a menos que haya una muy buena razón para no hacerlo. Hay dos razones ...

  1. Como otros han mencionado, el comportamiento de cortocircuito de & &/|| es similar a la mayoría de los lenguajes tipo C. Esa similitud/familiaridad generalmente se considera un punto a su favor.
  2. Usando & & o || formas fuerzas a escribir el código completo para decidir su intención para los argumentos vectoriales. Cuando a = [1 0 0 1] yb = [0 1 0 1], ¿es & b verdadero o falso? No recuerdo las reglas para el & de MATLAB, ¿verdad? La mayoría de las personas no pueden. Por otro lado, si usa & & o ||, se le FORCE escribir el código "en su totalidad" para resolver la condición.

Hacer esto, en lugar de confiar en la resolución de los vectores de MATLAB en & y |, conduce a código que es un poco más detallado, pero mucho más seguro y más fácil de mantener.

+1

+1, pero debe tenerse en cuenta que su respuesta solo se aplica a los casos en los que ** desea ** que el resultado final de la operación sea escalar.Hay muchos usos para & y | donde && y || son inútiles porque no pueden devolver matrices, por ejemplo, al hacer una indexación elegante como "seleccionar todo r entre 1 y 2:' r ((r <2) & (r <2)) '". –

+0

Buen punto, Jonas. Estaba pensando en condicionales, no en "indización lógica" (el término MATLAB para la "indización elegante" que mencionaste) cuando escribí esto. Cambié la primera frase de mi publicación para reflejar eso. ¡Gracias por el recordatorio! –

Cuestiones relacionadas