Qual é a diferença entre & e && no MATLAB?

Respostas:

93

O único e comercial & é o operador AND lógico. O "e" comercial duplo && é novamente um operador AND lógico que emprega comportamento de curto-circuito. Curto-circuito significa apenas que o segundo operando (lado direito) é avaliado apenas quando o resultado não é totalmente determinado pelo primeiro operando (lado esquerdo)

A e B (A e B são avaliados)

A && B (B só é avaliado se A for verdadeiro)

Fraser
fonte
75
Em advertência: &pode operar em matrizes, mas &&só pode operar em escalares.
gnovice
Nota lateral: depois de 15 anos trabalhando com Matlab quase diariamente eu sempre uso '&' e ele nunca me mordeu na bunda. OTOH, eu conheço muitas pessoas que ficam irritadas usando '&&' porque eles precisam se lembrar que não é universal (sim, eu percebo que '&' não é tão eficiente porque não causa curto-circuito, mas eu praticamente nunca daisy- cadeia meus operandos, então a economia hoje em dia é insignificante).
Eric,
7
@neuronet não se trata realmente de eficiência, mais do que permite uma construção onde a primeira expressão garante uma condição sem a qual a segunda expressão pode causar um erro em tempo de execução. por exemplo, d != 0 && 1/dvs d !=0 & 1/d- o primeiro garante nenhuma divisão por zero, o segundo não.
Fraser
2
Esta resposta está incompleta e imprecisa. &faz curto-circuito se em uma ifdeclaração. E &&recebe entradas escalares. A resposta de @Loren abaixo está correta.
Cris Luengo de
2
Observe também que Loren é uma funcionária da MathWorks. Uma resposta não é mais confiável do que isso. Se você estiver disposto a fazer um sacrifício, pode sinalizar sua resposta para um mod para excluí-lo (você não pode excluí-lo, porque é aceito). Você manteria a reputação que ganhou com ele (se eu entendi o sistema corretamente), e terminaríamos com uma resposta superior tecnicamente correta e confiável.
Andras Deak
35

&&e ||tomar entradas escalares e sempre em curto-circuito. |e &pegar entradas de array e causar curto-circuito apenas em instruções if / while. Para atribuição, este último não causa curto-circuito.

Veja essas páginas de documentos para mais informações.

Loren
fonte
1
Você tem alguma informação sobre quais atalhos de versões do Matlab &e |em declarações if / while? Não parece ser o caso em R2012b e R2014a.
Tim
@Loren tem alguma ideia de por que eles projetaram um para trabalhar apenas com escalares? Parece estranho ...
Eric,
@neuronet: Você não pode entrar em curto-circuito se operar em matrizes.
Cris Luengo
17

Como já foi mencionado por outros, &é um operador AND lógico e &&um operador AND de curto-circuito . Eles diferem em como os operandos são avaliados , bem como se operam ou não em matrizes ou escalares:

  • &(Operador AND) e |(operador OR) podem operar em matrizes de maneira elementar.
  • &&e ||são versões de curto-circuito para as quais o segundo operando é avaliado apenas quando o resultado não é totalmente determinado pelo primeiro operando. Eles só podem operar em escalares , não em matrizes.
gnovice
fonte
8

Ambos são operações lógicas AND. O &&, entretanto, é um operador de "curto-circuito". Dos documentos do MATLAB:

Eles são operadores de curto-circuito porque avaliam seu segundo operando apenas quando o resultado não é totalmente determinado pelo primeiro operando.

Veja mais aqui .

Marca
fonte
6

Semelhante a outras linguagens, &é um operador lógico bit a bit, enquanto &&é uma operação lógica.

Por exemplo (perdoe minha sintaxe).

E se..

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

..ou..

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

Para &&, o operando direito só é calculado se o operando esquerdo for verdadeiro e o resultado for um único valor booleano.

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

Espero que esteja claro.

Erik Kerber
fonte
3
Não é bit a bit, é elementar.
Cris Luengo de
3
Eu acabei de ficar bem 10 anos depois? 😺
Erik Kerber de
Bem, esta pergunta obteve cerca de 115 mil visualizações até agora, o que significa que muitas pessoas leram informações incorretas aqui. Muitas dessas respostas estão incompletas ou contêm informações incorretas. Tudo que você precisa fazer é corrigir sua resposta ou excluí-la. BTW: bitandé o operador AND lógico bit a bit no MATLAB.
Cris Luengo
4

&& e || são operadores de curto-circuito operando em escalares. & e | operar em matrizes e usar curto-circuito apenas no contexto de expressões de loop ifou while.

Dima
fonte
2

Uma boa regra ao construir argumentos para uso em declarações condicionais (IF, WHILE, etc.) é sempre usar o && / || formulários, a menos que haja uma boa razão para não o fazer. Existem duas razões ...

  1. Como outros mencionaram, o comportamento de curto-circuito de && / || é semelhante à maioria das linguagens semelhantes a C. Essa semelhança / familiaridade é geralmente considerada um ponto a seu favor.
  2. Usando o && ou || forms força você a escrever o código completo para decidir sua intenção para argumentos vetoriais. Quando a = [1 0 0 1] e b = [0 1 0 1], a & b é verdadeiro ou falso? Não consigo me lembrar das regras para o MATLAB e você consegue? A maioria das pessoas não consegue. Por outro lado, se você usar && ou ||, você é FORÇADO a escrever o código "por completo" para resolver a condição.

Fazer isso, em vez de depender da resolução de vetores do MATLAB em & e |, leva a um código um pouco mais detalhado, mas MUITO mais seguro e fácil de manter.

Bob Gilmore
fonte
1
+1, mas deve-se observar que sua resposta só se aplica aos casos em que você deseja que o resultado final da operação seja escalar. Existem muitos usos para & e | onde && e || são inúteis porque não podem retornar arrays, por exemplo, ao fazer indexação sofisticada como "selecionar todos os r entre 1 e 2: r((r<2)&(r<2))".
Jonas Heidelberg
Bem pensado, Jonas. Eu estava pensando em condicionais, não em "indexação lógica" (o termo do MATLAB para a "indexação sofisticada" que você mencionou) quando escrevi isso. Mudei a primeira frase da minha postagem para refletir isso. Obrigado pela lembrança!
Bob Gilmore