我为 boolean 表达式编写了一个后缀计算器,因为它是后缀形式的。我第一次写它时,我使用了这个表达
s.add(s.pop() [operation] s.pop());
其中 s
是我的堆栈,操作
是 and
、xor
或 or
.
由于某种原因,pop
方法似乎没有从堆栈中剥离值,因此我改用两个 boolean 变量重写此操作:b1
和 b2
。这些变量包含弹出的值,然后通过正确的操作通过 add
方法传递这些值。
if(str.equals("or")){
boolean b1 = s.pop();
boolean b2 = s.pop();
s.add(b1 || b2);
//out.println(s);
}
为什么我不能使用提到的第一个语句?
最佳答案
从我的评论中复制,因为它现在被认为是一个答案:
当使用 ||
且左侧值为 true
时(当左侧 s.pop()
返回 true 时会发生这种情况
),右侧不被评估。当右侧是诸如 s.pop()
之类的方法调用时,由于未调用 pop()
,因此会导致值保留在堆栈上。
省略对不需要的值的评估(这就是这里发生的情况)称为短路。如果您想了解更多信息:Java logical operator short-circuiting
关于java - 为什么不能在堆栈的 add() 内执行 pop(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44250220/