Respuesta

14

En realidad se refiere a una característica del lenguaje llamado "cortocircuitar" expresiones lógicas:

Lo que esto significa es la siguiente: Cuando el resultado de una expresión lógica no puede cambiar nunca más, por ejemplo, cuando está claro que la expresión se evaluará como "verdadera" o "falsa" sin importar qué, las partes restantes de la expresión no serán evaluadas.

Por ejemplo, C#, Java o JavaScript hacen eso, y puede confiar en ellos en esos idiomas (para responder a su pregunta).

En su caso, si MyClass no es nulo:

  • MyClass == null evalúa como falsa
  • ya que es un "o" expresión, la segunda parte todavía puede cambiar el resultado, por lo que se evalúa
  • myClass.Property > 0 determina el resultado final

si MyClass es nulo:

  • MyClass == null un resultado verdadero
  • ya que es un "o" expresión, no importa lo que sigue
  • se hace no más de evaluación, el resultado final es cierto

hay lenguajes que hacen no cortocircuitar expresiones lógicas. El VB clásico es un ejemplo, aquí "myClass.Property> 0" se evaluaría y produciría un error si MyClass fuera nulo (llamado "Nothing" en VB).

0

El orden de evaluación depende del operador, en este caso el booleano o (||) se define como lo que comúnmente se llama short-circuiting, para realizar construcciones como esta.

5

El cortocircuito se describe en la sección 7.11 de la C# 3.0 spec:

La operación x || y corresponde a la operación x | y, excepto que y es evaluado solo si x no es verdadero.

Así que sí, estás bien.

En cuanto a otros idiomas - No me gusta hablar de todos los idiomas. En VB.NET, puede usar OrElse y AndAlso que están en cortocircuito, pero claro O y Y no lo son.

2

Pero tenga cuidado:

si tiene algo así como

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

con efectos colaterales en var, no está definido (en C, no estoy seguro de si el orden de evaluación está definido en otros idiomas), en qué orden se ejecutan func1() y func2(), depende de qué fin (izquierda o derecha) los argumentos se ponen en la pila y se evalúan a partir de ahí.

+0

En C# se define el orden preciso. – Martijn

0

no estoy seguro, ¿estás realmente interesado en orden o en la evaluación de cortocircuito?

no estoy 100 % seguro, pero hasta donde sé, el orden de evaluación siempre será el mismo en C# (y supongo que la mayoría si no todos los lenguajes .net). La evaluación de cortocircuito funciona como se explicó en las respuestas anteriores.

Sin embargo, en C# puede elegir no cortocircuitar utilizando operadores simples (& en lugar de & &). Normalmente quiere un cortocircuito, pero puede ser un caso en el que quiera ejecutar todas las evaluaciones.

0

Los operadores y/o en idiomas como Ada, Visual Basic y Pascal no producen cortocircuitos. Proporcionan operadores adicionales para permitir esa funcionalidad, como "y luego" y "o lo demás" en Ada.

0

Python tiene cortocircuitos or y and operadores.

0

En Java y Haskell & & y || cortocircuito también.

Interesante a un lado: en Haskell esto viene naturalmente con el lenguaje (puede definir sus propios operadores que hacen esto), mientras que en Java y C# es específico para esos dos operadores.

0

En realidad, el cortocircuito es parte, pero también necesita saber si el lenguaje garantiza la evaluación de izquierda a derecha de aquellos. Por ejemplo, C (ANSI, ISO, C99) NO garantiza la evaluación de izquierda a derecha. En el código de ejemplo, sería posible verificar el valor de Property antes de buscar NULL o hacer ambas cosas simultáneamente ... la mayoría de los compiladores no lo hacen, pero no hay nada que lo impida y sea totalmente compatible con la especificación. Incluso le dice que NO escriba este código debido a esto.

Cuestiones relacionadas