É “curto-circuito booleano” ditada pelo padrão ou apenas usado principalmente como otimização? [duplicado]

StackOverflow https://stackoverflow.com/questions/852676

Pergunta

Considere isto

Class* p = NULL;
if( p != NULL && p->Method() == OK ){

  // stuff
}

Em todos os compiladores que eu trabalhei com, isso é bastante seguro. Ou seja, a primeira parte da expressão booleana será avaliada como false , e a chamada para o método () irá, portanto, não ser tentada desde a avaliação da segunda parte é redundante.

É isto porque a maioria dos compiladores irá otimizar afastado a avaliação da segunda parte, ou é um comportamento ditado dos padrões C / C ++?

Foi útil?

Solução

Isso é chamado boolean curto-circuito e é definido em muitas línguas. Aqui é um artigo da Wikipedia que descreve quais idiomas têm esta característica.

Agora que você sabe o nome correto para o recurso, há outros artigos SO sobre isso também.

Outras dicas

corte curto expressão é garantida pela norma.

? ++ Padrão 1998
Seção 5.14

Os && grupos de operadores da esquerda para a direita. Os operandos são ambos implicitamente convertido para o tipo booleano (item 4). o resultado é verdadeiro se ambos os operandos são verdadeiro e falso caso contrário. Ao contrário &, && garante da esquerda para a direita avaliação: o segundo operando não é avaliado se o primeiro operando é falsa.

Eu não vi ele mencionou ainda, assim:

O curto-circuito é garantido pelo C ++ exceto quando o && ou || operador sendo invocado está sobrecarregado . Mas não faça isso, porque ele está muito confuso.

Este é um recurso chamado curtos-circuitos. Este comportamento é garantido pelo C ++ padrão. Eu não acredito que é uma otimização por assim dizer, mas é muito mais do que simplesmente um recurso de linguagem.

Não é apenas a otimização, é útil para deixá-lo ser mais conciso.

Tal como o seu exemplo mostra, ele permite que você escrever uma declaração dereferencing "seguro" em uma linha. Caso contrário, você tem que fazer algo como:

if (p != null) {
    if (p.getValue() == 3) {
        // do stuff
    }
}

Parece trivial, mas tente codificação em um idioma que não tê-lo (por exemplo, VB6) e você começa a intensamente perder-lo.

É nos padrões de linguagem como outras respostas mencionar, mas só porque algo como isso precisa ser claramente especificadas. Que pode, eventualmente, compilar para baixo para código otimizado é um efeito colateral; nos dias de hoje, um digno compilador C ou C ++ seria compilar os de uma linha ou duas linhas declarações equivilently

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top