2013-06-12 129 views
1

我有一個問題。Bytecode in asm operators &&或||

在我的字節碼的我像計算陳述if((1==1) && (2==2)){}與此代碼

if (node.getOperator().equals(Operator.LOGICAL_AND)) { 
    mn.instructions.add(new InsnNode(Opcodes.IAND)); 
    jmp = new JumpInsnNode(Opcodes.IFNE, null); 
    mn.instructions.add(jmp); 
} 

什麼情況是,我需要計算兩個運營商的表情左右纔能有一個result.The第二種方式是顯而易見的:如果左邊的表達式爲零,然後離開。用這種方法,你不必計算雙方。

我的問題是:用第一種方法做它是錯誤的嗎?

謝謝先進。

回答

2

IAND操作碼用於按位操作(&)。是的,如果試圖實現短路邏輯和運算符(&&),則預先評估左側和右側操作數是錯誤的。試想,如果你的操作數有副作用,會發生什麼:

if (methodWithSideEffect() && otherMethodWithSideEffect()) {} 

如果methodWithSideEffect()評估爲falseotherMethodWithSideEffect()不應該被調用。如果您按照您的建議進行預評估,則會違反此合同,因爲這兩種方法都會被調用。

沒有代表邏輯和的操作碼。我在前面的問題here中已經談到了這個問題。

+0

OH ok。你可以用||來做同樣的圖表。就像你在上一個問題中用&&做的那樣? – Tony

+0

如果您回過頭來接受本週提出的所有問題的答案,我可能會願意這樣做:)。 –

+0

接受是什麼意思? – Tony