Ordine di esecuzione per un se con più condizionali

In un’istruzione if con più condizionali, è la seconda condizionale eseguito se il risultato del primo è chiaro?

esempio:

if(i>0 && array[i]==0){
}

Se mi swap le istruzioni condizionali, un segmentation fault può verificarsi per i valori negativi di “io”, ma in questo modo non segfault si verifica. Posso essere sicuro che questo funziona sempre o non sono di uso if nidificate?

InformationsquelleAutor mrks | 2010-03-16



3 Replies
  1. 81

    Questo tipo di valutazione è chiamato corto circuito.
    Una volta che il risultato è chiaro al 100%, non continuare a provare.

    Questo è in realtà una comune tecnica di programmazione.
    Per esempio, in C++ si possono spesso vedere qualcosa di simile:

    if (pX!=null && pX->predicate()) { bla bla bla }

    Se hai cambiato l’ordine delle condizioni, si potrebbe invocare un metodo su un puntatore null e crash. Un esempio simile in C utilizzare il campo di una struttura quando si dispone di un puntatore alla struct.

    Si potrebbe fare qualcosa di simile con o:

    if(px==null || pX->isEmpty()} { bla bla bla }

    Questo è anche uno dei motivi che è generalmente una buona idea per evitare di effetti collaterali in una condizione if.

    Per esempio, si supponga di avere:

    if(x==4 && (++y>7) && z==9)

    Se x è 4, quindi y sarà incrementato, indipendentemente dal valore del z o y, ma se x non è 4, non sarà incrementato a tutti.

    • +1. Vale la pena di menzionare, un’eccezione per effetti collaterali in una condizione if è il controllo di errore valori di ritorno: if (function_that_returns_neg_on_error(param1, param2) < 0) { perror("function"); return -1;}
  2. 32

    Operatori && e || garantire che l’espressione a sinistra sarà fatta una valutazione completa e tutti gli effetti collaterali applicata) prima che il lato destro è valutato. In altre parole, gli operatori introdurre una sequenza di punto.

    Inoltre, se il valore dell’espressione può essere determinato dalla sinistra, la parte destra non è valutato. In altre parole, se si dispone di un’espressione come x && y, e x restituisce 0 (falso), allora il valore dell’espressione è falsa a prescindere di y, quindi y non viene valutata.

    Questo significa che espressioni come x++ && x++ sono ben definiti, dal momento che && introduce una sequenza di punto.

  3. 17

    Dal progetto di 3485 (n3485.pdf) è chiaramente indicato che

    5.14 operatore Logico [expr.log.e]

    logical-and-expression: 
          inclusive-or-expression
          logical-and-expression && inclusive-or-expression 
    1. &Amp;& operatore gruppi da sinistra a destra. Il
      gli operandi sono entrambi contestualmente convertito bool (comma 4). Il
      il risultato è vero se entrambi gli operandi sono veri e false in caso contrario. A differenza di
      &, && garanzie da sinistra a destra di valutazione: il secondo operando non
      valutate se il primo operando è falso.
    2. Il risultato è un valore booleano. Se il
      secondo l’espressione è valutata ogni valore di calcolo e di lato
      effetto associato con la prima espressione è sequenziato prima di ogni
      il valore di calcolo e di effetto collaterale associato con la seconda
      di espressione.
    • che cosa si intende per a differenza &? Se io uso & quindi l’ordine non è garantita?
    • Es: se((func1() & func2()) == true) vs if(func1() && func2())

Lascia un commento