C # condicional Y (&&) O (||) precedencia


Nos metemos en argumentos de codificación innecesarios en mi trabajo todo el tiempo. Hoy pregunté si condicional Y ( & & ) o O ( | | ) tenían mayor precedencia. Uno de mis compañeros de trabajo insistió en que tenían la misma prioridad, yo tenía dudas, así que lo busqué.

Según MSDN AND (&&) tiene mayor precedencia que OR (||). Pero, ¿puedes demostrárselo a un compañero de trabajo escéptico?

Http://msdn.microsoft.com/en-us/library/aa691323 (VS.71).aspx

bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as 
bool result = false || (true && false); // --> false

Así que mi pregunta es ¿cómo demostrar con el código que Y (&&) tiene una mayor precedencia que O (//)? Si su respuesta es que no importa, entonces ¿por qué está construido de esa manera en el idioma?

Author: Josiah Ruddell, 2009-07-29

6 answers

Cambie el primer falso por verdadero. Sé que parece estúpido tener (cierto / / cierto) pero prueba tu punto.

bool result = true || true && false;   // --> true 
     result = (true || true) && false; // --> false
     result = true || (true && false); // --> true
 92
Author: Francis B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-05 05:18:46

Si realmente quieres asustarlo prueba:{[18]]}

bool result = True() | False() && False();

Console.WriteLine("-----");
Console.WriteLine(result);

static bool True()
{
    Console.WriteLine(true);
    return true;
}

static bool False()
{
    Console.WriteLine(false);
    return false;
}

Esto se imprimirá:

True
False
False
-----
False

Editar:

En respuesta al comentario:

En C#, | es un operador lógico que realiza la misma lógica booleana que ||, pero no hace cortocircuito. También en C#, el operador | tiene mayor precedencia que || y &&.

Al imprimir los valores, puede ver que si utilizo el operador típico ||, solo se imprimiría el primer True - seguido por el resultado de la expresión que habría sido True también.

Pero debido a la mayor precedencia de |, el true | false se evalúa primero (lo que resulta en true) y luego ese resultado es && ed con false para producir false.

No estaba tratando de mostrar el orden de la evaluación, solo el hecho de que la mitad correcta del | fue evaluado período cuando normalmente no sería :)

 9
Author: John Rasch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-29 16:48:17

No lo demuestras con código sino con lógica. AND es multiplicación booleana mientras que OR es adición booleana. Ahora, ¿cuál tiene mayor precedencia?

 7
Author: EFraim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-28 21:08:52

¿No conseguirías esto lo que buscas? O tal vez me estoy perdiendo algo...

bool result = true || false && false;
 5
Author: Max Schmeling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-28 21:05:22

False / / true & & true

Rinde: verdadero

False & & true / / true

Rinde: verdadero

 0
Author: veggerby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-28 21:07:40

No puede simplemente mostrar el resultado final cuando sus expresiones booleanas están siendo cortocircuitadas. Aquí hay un fragmento que resuelve su caso.

Se basa en la implementación de & y / operadores utilizados por & & y|/, como se indica en MSDN 7.11 Operadores lógicos condicionales

public static void Test()
{
    B t = new B(true);
    B f = new B(false);

    B result = f || t && f;

    Console.WriteLine("-----");
    Console.WriteLine(result);
}

public class B {
    bool val;
    public B(bool val) { this.val = val; }
    public static bool operator true(B b) { return b.val; }
    public static bool operator false(B b) { return !b.val; }
    public static B operator &(B lhs, B rhs) { 
        Console.WriteLine(lhs.ToString() + " & " + rhs.ToString());
        return new B(lhs.val & rhs.val); 
    }
    public static B operator |(B lhs, B rhs) { 
        Console.WriteLine(lhs.ToString() + " | " + rhs.ToString());
        return new B(lhs.val | rhs.val); 
    }
    public override string ToString() { 
        return val.ToString(); 
    }
}

La salida debe mostrar que && se evalúa primero antes de ||.

True & False
False | False
-----
False

Para mayor diversión, pruébelo con result = t || t && f y vea qué sucede con los cortocircuitos.

 -3
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-28 23:38:45