0

我有这个循环语句,我将使用类似 C 的语法(C、C++、Java、JavaScript、PHP 等都使用类似的语法)来表达它:

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

我希望它运行直到我得到 a 'o'or 'x',但它永远不会退出,即使c'o'or 'x'。为什么不?

我也尝试过使用if

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

但这也总是显示错误消息,即使c'o''x'。为什么?

4

5 回答 5

11

条件(c != 'o' || c != 'x')永远不能为假。如果c'o',则为c != 'x'真并且满足 OR 条件。如果c'x',则为c != 'o'真并且满足 OR 条件。

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

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

“虽然c不是'o'并且c不是''x'......”(例如,它们都不是)。

或使用此处介绍的德摩根定律:

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

“虽然(c'o'或是c)不是真的'x'......”

于 2016-09-12T10:05:12.753 回答
3

它必须if(c!='o' && c!='x')代替if(c!='o' || c!='x'). 如果您使用or运算符,则布尔表达式将始终为真。

于 2016-04-13T17:28:06.687 回答
2

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

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

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

第一个子表达式c != 'o'falsewhen c == 'o'。第二个也是一样;这是false什么时候c == 'x'

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

于 2016-09-12T10:24:35.037 回答
0

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

于 2016-04-13T17:40:14.317 回答
0

即使您输入 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!");
于 2016-04-13T17:42:38.243 回答