Perché è il mio c! = ‘O’ || c! = ‘x’ condizione è sempre vera?

Ho questa istruzione loop, che esprimerò usando la syntax C-like (C, C ++, Java, JavaScript, PHP, ecc. Tutti usano una syntax simile):

while (c != 'o' || c != 'x') { c = getANewValue(); } 

Voglio che venga eseguito finché non ottengo un 'o' o 'x' , ma non esce mai, anche quando c è 'o' o 'x' . Perchè no?

Ho anche provato a usare if :

 if (c != 'o' || c != 'x') { // Show an error saying it must be either 'o' or 'x' } 

ma anche questo mostra sempre il messaggio di errore, anche quando c è 'o' o 'x' . Perché?

Deve essere if(c!='o' && c!='x') invece di if(c!='o' || c!='x') . Se usi l’operatore or l’espressione booleana sarà sempre vera.

La condizione (c != 'o' || c != 'x') non può mai essere falsa. Se c è 'o' , allora c != 'x' sarà vero e la condizione OR è soddisfatta. Se c è 'x' , allora c != 'o' sarà true e la condizione OR è soddisfatta.

Vuoi && (AND), non || (O):

 while (c != 'o' && c != 'x') { // ... } 

“Mentre c NON è 'o' E c NON è” x “…” (ad esempio, non è nessuno di loro).

O usa la legge di De Morgan, qui coperta :

 while (!(c == 'o' || c == 'x')) { // ... } 

“Mentre NON è vero che ( c è 'o' o c è 'x' ) …”

Perché è il mio c != 'o' || c != 'x' c != 'o' || c != 'x' condizione è sempre vera?

L’espressione combina due sottoespressioni usando l’operatore logico OR ( || ). L’espressione è true se almeno una delle sottoespressioni è true . Per essere false , entrambe le sottoespressioni che connette devono essere false .

Le sottoespressioni sono c != 'o' e c != 'x' .

La prima sottoespressione c != 'o' è false quando c == 'o' . Lo stesso per il secondo; è false quando c == 'x' .

Si noti che non possono essere false nello stesso momento perché c non può essere 'o' e 'x' nello stesso momento.

La condizione dovrebbe essere if(!(c=='o' || c=='x')) o if(c!='o' && c!='x')

anche quando inserisci x o entri o in quel caso se la condizione è vera e quindi game_start rimane falso.

dovrebbe essere if(c!='o' && c!='x') o usare un modo più diretto

 if(c == 'o' || c == 'x') game_start=true; else System.out.println("you can only enter o or x!");