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

11

Ho sentito parlare del termine "cortocircuito" usato in C, C ++, C #, Java e molti altri. Che cosa significa questo e in quale scenario verrebbe utilizzato?

    
posta fasil 18.06.2013 - 15:51
fonte

3 risposte

31

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

Prendi ad esempio e && , è abbastanza ovvio che 0 && WhoCares sarà falso indipendentemente da cosa sia WhoCares . Per questo motivo, C salta semplicemente la valutazione di WhoCares . Lo stesso vale per 1 || WhoCares , sarà sempre vero. Per questo motivo, possiamo scrivere un codice come

CanFireMissiles && FireMissiles()

In questo modo evitiamo di fare qualche operazione potenzialmente impossibile. Se non possiamo licenziare i missili, non vogliamo assolutamente provarci. Questo è comunemente usato con i puntatori, in particolare i puntatori di file.

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

Questo si presenta in molti altri modi utili per evitare l'elaborazione non necessaria

 isFileReady() || getFileReady()

Questo evita di fare lavori extra se non è necessario.

    
risposta data 18.06.2013 - 16:00
fonte
4

"Cortocircuito" di solito si riferisce a " Valutazione di cortocircuito " che è un concetto generale, non solo C specifica.

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 valutare l'intera cosa.

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.
     */
}
    
risposta data 18.06.2013 - 16:08
fonte
3

Una valutazione del corto circuito può portare a non valutare alcune parti di una condizione.

Ad esempio:

if (true || f()) { ... }

non mostrerà f .

    
risposta data 18.06.2013 - 15:56
fonte

Leggi altre domande sui tag