&& e || non sono operatori logici ma condizionati?


62

Sono un po 'confuso dalla documentazione MSDN # C, che afferma che &e |sono operatori logici e che &&e ||sono operatori condizionali.

Continuo chiamando &&, ||e !operatori logici, così mi sbaglio?


4
Sembra illogico, ma c'è una differenza importante tra le due classi, ed è fondamentale non supporre che, diciamo, |sia intercambiabile ||, anche se in molti casi possono essere scambiati senza cambiamenti apparenti nel comportamento del programma.
Daniel R Hicks,

Risposte:


120

Sono un po 'confuso dalla documentazione MSDN # C, che afferma che &e |sono operatori logici e che &&e ||sono operatori condizionali. Continuo chiamando &&, ||e !operatori logici, così mi sbaglio?

No; hai ragione.

Esistono numerosi errori di nomenclatura piccoli, per lo più non importanti nella documentazione MSDN; Ho cercato di tirarne fuori il maggior numero possibile, ma nei casi in cui non è egregiamente sbagliato e fuorviante, non è sempre un saggio uso del tempo. Vai alla specifica se desideri un'istruzione definitiva sul nome di una funzione C #.

Quindi: l'autorità pertinente è la specifica C #, che afferma nella sezione 7.11:

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

Quindi continua a suddividere ulteriormente gli operatori logici incorporati in operatori logici interi, enumerazione, booleani e nullable-booleani. Esistono anche operatori logici definiti dall'utente; vedere le specifiche per i dettagli.

Nella sezione 7.12 abbiamo

Gli operatori &&e ||sono chiamati operatori logici condizionali. Sono anche chiamati operatori logici di "corto circuito".

Quindi tutti sono operatori logici . Alcuni di essi sono operatori logici condizionali .

Cosa rende condizionali gli operatori logici condizionali ? Si potrebbe ipotizzare che ciò sia dovuto al fatto che sono in genere utilizzati in istruzioni condizionali ( if) o espressioni condizionali ( ? :). Il vero motivo è dato dalle specifiche:

Gli operatori &&e ||sono versioni condizionali degli operatori &e |: L'operazione x && ycorrisponde all'operazione x & y, tranne che yviene valutata solo se xnon è falsa. L'operazione x || ycorrisponde all'operazione x | y, tranne che yviene valutata solo se xnon è vera.

Gli operatori logici condizionali vengono così denominati perché l'operando di destra viene valutato in modo condizionale in base al valore dell'operando di sinistra.

Possiamo vederlo più vividamente osservando che gli operatori logici condizionali sono solo "zuccheri sintattici" per le espressioni condizionali . x && yè semplicemente un modo più piacevole di scrivere x ? y : falseed x || yè semplicemente un modo più piacevole di scrivere x ? true : y. Le espressioni logiche condizionali sono in realtà espressioni condizionali.

Esiste anche una forma definita dall'utente dell'operatore logico condizionale ed è un po 'complicato. Vedi le specifiche per i dettagli.

Ulteriori letture, se questo argomento ti interessa:


3
@RobertHarvey: Giusto, il fatto che & possa operare su bool, tipi interi o tipi enum ma && funziona solo su bool non ha nulla a che fare con la scelta di nominare uno di essi come forma "condizionale" dell'operatore. L'operatore condizionale è condizionale perché ha un ramo condizionale nella sua semantica di valutazione.
Eric Lippert,

16
Ho l'impressione che il termine "operatore di cortocircuito" sia molto più popolare (e probabilmente meno ambiguo) di "operatore condizionale" nel senso descritto.
Doc Brown,

15
@DocBrown: è sicuramente popolare, ma ho sempre trovato quel nome fuorviante; sembra che sia stato coniato da qualcuno che pensava che un "cortocircuito" e una "scorciatoia" per ottenere un risultato fossero la stessa cosa. Un corto circuito è un guasto pericoloso che può rapidamente distruggere un sistema elettrico. Abbiamo chiamato blocchi "non sicuri" in C # "non sicuri" perché sono pericolosi se usati in modo errato ; non diamo nomi carini ma fuorvianti carichi di valore. Non farmi nemmeno iniziare con l'operatore Elvis. :-)
Eric Lippert,

