Pregunta

En C #, ¿se garantiza que las expresiones se evalúen de izquierda a derecha?

Por ejemplo:

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

¿Hay algún idioma que no cumpla?

¿Fue útil?

Solución

En realidad, se refiere a una característica del lenguaje llamada "expresiones lógicas de cortocircuito":

Lo que esto significa es esto: cuando el resultado de una expresión lógica ya no puede cambiar, p. cuando está claro que la expresión se evaluará como "verdadero" o "falso" pase lo que pase, las partes restantes de la expresión no serán evaluadas.

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

En su caso, si MyClass no es nulo:

  • MyClass == null se evalúa como falso
  • 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 se evalúa como verdadero
  • ya que es un '' o '' expresión, no importa lo que sigue
  • no se realiza más evaluación, el resultado final es verdadero

Hay lenguajes que no provocan un cortocircuito en las expresiones lógicas. VB clásico es un ejemplo, aquí "myClass.Property > 0 '' se evaluaría y produciría un error si MyClass fuera nulo (llamado "Nada" en VB).

Otros consejos

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

  

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

Entonces sí, estás bien.

En cuanto a otros idiomas: nunca me gusta hablar para todos idiomas. En VB.NET, puede usar OrElse y AndAlso que están en cortocircuito, pero Or y And no lo son.

Pero ten cuidado:

si tienes algo como

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

con efectos secundarios en var, no está definido (en C, no estoy seguro de si el orden de evaluación está definido en otros lenguajes), en qué orden se ejecutan func1 () y func2 () (depende, en qué orden (izquierda o derecha) los argumentos se colocan en la pila y se evalúan desde allí.

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

Los operadores y / o en lenguajes como Ada, Visual Basic y Pascal no provocan cortocircuitos. Proporcionan operadores adicionales para permitir esa funcionalidad, como " y luego " y '' o bien '' en Ada.

No estoy seguro, ¿está realmente interesado en el pedido o en la evaluación de cortocircuito?

No estoy 100% seguro, pero que yo sepa, 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 (& amp; en lugar de & amp; & amp;). Normalmente desea hacer un cortocircuito, pero puede ser un caso en el que desea ejecutar todas las evaluaciones.

Python tiene operadores de cortocircuito o y y .

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top