if((A) && (B))
{
//do something
}
else
//do something else
La domanda è, la frase immediatamente si interromperà se A è FALSE. B sarebbe anche stato valutato?Come viene valutata l'istruzione 'if (A && B)'?
Chiedo questo nel caso in cui B verificando la validità di un indice di array dice array [0] quando l'array è effettivamente vuoto e ha zero elementi. Quindi lanciare un segfault perché stiamo cercando di accedere a qualcosa che è fuori limite dell'array. Specificamente
if((array.GetElements() > 0) && (array[0]))
array[0]->doSomething();
else
//do nothing and return
Questo può essere pericoloso se array [0] viene effettivamente valutata perché segfaults senza il primo controllo a sinistra del '& &'. La precedenza mi dice che il lato sinistro avrà sicuramente la precedenza ma non mi dice che non valuterà il lato destro se la sinistra è FALSE.
L'altra forma canonica è 'if (p && p-> bar) {}'. Questo è anche sicuro. – MSalters
Se si vuole solo "non fare nulla e tornare", si dovrebbe lasciare completamente il "else". Altrimenti, il compilatore si lamenterà che non ci sono istruzioni per andare con il resto (se il resto è l'ultima cosa nel blocco che lo racchiude) o, peggio, prendere la prossima affermazione e usarla come istruzione per inserire il blocco else . –
Ho provato ad usare i commenti come segnaposto che significa: un po 'di codice andrà qui, ma non è abbastanza importante da includere nel mio esempio. La realtà della situazione è che c'è un codice che ritorna nello scope dell'altro ma anche il codice dopo l'ambito dell'altro. Spero che lo risolva – BuckFilledPlatypus