26
@EricLippert: Mentre il "cortocircuito" può sembrare spaventoso per il grande pubblico, non penso che K&R fosse confuso riguardo alla definizione reale. In ingegneria elettrica, cortocircuitare un circuito non è sempre un errore pericoloso, infatti lo facciamo intenzionalmente tutto il tempo. Significa solo tagliare una parte indesiderata del circuito dando all'elettricità un percorso più breve da seguire.
hackerb9

1
@CortAmmon: ti consigliamo di leggere il paragrafo seguente in cui ti chiamo che la semantica dell'operatore definita dall'utente è leggermente diversa e che dovresti vedere le specifiche per i dettagli.
Eric Lippert,

27

In C # questi sono tutti operatori logici.

int x = 0xABCD & 0xFF // x == 0xCD

&&e ||sono chiamati " operatori logici condizionali " perché sono in corto circuito.

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

Questa terminologia differisce da una lingua all'altra. In C e C ++ &&e ||sono solo operatori logici. In Java, &e |sono chiamati Bitwise Operators , mentre C e C ++ li classificano come Operatori aritmetici .


3
Sì, Microsoft è l'autorità, ma il documento autorevole è la specifica. Vedere la sezione 7.12, Operatori logici condizionali .
Eric Lippert,

8
La morale della storia è: è più importante capire esattamente cosa fanno questi operatori che essere precisi sui loro nomi.
Robert Harvey,

21
Concentrati su ciò che fanno gli operatori e smetti di ossessionarti con il vocabolario. Vedi anche la denominazione considerata dannosa .
Robert Harvey,

4
+1. Tutto ciò che è elencato nella domanda sono solo operatori che accettano una o due espressioni e valutano un valore. Gli aggettivi sono inutili spaccature dei capelli.
Blrfl,

3
@RobertHarvey Saggi "Considerato
dannoso

-2

Il punto è che &e |sono bit a bit operatori, nel senso che sono applicati ai valori e stringhe di bit resa. E bit a bit è un termine molto usato tra i programmatori.

Ad esempio 0xff & 0x00 == 0x00, mentre 0xff | 0x00 == 0xff.

E &&e ||sono applicati alle condizioni e producono i soliti valori delle condizioni; ie truee false.

Ad esempio true && false == false, mentre true || false == true.

Pertanto &&e ||potrebbero essere chiamati operatori condizionali , anche se non è un termine comune tra i programmatori.

Ovviamente, ogni programmatore C, C ++, Java e C # lo sa. Ma immagino che l'incomprensione si verifichi perché "operatore condizionale" non è un termine spesso usato da noi programmatori.


5
Ovviamente, ogni programmatore C, C ++, Java e C # lo sa. È una cosa molto scortese da scrivere, il che implica che l'OP è stupido. Lo stesso scrivendo noi programmatori , si esclude l'OP. Per favore, non farlo.
DarkDust,

1
Non credo che la tua risposta successiva apporti alcun valore aggiunto dopo la risposta accettata da Eric Lippert, e inoltre è errata nel significato di non capire il punto della domanda.
Honza Zidek,

@DarkDust Ogni programmatore C, C ++, Java e C # dovrebbe comprendere quegli operatori. Questo non è essere scortese ma un dato di fatto .
Fil 1970,

1
@ Phil1970: OP sembra capire questi operatori, si tratta di chiarire la denominazione . Alla luce di ciò, e avendo enfatizzato i termini rilevanti nella risposta di Hilton, quella frase può essere interpretata nel senso che ogni programmatore conosce questi dettagli di denominazione, ma tu no . Questo è sbagliato (come si può vedere nelle discussioni sulle altre risposte) e la sua formulazione è scortese.
DarkDust,

4
Carissimi, mi dispiace se la mia risposta è stata scortese. L'inglese non è la prima lingua. In ogni caso, non ho mai avuto intenzione di sottintendere che l'OP non fosse un programmatore. Al contrario, intendevo dire che era confuso da un'insolita denominazione nel testo che leggeva. Tutto quello che ho cercato di fare è stato chiarire l'insolita denominazione dei frammenti di programma.
Hilton Fernandes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.