字符串比较(在“do while循环”中使用“or”)java

字符串比较(在“do while循环”中使用“or”)java,java,Java,在我的一生中,我无法理解为什么当“turnOrder”设置为“first”时该代码无限循环。它似乎与“do while”循环中的“or”操作符有关。但我不知道如何正确格式化它 String turnOrder; do { Scanner to = new Scanner(System.in); turnOrder = to.nextLine(); if ((!"first".equalsIgnoreCase(turnOrder)) || (

在我的一生中,我无法理解为什么当“turnOrder”设置为“first”时该代码无限循环。它似乎与“do while”循环中的“or”操作符有关。但我不知道如何正确格式化它

String turnOrder;
    do {
        Scanner to = new Scanner(System.in);
        turnOrder = to.nextLine();
        if ((!"first".equalsIgnoreCase(turnOrder)) || (!"second".equalsIgnoreCase(turnOrder))) {
            System.out.println("Type your answer as 'first' or 'second.' Without the punctuation.");
        } else {}
    } while ((!"first".equalsIgnoreCase(turnOrder)) || (!"second".equalsIgnoreCase(turnOrder)));
while((!“first.equalsIgnoreCase(turnOrder))| |(!“second.equalsIgnoreCase(turnOrder)))

此语句将始终为真,直到您得出一个同时等于SignoreCase-s“first”和“second”的
turnOrder
值。祝你好运!也许你的意思是

while (
    !(
      "first".equalsIgnoreCase(turnOrder) ||
      "second".equalsIgnoreCase(turnOrder)
     )
)

当您键入“first”时,它将返回false !“第一”。相等信号情况(turnOrder),但 它的结果是真的 !“第二个”。相等信号情况(交订单))


false或true=true,因此它将继续循环

您应该始终将逻辑操作简化为最简单的形式

“(!“first”.equalsIgnoreCase(turnOrder))| |(!“second”.equalsIgnoreCase(turnOrder))”

可以使用De Morgan定律简化

!!(“第一”等信号案例(移交订单)和“第二”等信号案例(移交订单))


当然,turnOrder不能同时是“第一”和“第二”。它将始终计算为true,因此while循环将无限期地循环。

嗯……它不等于signorecase
“second”
。我认为使用and“或”运算符时,其中一个状态可能是false,表达式作为一个整体是真实的。您应该始终将逻辑运算简化为最简单的形式。如果其中一个操作数是
true
,则整个表达式是
true
。如果表达式为
true
,则执行
if
语句的哪个部分?这就是发生的情况。turnOrder为“第一”,因此
为“第二”。equalsIgnoreCase(turnOrder)
为假,因此
!“second”.equalsIgnoreCase(turnOrder)
为真。所以整个
表达式都是真的,循环一直在循环。是的,这确实是一个有趣的语句。然而,即使你采取更干净的方法,它也会不断循环。哦,我明白你现在想做什么。你试图循环直到你得到“第一”或“第二”,而不是直到你得到不同的东西。哎呀!我会根据你的实际意图调整我的答案。非常感谢!不幸的是,我可以看出“or”操作符在这里没有帮助。你有我可能忽略的紧凑解决方案吗?你希望程序做什么?代码应该循环,直到“turnOrder”是“first”或“second”,如果是其他代码,则继续循环。使用&&而不是| |似乎解决了这个问题。谢谢。好的,“或”接线员不在这里工作。非常感谢。