¿Cuál es la diferencia entre los operadores lógicos &
y &&
en MATLAB?¿Cuál es la diferencia entre & y && en MATLAB?
Respuesta
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)
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.
& & y || son operadores short circuit que operan en escalares. & y | siempre evalúe ambos operandos y opere en arreglos.
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.
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.
&&
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.
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 ...
- 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.
- 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, 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)) '". –
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! –
- 1. ¿Cuál es la diferencia entre + = y = +?
- 2. ¿cuál es la diferencia entre:.! y: r !?
- 3. ¿Cuál es la diferencia entre ".equals" y "=="?
- 4. Cuál es la diferencia entre $ y jQuery
- 5. Cuál es la diferencia entre = y: =
- 6. Cuál es la diferencia entre $ (...) y `...`
- 7. ¿Cuál es la diferencia entre dict() y {}?
- 8. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 9. Diferencia entre filtro y conv en MATLAB
- 10. ¿Cuál es la diferencia entre {0} y ""?
- 11. ¿Cuál es la diferencia entre .ToString (+) y ""
- 12. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 13. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 14. ¿Cuál es la diferencia entre " " y ""?
- 15. ¿Cuál es la diferencia entre stateflow y simulink?
- 16. ¿Cuál es la diferencia entre un script y una función en MATLAB?
- 17. Cuál es la diferencia entre archivos .m y .mat en MATLAB
- 18. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 19. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 20. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 21. ¿Cuál es la diferencia entre Session.Abandon() y Session.Clear() en ASP.Net?
- 22. ¿cuál es la diferencia entre didselectrowindexpath y willselectrowindexpath en iphone?
- 23. ¿cuál es la diferencia entre NULL y Empty en mysql
- 24. ¿Cuál es la diferencia entre longblob y longtext en mysql?
- 25. ¿Cuál es la diferencia entre $ @ y $ * en scripts de shell?
- 26. ¿Cuál es la diferencia entre flush y commit en Hibernate?
- 27. ¿Cuál es la diferencia entre iTerm2 y Terminal en Mac?
- 28. ¿Cuál es la diferencia entre @ y @@ en un módulo?
- 29. ¿Cuál es la diferencia entre _isEnabled y isEnabled en Anguila?
- 30. ¿Cuál es la diferencia entre referencias y objetos en Java?
Advertencia: '&' puede operar en arreglos pero '&&' solo puede operar en escalares. – gnovice
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
@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