C # condicional AND (&&) OR (||) precedencia
-
20-09-2019 - |
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?
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.