Pregunta

entrar en discusiones innecesarias de codificación en mi trabajo todo el tiempo. Hoy me preguntaron si condicional AND (&&) u OR (||) tenían mayor precedencia. Uno de mis compañeros de trabajo insistido en que tenían la misma precedencia, que tenía dudas, así que busqué.

Según MSDN AND (&&) tiene mayor precedencia que OR (||). Sin embargo, se puede demostrar a un compañero de trabajo escépticos?

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 se puede demostrar con el código que Y (&&) tiene una prioridad más alta que O (||)? Si su respuesta es no importa, entonces ¿por qué se construyó de esa manera en el idioma?

¿Fue útil?

Solución

Cambiar la primera falsa por cierto. Ya sé que parece estúpido tener (verdadero || cierto) pero demuestra su punto.

bool result = true || true && false;   // --> true 
     result = (true || true) && false; // --> false
     result = true || (true && false); // --> true

Otros consejos

Si realmente quiere asustarlo intento:

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;
}

Esta impresión voluntad:

True
False
False
-----
False

Editar:

En respuesta al comentario:

En C #, | es un operador lógico que realiza la misma lógica booleana como ||, pero no lo hace cortocircuito. También en C #, el operador | tiene una prioridad más alta que tanto || y &&.

Mediante la impresión de los valores, se puede ver que si he utilizado el operador típico ||, sólo se imprime la primera True -., Seguido por el resultado de la expresión que habría sido también True

Pero debido a la mayor precedencia de |, la true | false se evalúa primero (resultando en true) y entonces ese resultado se &&ed con false para producir false.

No estaba tratando de mostrar el orden de evaluación, sólo el hecho de que la mitad derecha de la | se evaluó período en que normalmente no sería la siguiente:)

No sería esto se obtiene lo que está buscando? O tal vez me falta algo ...

bool result = true || false && false;

No demuestras con código pero con lógica. Y es la multiplicación boolean mientras que OR es además booleano. Ahora lo que uno tiene mayor precedencia?

false || verdadera && true

Los rendimientos: true

false && cierto || true

Los rendimientos: true

No se puede mostrar el resultado final cuando sus expresiones booleanas se están cortocircuitados. He aquí un fragmento que se asienta su caso.

Se basa en la aplicación y e | 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 ||.

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

Para mayor diversión, intentarlo con resultado = t || t && f y ver lo que sucede con los cortocircuitos.

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