Qual è la differenza tra AND logico e condizionale, OPPURE in C #?

Possibile duplicato:
Qual è la differenza tra i | e || o operatori?

AND logico e OR:

(x & y) (x | y) 

Condizionale AND e OR:

 (x && y) (x || y) 

Ho solo conosciuto gli operandi condizionali fino a questo punto. So cosa fa e come applicarlo nelle if-statement. Ma qual è lo scopo degli operandi logici?

    Preferisco considerarlo come “bitwise vs. condizionale” piuttosto che “logico vs condizionale” poiché il concetto generale di “logico” si applica in entrambi i casi.

     x & y // bitwise AND, 0101 & 0011 = 0001 x | y // bitwise OR, 0101 | 0011 = 0111 x && y // true if both x and y are true x || y // true if either x or y are true 

    modificare

    A grande richiesta, dovrei anche menzionare che gli argomenti sono valutati in modo diverso. Nella versione condizionale, se il risultato dell’intera operazione può essere determinato dal primo argomento, il secondo argomento non viene valutato. Questo è chiamato valutazione di cortocircuito. Le operazioni bit a bit devono valutare entrambi i lati per calcolare il valore finale.

    Per esempio:

     x.foo() && y.bar() 

    Questo chiamerà solo y.bar() se x.foo() true . Al contrario,

     x.foo() || y.bar() 

    chiamerà solo y.bar() se x.foo() false .

     (x && y) 

    è pigro. Valuterà solo se x è vero.

     (x & y) 

    non è pigro. sarà sempre valutato

    Risposta aggiornata : il mio originale era fuorviante e incompleto.

    Per prima cosa dovrei scusarmi per molti dei miei commenti e risposte a questa domanda.

    Dopo aver letto le specifiche, la distinzione tra operatori bit a bit e operatori condizionali è molto meno chiara.

    Secondo la sezione 14.10 dell’ECMA-334 :

    Il &, ^, e | gli operatori sono chiamati operatori logici.

    per le operazioni su interi:

    1 L’operatore & calcola l’AND logico bit a bit dei due operandi, il | l’operatore calcola l’OR logico bit a bit dei due operandi e l’operatore ^ calcola l’OR logico bit per bit esclusivo dei due operandi. 2 Non sono possibili overflow da queste operazioni.

    Secondo la sezione 14.11:

    Il && e || gli operatori sono chiamati operatori logici condizionali. 2 Sono anche chiamati operatori logici “cortocircuitanti”.

    14.11.1

    1 Quando gli operandi di && or || sono di tipo bool, o quando gli operandi sono di tipi che non definiscono un operatore applicabile o operatore |, ma definiscono le conversioni implicite in bool, l’operazione viene elaborata come segue: 2 L’operazione x && viene valutata come x? y: falso. 3 In altre parole, x viene prima valutato e convertito in tipo bool. 4 Quindi, se x è vero, y viene valutato e convertito in type bool, e questo diventa il risultato dell’operazione. 5 Altrimenti, il risultato dell’operazione è falso. 6 L’operazione x || y è valutato come x? vero: y. 7 In altre parole, x viene prima valutato e convertito in tipo bool. 8 Quindi, se x è vero, il risultato dell’operazione è vero. 9 Altrimenti, y viene valutato e convertito in type bool, e questo diventa il risultato dell’operazione.

    14.11.2

    1 Quando gli operandi di && or || sono dei tipi che dichiarano un operatore definito dall’utente o un operatore |, devono essere entrambi veri i seguenti, dove T è il tipo in cui l’operatore selezionato è dichiarato: 2 Il tipo di ritorno e il tipo di ciascun parametro del selezionato l’operatore deve essere T. 3 In altre parole, l’operatore deve calcolare l’OR logico o l’OR logico di due operandi di tipo T e deve restituire un risultato di tipo T. 4 T deve contenere dichiarazioni di operatore true e operatore false. Paragrafo 2 1 Si verifica un errore in fase di compilazione se uno di questi requisiti non è soddisfatto. 2 Altrimenti, il && or || l’operazione viene valutata combinando l’operatore definito dall’utente true o l’operatore false con l’operatore definito dall’utente selezionato: 3 L’operazione x && è valutata come T.false (x)? x: T. & (x, y), dove T.false (x) è una chiamata dell’operatore false dichiarato in T, e T. & (x, y) è una chiamata dell’operatore selezionato &. 4 In altre parole, x viene prima valutato e l’operatore false viene invocato sul risultato per determinare se x è definitivamente falso. 5 Quindi, se x è definitivamente falso, il risultato dell’operazione è il valore precedentemente calcolato per x. 6 Altrimenti, y viene valutato e l’operatore selezionato viene richiamato sul valore precedentemente calcolato per x e il valore calcolato per y per produrre il risultato dell’operazione. 7 L’operazione x || y è valutato come T.true (x)? x: T. | (x, y), dove T.true (x) è una chiamata dell’operatore true dichiarata in T, e T. | (x, y) è una chiamata dell’operatore selezionato |. In altre parole, x viene prima valutato e l’operatore true viene invocato sul risultato per determinare se x è sicuramente true. 9 Quindi, se x è sicuramente true, il risultato dell’operazione è il valore precedentemente calcolato per x. 10 Altrimenti, y viene valutato e l’operatore selezionato | viene invocato sul valore precedentemente calcolato per x e il valore calcolato per y per produrre il risultato dell’operazione. Paragrafo 3 1 In ognuna di queste operazioni, l’espressione data da x viene valutata solo una volta e l’espressione data da y non viene valutata o valutata esattamente una volta. Paragrafo 4 1 Per un esempio di un tipo che implementa l’operatore true e l’operatore false, consultare §18.4.2.