2010-05-19 7 views
12

Mi chiedevo cosa succede quando un programma elabora una struttura if con più condizioni. Ho un'idea, ma non ne sono sicuro. Darò un esempio:Cosa succede se la prima parte di una if-structure è falsa?

List<string> myTestList = null; 
if (myTestList != null && myTestList.Count > 0) 
{ 
    //process 
} 

L'elenco è nullo. Quando si elabora l'istruzione if, andrà da sinistra a destra per uscire dal se non appena una condizione è falsa?

Ho provato e sembra non lanciare errori, quindi presumo che quanto sopra lo spiega, ma non ne sono sicuro.

+0

Quando aggiunto una clausola 'else', cosa hai visto accadere? –

+0

viene chiamato, è per questo che ho pensato che se si rompe non appena una condizione è falsa – Terry

+0

"Break down"? Cosa intendi per "abbattere"? –

risposta

23

È il && che è importante. Questo è in cortocircuito, quindi Count non viene mai valutato; Le condizioni sono valutate da sinistra a destra.

C'è anche un operatore senza cortocircuito (&), ma è molto raro da vedere in un test if; è principalmente destinato alle operazioni bit a bit (su int ecc.).

Dal spec:

condizionali operatori logici

I && e || operatori sono chiamati gli operatori logici condizionali. Sono anche chiamati operatori logici "cortocircuiti" .

...

Il && e || operatori sono versioni condizionali degli operatori & e | :

  • L'operazione x && y corrisponde all'operazione x & y, tranne che y viene valutata solo se x non è false.
  • L'operazione x || y corrisponde all'operazione x | y, tranne che y viene valutata solo se non è xtrue.
2

In C# e la maggior parte delle lingue, && e || sono corto circuito, vale a dire se la prima parte dell'espressione è sufficiente per determinare il risultato, la seconda parte è garantiti non deve essere eseguito .

Il codice che hai usato è codice C# idiomatico.

2

La valutazione si interrompe immediatamente se il riferimento è null. Questa è la valutazione del cortocircuito delle espressioni logiche: se la parte sinistra di && è false, il diritto non viene valutato affatto.

2

È in cortocircuito.

a && b 

se a è falso, non saranno valutate b. Possiamo usare questo comportamento perché l'espressione sarà sempre falsa.

Analogamente,

a || b 

se a è vero, b non saranno valutate.

6

Nella maggior parte (ma non in tutte le lingue moderne), esiste una funzionalità denominata "short circuit boolean evaluation". Ciò significa che se la prima parte di una condizione && è falsa, la seconda parte non viene valutata affatto.

Una funzionalità simile si applica a ||, dove se la prima parte è true, la seconda parte non viene valutata.

Si noti che questa funzione non è limitata alle istruzioni if. Quanto segue è valido e non cercherà di riferimento Count se myTestList è null:

bool b = myTestList != null && myTestList.Count > 0; 
1

Sì, la valutazione di corto circuito deve essere utilizzato. Io non sono uno sviluppatore C#, ma ho letto questo da this Wikipedia article.

2

La maggior parte dei linguaggi di programmazione moderni, incluso C#, implementa quello che è noto come operatore di congiunzione sequenziale di McCarthy. Ciò significa:

a && b <=> a ? b : false 

Se si guarda la seconda di queste due espressioni equivalenti, diventa abbastanza chiaro che b viene valutato se e solo se a è vero.E viceversa:

a || b <=> a ? true : b 
0

Per il seguente programma di esempio:

prova void() { bool f1 = 0; bool f2 = 0;

se (f2 & & (f1 = 1)) {cout < < "Inside 1" < < endl; } Cout < < "F1" < < f1 < < ": F2:" < < f2 < < endl;

if ((f1 = 1) & & f2) {cout < < "Inside 2" < < endl; } Cout < < "F1" < < f1 < < ": F2:" < < f2 < < endl; }

uscita sarebbe: F1 0: F2: 0

F1 1: F2: 0

che dimostra sostanzialmente che il ciclo se viene eseguita da sinistra a destra. 1. Nel primo ciclo if, la prima condizione non riesce e non si preoccupa di testare la seconda parte. 2. Nel secondo ciclo if, la prima parte viene eseguita per prima e quindi la seconda parte.

Questo potrebbe funzionare per C++. Spero che questo ti aiuti.

  • Ivar
Problemi correlati