为什么我的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!");