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