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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top