1

Iam は、論理およびシンボル '&&' を使用して if ステートメントを実行しようとしています。これが私がやろうとしていることです: asmバイトコードのμyスタックには値0と1があり、「論理AND」で結果を取得したいのですが、この場合はifステートメントに入りません。

Opcodes.IFEQ および Opcodes.IFNE 命令を試しましたが、機能しません。「||」でも同じです。と '!' 論理記号

何か案は?

4

2 に答える 2

3

&&とのバイトコード パターン||

短絡オペレーターが好きなこと、&&または||実際に行うことについて考えてみてください。条件分岐があります。考えてみましょう&&。効果的に評価しているのは次のとおりです。

if (left)
    if (right) <do something>
endIf

この動作を説明できる単一のバイトコード命令はありません。いくつかのラベルと条件付き分岐命令が必要です。

.start
    <left expression>
    IFEQ .endIf // if left evaluates to zero (false), skip to end
    <right expression>
    IFEQ .endIf // if right evaluates to zero (false), skip to end
.ifTrue
    <body of 'if' block>
.endIf

オペレーターの動作は||少し異なります。この場合、ロジックは次のようになります。

    if (left)
        goto .ifTrue
    if (!right)
        goto .endIf
.ifTrue
    <do something>
.endIf

右のオペランドが に評価されたときに追加の分岐を避けるために、右のオペランドのチェックがどのように反転されるかに注意してくださいtrue。この動作は、次のようにバイトコードで実装できます。

    <left operand>
    IFNE .ifTrue  // if left evaluates true, skip right, enter 'if' body
    <right operand>
    IFEQ .endIf   // if right evaluates false, skip 'if' body
.ifTrue
    <do something>
.endIf

オペランドをプッシュするタイミング

元の質問では、スタックに左右のオペランドが既にあることが示唆されていることに注意してください。それは悪いでしょう。左のオペランドが(非ゼロ) forまたは(ゼロ) forに評価されたにのみ、右のオペランドを評価する必要があります。右側のオペランドが副作用を引き起こす場合、時期尚早に評価すると、これらの演算子の定義された動作に違反します。true&&false||

于 2013-06-11T21:04:46.353 に答える