2009-05-07 8 views
7

Situación: comprobación del estado en C++ o C# con muchos criterios:En C++ y C#, ¿se realizan múltiples verificaciones de condición en una secuencia predeterminada o aleatoria?

if (condition1 && condition2 && condition3) 
{ 
    // Do something 
} 

Siempre he creído que la secuencia en que se realizan estas comprobaciones no está garantizada. Por lo tanto, no es necesariamente la primera condición1, luego la condición2 y solo la condición3. Lo aprendí en mis tiempos con C++. Creo que me lo dijeron o lo leyeron en alguna parte.

Hasta saber siempre he escrito código de seguridad para tener en cuenta posibles punteros nulos en la siguiente situación:

if ((object != null) && (object.SomeFunc() != value)) 
{ 
    // A bad way of checking (or so I thought) 
} 

Así escribía:

if (object != null) 
{ 
    if (object.SomeFunc() != value) 
    { 
     // A much better and safer way 
    } 
} 

Debido a que no estaba seguro de la la comprobación no nula se ejecutará primero y solo entonces se llamará al método de instancia para realizar la segunda comprobación.

Ahora nuestras mentes más grandes de la comunidad me están diciendo que la secuencia en la que se realizan estas comprobaciones está garantizada para ejecutarse en el orden de izquierda a derecha.

Estoy muy sorprendido. ¿Es realmente así para los lenguajes C++ y C#?

¿Alguien más ha escuchado la versión que escuché antes?

+1

Las subexpresiones en C# se evalúan de izquierda a derecha, siempre, punto. Las subexpresiones en C/C++ se evalúan en orden de secuencia de puntos. Dos expresiones en el mismo punto de secuencia se pueden evaluar en cualquier orden. Haga una búsqueda web en "punto de secuencia" si necesita una definición formal. –

Respuesta

14

Respuesta corta de izquierda a derecha con evaluación de cortocircuito. El orden es predecible

// perfectly legal and quite a standard way to express in C++/C# 
if(x != null && x.Count > 0) ... 

Algunas lenguas evalúan todo en la condición antes de ramificación (VB6 por ejemplo).

// will fail in VB6 if x is Nothing. 
If x Is Not Nothing And x.Count > 0 Then ... 

Ref: MSDN C# Operators y su orden o prioridad.

+0

@Robert: ¿No quiere decir "si x no es nada && ..." (o sintaxis VB6 equivalente)? – RichieHindle

+1

@RichieHindle - sí, mi recuerdo de VB6/VBScript es afortunadamente muy viejo. Actualizaré –

2

Se definen para ser evaluados de izquierda a derecha, y para dejar de evaluar cuando uno de ellos se evalúa como falso. Eso es cierto tanto en C++ como en C#.

0

No creo que haya o haya habido otra forma. Eso sería como si el compilador decidiera ejecutar declaraciones fuera de servicio sin ningún motivo. :) Ahora, algunos lenguajes (como VB.NET) tienen diferentes operadores lógicos para cortocircuitar y no cortocircuitar. Pero, el orden siempre está bien definido en el momento de la compilación.

Aquí está el operator precedence de la especificación del lenguaje C#. A partir de la especificación ...

A excepción de los operadores de asignación, todos los operadores binarios son asociativo por la izquierda, lo que significa que operaciones se realizan de izquierda a derecha . Por ejemplo, x + y + z es evaluado como (x + y) + z.

+0

De nuevo, la precedencia, la asociatividad y el orden de la evaluación de la subexpresión son tres cosas diferentes. No puede determinar el orden desde la precedencia en C#. –

+0

Además, lamento que la especificación esté mal redactada en el bit que citó. He estado tratando de arreglarlo. –

+0

Sí, veo tu punto. Es contrario a la intuición, pero supongo que la operación puede asociarse por la izquierda y seguir evaluándose de izquierda a derecha. Ambos deben evaluarse antes de poder aplicar la operación, por lo que la precedencia no implica necesariamente un orden de evaluación. Pero entonces tendrías que renunciar al cortocircuito como un cortocircuito && no funcionaría (necesariamente) con dos operadores y tres operandos y || el cortocircuito no funcionaría con dos. –

0

Deben realizarse de izquierda a derecha. Esto permite que funcione la evaluación de cortocircuitos.

Consulte el Wikipedia article para obtener más información.

Cuestiones relacionadas