2

C で後置式を計算するときに、トークンが演算子の場合、優先度が最も高くなるようにスタックに配置する必要があります。

私の質問は、演算子*/、 の中%で最も優先度が高いものです。

結合性も考慮する必要がありますか? これらの演算子はすべて LEFT-TO-RIGHT結合性を持っているため、 ?/よりも優先度が高くなります。*

4

3 に答える 3

3

演算子 */、 は優先順位%が同じで、結合性は左から右です。したがって、次のような式:

a * b / c            /* both operators have same precedence  */

以下と同じです:

(a * b) / c

同様に次のような表現:

a / b * c            /* both operators have same precedence  */

以下と同じです:

( a / b ) * c

したがって、演算子でも優先順位は同じですが、式に (括弧なしで) 表示された場合、左から右への結合性により、左端の演算子の優先順位が高くなるとします。

注:a / b * c概念的(a / b) * c には、演算子の優先順位を上書きするために式で括弧を使用 *( )ます a / ( b * c)。コードを書くときに演算子の優先順位に混乱がある場合は、括弧を使用してください。

編集:

POSTFIX および PREFIX 形式では、括弧を使用しないでください( )。演算子の優先順位は、式に出現する順に決定されるため、式を評価している間、実行する次の操作を検索する必要がなく、評価が高速になります。

while INFIX 式では、演算子の優先順位は括弧で上書きできます( )。したがって、角かっこは中置式 expression- にあり、次に実行する操作を検索する必要があります (例: a + b%d-)。expression の評価は低速です。
これが、コンピューター サイエンスで変換が役立つ理由です。

そのため、コンパイラは最初に中置式を同等の後置形式に変換し (文法規則を使用)、次にターゲット コードを生成して式の値を評価します。それが、接尾辞と接頭辞の形式を研究する理由です。

そして、優先順位と結合規則に従って、次の式が成り立ちます。

a * b / c            /* both operators have same precedence  */

は次のように変換されます。

a b * c / 

そして表現

a / b * c            /* both operators have same precedence  */

に翻訳されます

a b / c *
于 2013-08-21T04:47:17.417 に答える
0

私の質問は、演算子*/、の中%で最も優先度が高いものです。

+-(バイナリ) が等しいのと同様に、それらは等しいです。

結合性も考慮する必要がありますか?

はい、たとえば、1 + 2 + 3になる必要があります(1 + 2) + 3。つまり1, 2, ADD, 3, ADD,1, 2, 3, ADD, ADD.

これらの演算子はすべて LEFT-TO-RIGHT 結合性を持っているため、 / は * よりも優先されますか?

結合性は、優先順位とは何の関係もありません。質問は意味がありません。

しかし、タイトルが示すように、既存の RPN 式を計算しているだけの場合、なぜこれを求めているのかわかりません。オペランドをプッシュし、発生した演算子を評価するだけです。RPNの翻訳について本当に質問していますか?

于 2013-08-21T04:46:27.853 に答える