Come invertire correttamente l'istruzione if quando ci sono due condizioni?

2

In PHP ho questa istruzione if ( $first e $second valuterà in true o false ):

if ($first && $second) {
    // evereything is OK
} else {
    throw new Exception()...
}

Il mio vero codice è molto più complicato, sto cercando di fare un semplice esempio qui.

Voglio trasformare questo se / else in uno se con una negazione come questa:

if (!($first && $second)){
    throw new Exception()...
}

// everything is OK

Come puoi vedere in questo esempio, ho messo ! segno di negazione davanti a parentesi. È corretto ? Devo annullare tutte le condizioni in questo modo:

if (!$first && !$second)

O dovrei usare || operatore:

if (!$first || !$second) // Sto usando OR qui

Non sono sicuro di come queste condizioni verranno valutate alla fine e sono confuso dai risultati dei test fittizi. Spero davvero che qualcuno possa spiegarmi come valuteranno tutti questi controlli alla fine.

Grazie a tutti coloro che hanno risposto alla mia domanda. A causa del mio basso rappresentante, non posso votare o scegliere una risposta come quella giusta. Sei tutto a posto per me:)

    
posta black-room-boy 08.01.2016 - 17:36
fonte

4 risposte

14

Crea una tabella di verità:

p  q    p && q    p || q    !(p && q)    !p || !q    !(p || q)   !p && !q
==========================================================================
0  0    0         0         1            1           1           1
0  1    0         1         1            1           0           0
1  0    0         1         1            1           0           0
1  1    1         1         0            0           0           0

Pertanto, si vede che !(p && q) equivale a !p || !q , ma non equivalente a !p && !q . Vedete che !(p && q) e !p || !q sono l'opposto di p && q .

Tieni presente che !(p && q) e !p || !q sono equivalenti e possono essere dimostrati utilizzando le leggi di De Morgan .

    
risposta data 08.01.2016 - 17:51
fonte
2

Sì, dovrebbe andare bene. Negando la condizione nel caso, stai solo raccogliendo i casi che avrebbero fallito prima.

Inoltre, !($first && $second) equivale a (!$first || !$second) , non a (!$first && !$second) . (Perché DeMorgan, come hanno menzionato altri rispondenti).

Se i risultati ti stanno confondendo, puoi utilizzare una tabella di verità per valutare le espressioni e trovare quella che si adatta al comportamento che stai cercando.

Una volta che hai la giusta espressione, assicurati di posizionare correttamente le parentesi, come menzionato da Cracket.

Questi possono aiutarti a iniziare: Tabelle della verità .     Generatore di tabelle di verità . Per quest'ultimo, dovrai convertire gli operatori in quelli che usano.

    
risposta data 08.01.2016 - 18:04
fonte
0
if (!$user == 'john' || !$status == 'active')

Questo non fa esattamente quello che pensi che faccia.

Se aggiungi le parentesi mentre il parser le aggiunge, ottieni:

if ( (!$user) == 'john' || (!$status) == 'active')

Mentre vuoi:

if (!($user == 'john') || !($status == 'active') )

La correzione a questo è di aggiungere le parentesi esplicite o di utilizzare l'operatore non uguale != o !== a seconda se si desidera anche il controllo dell'identità.

Inoltre, è qui che entrano leggi di de Morgan .

Questi indicano che !(a||b) == (!a && !b) e that !(a&&b) == (!a || !b)

    
risposta data 08.01.2016 - 17:44
fonte
0

As you can see in this example, I've put ! negation sign in front of parentheses. Is this correct ?

Sì, va bene.

Do I need to negate every condition itself like this:

if (!$first && !$second)

No, sarebbe davvero sbagliato.

Or I should use || operator:

if (!$first || !$second)

Sì, sarebbe corretto.

Sarebbe anche la mia preferenza personale per tutte le opzioni che proponi.

    
risposta data 08.01.2016 - 17:53
fonte

Leggi altre domande sui tag