C # condizionale AND (&&) OR (||) la precedenza
-
20-09-2019 - |
Domanda
Si arriva in argomenti di codifica inutili al mio lavoro tutto-il-tempo. Oggi ho chiesto se condizionale AND (&&) o OR (||) aveva elevato la precedenza. Uno dei miei colleghi ha insistito che avevano la stessa precedenza, avevo dei dubbi, così ho guardato in su.
Secondo MSDN AND (&&) ha precedenza maggiore rispetto OR (||). Ma, si può dimostrare a un collega scettico?
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
Quindi la mia domanda è come si fa a dimostrare con il codice che AND (&&) ha una priorità più alta che OR (||)? Se la risposta è che non importa, allora perché è costruito in questo modo nel linguaggio?
Soluzione
Modifica del primo falso dal vero. So che sembra stupido avere (true || vero), ma si dimostra il punto.
bool result = true || true && false; // --> true
result = (true || true) && false; // --> false
result = true || (true && false); // --> true
Altri suggerimenti
Se si vuole veramente a freak lui fuori try:
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;
}
Questa stampa volontà:
True
False
False
-----
False
Modifica:
In risposta al commento:
In C #, |
è un operatore logico che esegue la stessa logica booleane ||
, ma non lo fa corto circuito. Anche in C #, l'operatore |
ha una precedenza superiore rispetto sia ||
e &&
.
Per la stampa i valori, si può vedere che se ho usato l'operatore tipico ||
, solo il primo True
sarebbe stampato -. Seguita dal risultato dell'espressione che sarebbe stato True
anche
Ma a causa della maggiore precedenza di |
, il true | false
viene valutata per prima (con conseguente true
) e poi tale risultato è &&
ed con false
cedere false
.
Non stavo cercando di mostrare l'ordine di valutazione, solo il fatto che la metà destra del |
è stata valutata periodo in cui normalmente non sarebbe:)
Non sarebbe questo ottenere quello che stai dopo? O forse mi manca qualcosa ...
bool result = true || false && false;
Non provare con il codice, ma con la logica. E è moltiplicazione booleana che OR è aggiunta booleana. Ora che si ha maggiore precedenza?
false || vero && true
I rendimenti: true
false && vero || true
I rendimenti: true
Non si può semplicemente mostrare il risultato finale, quando le espressioni booleane sono in corso in corto circuito. Ecco un frammento che si deposita il vostro caso.
Si basa sull'attuazione & e | operatori utilizzati da && e ||, come indicato nel MSDN 7.11 operatori logici condizionali
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();
}
}
L'output dovrebbe mostrare che && viene valutato prima ||.
True & False
False | False
-----
False
Per divertimento in più, provare con risultato = t || t && f e vedere cosa succede con corto circuito.