9

C99 標準では、式は優先順位と結合性を考慮しています。

ドキュメントに演算子が現れる順序が優先順位を下げるため、優先順位は非常によく文書化されています。そのため、関数呼び出しは乗算演算子の前にあり、それは加法演算子の前に来ます。

ただし、左か右かに関係なく、結合性の決定的な説明を見つけることができません。これは、1 つのバリアントと他のバリアントに適用35/5*2されるため、重要です。14(35/5)*2335/(5*2)

セクション6.5 Expressions /3, footnote 74の状態:

この構文は、式の評価における演算子の優先順位を指定します。これは、この副次句の主要な副次句の順序と同じで、優先順位が最も高いものから始まります。

各主要な副次句内では、演算子の優先順位は同じです。左結合性または右結合性は、各節で説明されている式の構文によって示されます。

ただし、次のように乗算の場合を考えます。

6.5.5 乗法演算子
  構文の
    multiplicative-expression:
      cast-expression
      multiplicative-expression * cast-expression
      multiplicative-expression / cast-expression
      multiplicative-expression % cast-expression

  制約

各オペランドには算術型が必要です。演算子のオペランドは%整数型でなければなりません。

  セマンティクス

通常の算術変換がオペランドに対して実行されます。

二項演算子の結果は*、オペランドの積です。

演算子の結果は/、第 1 オペランドを第 2 オペランドで除算した商です。演算子の結果は%剰余です。どちらの操作でも、2 番目のオペランドの値がゼロの場合、動作は未定義です。

整数が除算されると、/演算子の結果は小数部分が破棄された代数商になります。商の場合a/b表現可能である場合、式(a/b)*b + a%bは等しいものとしaます。

そこには結合性について言及しているものは何も見当たりませんし、標準の他の場所にデフォルト設定があるようにも見えません。

ここで何か不足していますか?

4

2 に答える 2

10

演算子の結合性は、「右結合」または「左結合」として明示的に指定されていません。文法から推測します。あなたの例では、このmultiplicative-expression用語はそれ自体を再帰的に指し、再帰は演算子の左側にあります。つまり、パーサーの遭遇は、左結合のようにa * b * c解析する必要があります。a * b * c(a * b) * c

assignment-expression用語(6.5.16)の文法は次のとおりです。

assignment-expression:
    conditional-expression
    unary-expression assignment-operator assignment-expression

したがって、パーサーが遭遇すると、a = b = cそれをのように解析する必要がa = (b = c)あります。これは右連想です。

于 2012-02-23T06:23:32.733 に答える
3

文法自体は、使用されるプロダクションによって、結合性を指定します:

multiplicative-expression:
  cast-expression
  multiplicative-expression * cast-expression

これは、それ自体をさらに解析する前にa * b * c、 in を aおよびone としてc解析する必要があることを意味します。したがって、乗算の左結合性は、解析規則によって構文ツリーに強制されます。cast-expressiona * bmultiplicative-expressiona * b

于 2012-02-23T06:27:32.477 に答える