Почему мой c! = ‘O’ || условие c! = ‘x’ всегда верно?

У меня есть этот оператор цикла, который я буду использовать с использованием синтаксиса C-like (C, C ++, Java, JavaScript, PHP и т. Д.), Которые используют аналогичный синтаксис:

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

Я хочу, чтобы он работал до тех пор, пока я не получу 'o' или 'x' , но он никогда не выйдет, даже когда c 'o' или 'x' . Почему нет?

Я также пытался использовать, if :

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

но это также всегда показывает сообщение об ошибке, даже когда c является 'o' или 'x' . Зачем?

Это должно быть, if(c!='o' && c!='x') вместо if(c!='o' || c!='x') . Если вы используете оператор or логическое выражение всегда будет истинным.

Условие (c != 'o' || c != 'x') никогда не может быть ложным. Если c является 'o' , то c != 'x' будет истинным и выполняется условие OR. Если c является 'x' , то c != 'o' будет истинным и выполняется условие OR.

Вы хотите && (AND), а не || (ИЛИ):

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

«В то время как c является 'o' c является« x »…» (например, это ни один из них).

Или используйте закон Де Моргана, который рассматривается здесь :

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

«Хотя это НЕ верно, что ( c is 'o' или c is 'x' ) …”

Почему мой c != 'o' || c != 'x' условие c != 'o' || c != 'x' всегда верно?

Выражение объединяет два подвыражения, используя логический оператор OR ( || ). Выражение true если хотя бы одно из подвыражений true . Чтобы быть false , оба подвыражения, которые он соединяет, должны быть false .

Подвыражения: c != 'o' и c != 'x' .

Первое подвыражение c != 'o' false когда c == 'o' . То же самое для второго; это false когда c == 'x' .

Обратите внимание, что они не могут быть false одновременно, потому что c не может быть 'o' и 'x' в одно и то же время.

Условие должно быть, if(!(c=='o' || c=='x')) или if(c!='o' && c!='x')

даже когда вы вводите x или вводите o в этом случае, если условие оценивается как true, и, следовательно, game_start остается ложным.

это должно быть, if(c!='o' && c!='x') или использовать более прямой путь

 if(c == 'o' || c == 'x') game_start=true; else System.out.println("you can only enter o or x!"); 
Давайте будем гением компьютера.