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

Why is my c != 'o' || c != 'x' condition always true?

我有这个循环语句,我将使用类似 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 运算符,布尔表达式将始终为真。

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

即使您在这种情况下输入 x 或输入 o,如果条件计算结果为真,因此 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!");

条件(c != 'o' || c != 'x')永远不会为假。如果c'o',则c != 'x'为真,OR条件成立。如果c'x',则c != 'o'为真,OR条件成立。

你想要&&(AND),而不是||(OR):

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

"While c is NOT 'o' AND c is NOT `'x'..."(例如,两者都不是)。

或者使用德摩根定律,covered here:

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

"While it's NOT true that (c is 'o' or c is 'x')..."

Why is my c != 'o' || c != 'x' condition always true?

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

子表达式为c != 'o'c != 'x'

c == 'o'时第一个子表达式c != 'o'false。第二个也一样;当 c == 'x'.

时是 false

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