C で後置式を計算するときに、トークンが演算子の場合、優先度が最も高くなるようにスタックに配置する必要があります。
私の質問は、演算子*
、 /
、 の中%
で最も優先度が高いものです。
結合性も考慮する必要がありますか? これらの演算子はすべて LEFT-TO-RIGHT結合性を持っているため、 ?/
よりも優先度が高くなります。*
C で後置式を計算するときに、トークンが演算子の場合、優先度が最も高くなるようにスタックに配置する必要があります。
私の質問は、演算子*
、 /
、 の中%
で最も優先度が高いものです。
結合性も考慮する必要がありますか? これらの演算子はすべて LEFT-TO-RIGHT結合性を持っているため、 ?/
よりも優先度が高くなります。*
演算子 *
、 /
、 は優先順位%
が同じで、結合性は左から右です。したがって、次のような式:
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 *
私の質問は、演算子
*
、/
、の中%
で最も優先度が高いものです。
+
と-
(バイナリ) が等しいのと同様に、それらは等しいです。
結合性も考慮する必要がありますか?
はい、たとえば、1 + 2 + 3
になる必要があります(1 + 2) + 3
。つまり1, 2, ADD, 3, ADD,
、1, 2, 3, ADD, ADD.
これらの演算子はすべて LEFT-TO-RIGHT 結合性を持っているため、 / は * よりも優先されますか?
結合性は、優先順位とは何の関係もありません。質問は意味がありません。
しかし、タイトルが示すように、既存の RPN 式を計算しているだけの場合、なぜこれを求めているのかわかりません。オペランドをプッシュし、発生した演算子を評価するだけです。RPNへの翻訳について本当に質問していますか?