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?
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
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 :)
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?
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;
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
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.
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