为什么我的c!='o'|| c!='x'条件总是正确的?

我有这个循环语句,我将使用类C语法(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运算符,布尔expression式将始终为true。

条件(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'o'c'x' )是不正确的……”

为什么我的c != 'o' || c != 'x' c != 'o' || c != 'x'条件总是正确的?

该expression式使用逻辑OR运算符( || )组合了两个子expression式。 如果至less有一个子expression式为true ,则expression式为true 。 为了false ,它连接的子expression式都必须是false

子expression式是c != 'o'c != 'x'

c == 'o'时,第一个子expression式c != 'o'false c == 'o' 。 第二个也一样; 当c == 'x'时它是false c == 'x'

请注意,它们不能同时为false ,因为c不能同时为'o''x'

条件应该是if(!(c=='o' || c=='x'))if(c!='o' && c!='x')

即使当你inputx或者你在这种情况下inputo如果条件评估为真,因此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!");