Che cos'è il "cortocircuito" in lingue come C?


14

Ho sentito parlare del termine "corto circuito" utilizzato in C, C ++, C #, Java e molti altri. Cosa significa e in quale scenario verrà utilizzato?


6
C'è un articolo di Wikipedia sul concetto: en.wikipedia.org/wiki/Short-circuit_evaluation È un'ottimizzazione nella valutazione &&dell'operatore.
Wirrbel,

1
@wirrbel Credo che valga anche per ||... almeno dovrebbe.
Radu Murzea,

1
@RaduMurzea Effettivamente. Contrasto ||e &&to &e |per vedere la sottile differenza. Chiedi a un semplice programma di valutare 1 || printf("yay");vs 0 || printf("yay");e 1 | printf("yay");vs 0 | printf("yay");per vedere le differenze
wirrbel,

Risposte:


35

Il corto circuito in C è quando un operatore logico non valuta tutti i suoi argomenti.

Prendiamo ad esempio ed &&è abbastanza ovvio che 0 && WhoCaressarà falso, qualunque cosa WhoCaressia. Per questo motivo, C salta semplicemente la valutazione WhoCares. Lo stesso vale per 1 || WhoCares, sarà sempre vero. Per questo motivo, possiamo scrivere codice come

CanFireMissiles && FireMissiles()

In questo modo evitiamo di compiere un'operazione potenzialmente impossibile. Se non riusciamo a sparare i missili, di certo non vogliamo provarci. Questo è comunemente usato con i puntatori, in particolare i puntatori a file.

 bool isN(int* ptr, int n){
     return ptr && *ptr == n;
 }

Ciò si rivela in molti altri modi utili per evitare elaborazioni non necessarie

 isFileReady() || getFileReady()

Questo evita di fare un lavoro extra se non ne abbiamo bisogno.


1
In qualsiasi momento, se ho risposto alla tua domanda, puoi selezionare la casella accanto per contrassegnare la tua domanda come risposta
Daniel Gratzer,

7
Non mi piace CanFireMissiles && FireMissiles(), poiché mi fa sospettare che stai abusando del corto circuito per innescare effetti collaterali. Sento che stai nascondendo le azioni in modo condizionale. Tale codice è meglio scritto come if(CanFireMissiles){FireMissiles();}o if(CanFireMissles){didFireMissiles = TryFireMissiles(); if(didFireMissiles){...}}.
Brian,

2
Direi che l'unico uso è nascondere gli effetti collaterali. Di solito non è il tipo "Far saltare in aria una città", ma cose come dereferenziare un puntatore o usare le risorse di sistema vengono fatte in questo modo abbastanza spesso in C. Guarda la pagina di Wikipedia, l'intera sezione in uso è "Nascondere gli effetti collaterali"
Daniel Gratzer,

2
@jozefg puoi anche usarlo per evitare operazioni costose come IsInCache(value) || IsInDatabase(value), in cui IsInDatabase potrebbe richiedere del tempo (soprattutto se l'utilizzo di un dispositivo mobile e la latenza della rete sono un problema).
mgw854,

4

"Cortocircuito" si riferisce in genere alla " Valutazione del cortocircuito " che è un concetto generale, non solo specifico per C.

Valutazione degli operatori booleani da sinistra a destra, quindi tutti i termini che renderanno inutili gli altri termini sono utili. Quindi potresti verificare una condizione che esclude altre condizioni in un secondo momento, consentendo così una valutazione parziale delle operazioni logiche piuttosto che la valutazione del tutto.

Esempio:

while((x && y) == 1) {
    //This bit will not execute if x is 0 or y is 0 but y won't even be 
    //evaluated due to short circuit evaluation if x is 0.
}

Un esempio più complesso:

if((a || b || c || d || e || f || g || h || i || j || k) == 1) {
    /* If any of these are equal to 1 the whole expression is equal to 1,
     * thus doesn't it make sense to short circuit evaluate this?
     * Saves a bunch of time.
     */
}

8
Il cortocircuito riguarda meno il risparmio di tempo ma più la non valutazione. Una funzione non valutata non avrà inoltre l'effetto collaterale se fosse valutata.
Pieter B,

Sai, == 0non è solo inutile, potrebbe effettivamente confondere alcune persone.
Deduplicatore,

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.