Java 为什么可以';t在堆栈的add()中执行pop()

Java 为什么可以';t在堆栈的add()中执行pop(),java,Java,我为布尔表达式编写了一个后缀计算器,因为它是后缀形式的。我第一次开始写它的时候,我用了这个表达 s.add(s.pop() [operation] s.pop()); 其中,s是我的堆栈,操作是和,异或,或或 出于某种原因,pop方法似乎没有从堆栈中剥离值,因此我使用两个布尔变量重写了此操作:b1和b2。这些变量包含弹出的值,然后通过add方法通过正确的操作传递这些值 if(str.equals("or")){ boolean b1 = s.pop(); boolean b2

我为布尔表达式编写了一个后缀计算器,因为它是后缀形式的。我第一次开始写它的时候,我用了这个表达

s.add(s.pop() [operation] s.pop());
其中,
s
是我的堆栈,
操作是
异或
,或

出于某种原因,
pop
方法似乎没有从堆栈中剥离值,因此我使用两个布尔变量重写了此操作:
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()


忽略对不需要的值的评估(这里就是这样)称为短路。如果您想了解更多信息:

从我的评论中复制,因为它现在被认为是一个答案:

当使用
|
时,左侧值为
true
(当左侧
s.pop()
返回
true
时会发生这种情况),右侧不计算。当右侧是方法调用,例如
s.pop()
,这将导致堆栈上剩余的值,因为未调用
pop()


忽略对不需要的值的评估(这里就是这样)称为短路。如果您想了解更多信息:

请发布一个。如何声明堆栈?堆栈s=新堆栈();。它应该在每次查看新表达式时重新分配到新堆栈,但我确信该部分是有效的。当使用
|
时,左侧的值为
true
(当左侧的
s.pop()
返回true时,会发生这种情况),右侧的值不会被计算。当右边是一个方法调用,如
s.pop()
,这将导致堆栈上剩余的值,因为没有调用
pop()
。@f1sh您应该将其写为回答:)请发布一个。您如何声明堆栈?堆栈s=new stack();。它应该在每次查看新表达式时重新分配到新堆栈,但我确信该部分是有效的。当使用
|
时,左侧的值为
true
(当左侧的
s.pop()
返回true时,会发生这种情况),右侧的值不会被计算。当右边是一个方法调用,如
s.pop()
,这将导致堆栈上剩余的值,因为没有调用
pop()
。@f1sh您应该将其作为一个答案:)