Pergunta

Em C # é garantido que expressões são avaliadas esquerda para a direita?

Por exemplo:

myClass = GetClass();  
if (myClass == null || myClass.Property > 0)  
    continue;

Existem línguas que não cumprem?

Foi útil?

Solução

Você realmente se referir a um recurso de linguagem chamado de "curto-circuito expressões lógicas":

O que isto significa é esta: quando o resultado de uma expressão lógica não pode mudar mais, por exemplo, quando é evidente que a expressão será avaliada como "verdadeiro" ou "falso" não importa o que, restantes partes a expressão não será avaliada.

Por exemplo, C #, Java ou JavaScript fazer isso, e você pode contar com ele nessas línguas (para responder a sua pergunta).

No seu caso, se MyClass não é nulo:

  • avalia MyClass == null para false
  • uma vez que é um "ou" expressão, a segunda parte ainda pode alterar o resultado, por isso é avaliada
  • myClass.Property > 0 determina o resultado final

Se MyClass é nulo:

  • avalia MyClass == null para true
  • uma vez que é um "ou" expressão, não importa o que se segue
  • não mais avaliação é feita, o resultado final é true

Existem línguas que fazem expressões lógicas não curto-circuito. VB clássico é um exemplo, aqui "myClass.Property> 0" seria avaliada e produzir um erro se MyClass foi nula (chamado de "Nada" em VB).

Outras dicas

O curto-circuito é descrito na secção 7.11 de a C # 3.0 especificação:

A x funcionamento || y corresponde a a operação x | y, excepto que y é avaliado somente se x não é verdade.

Então, sim, você está bem.

Como para outras línguas - Eu nunca gosto de falar para todas idiomas. Em VB.NET, você pode usar OrElse e AndAlso que estão em curto-circuito, mas simples ou e E não são.

Mas cuidado:

Se você tem algo parecido

sprintf (buf, "% s% s", func1 (e var), func2 (e var));

com efeitos colaterais sobre var, não é definido (em C, eu não tenho certeza se a ordem de avaliação é definida em outros idiomas), em que ordem func1 () e func2 () são executados (que depende, em que ordem (esquerda ou direita) os argumentos são colocados na pilha e avaliada a partir de lá.

A ordem de avaliação depende do operador, neste caso o booleano ou (||) é definida para ser o que é comumente chamado de curto-circuito , para fazer construções como este trabalho.

O e / ou operadores em linguagens como Ada, Visual Basic, e Pascal não curto-circuito. Eles fornecem aos operadores extras para permitir essa funcionalidade, como "e depois" e "ou então" em Ada.

Eu não tenho certeza, você está realmente interessado em ordem ou em curto-circuito avaliação?

Eu não estou 100% de certeza, mas, tanto quanto eu sei a ordem de avaliação será sempre o mesmo em C # (e presumo que a maioria, se não todos linguagens .NET). avaliação de curto-circuito funciona como explicado nas respostas anteriores.

No entanto, em C # você pode optar por não curto-circuito usando operadores simples (e, em vez de &&). Normalmente você quer curto-circuito, mas pode ser um caso em que você quer executar todas as avaliações.

Python tem or e and operadores de curto-circuito.

Em Java e Haskell && e || curto-circuito também.

aparte interessante:. Em Haskell isso vem naturalmente com a linguagem (você pode definir seus próprios operadores que fazem isso), enquanto em Java e C # é específica para esses dois operadores

Na verdade curto-circuito faz parte, mas você também precisa saber se as garantias de idiomas da esquerda para a direita avaliação desses. Por exemplo C (ANSI, ISO, C99) não garantem a avaliação da esquerda para a direita. No código de exemplo, seria possível verificar o valor da propriedade antes de verificar para NULL ou fazer as duas coisas ao mesmo tempo ... a maioria dos compiladores não fazer, mas não há nada impedindo-o de fazer isso e ser totalmente compatível com a especificação. Ele ainda diz-lhe para não escrever tal código por causa disso.

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