3

C99 での構文の意味がよくわかりません。ここで C99 と言うのは、ISO/IEC 9899:1999 を意味します。まあ、文法の構文部分は ANSI C、C89 からあまり変わっていないと思います。

この質問の例を見てみましょう:

6.5.5 Multiplicative operators
  Syntax
    multiplicative-expression:
      cast-expression
      multiplicative-expression * cast-expression
      multiplicative-expression / cast-expression
      multiplicative-expression % cast-expression

  Constraints

Each of the operands shall have arithmetic type. The operands of the % operator
shall have integer type.

  Semantics

The usual arithmetic conversions are performed on the operands.
The result of the binary * operator is the product of the operands.
The result of the / operator is the quotient 

なぜ乗法演算子の構文に「キャスト式」があるのだろうか? そして、この構文はどのような文法を意味するのでしょうか? その質問で@Aviは

a*b*c

「cはキャスト式として解析する必要があります」、これはよくわかりません。

c99 6.6.1 の定数式の構文から別の例を見てみましょう。

Syntax
   constant-expression:
       conditional-expression

なぜこの条件式がここに出てくるのですか? 誰かがそれらの構文を説明する方法を教えてもらえますか? よろしくお願いします。

4

2 に答える 2

3

なぜ乗法演算子の構文に「キャスト式」があるのだろうか?

これは、同じ優先順位の演算子のグループ化を指定し、最初に優先順位を指定するために文脈自由文法で使用される典型的なデバイスです (OK、これは正確ではありません。文法は演算子に優先順位を割り当てるだけでなく、それ以上のことを表現できます。しかし、単純な優先順位ベースの式評価を CFG で表現したいだけなら、このようにします)。はcast-expressionとにかくmultiplicative-expression;とは関係ありません。それは単に「乗算演算または優先順位の低い演算を含まない任意の式」です。

それで、これはどのように機能しますか:

  1. 同じ優先順位の演算子のグループ化:

    1*2*3*4
    

    この場合、グループ化には次の可能性があります (最上位のみ)。

    • 1*(2*3*4)
    • (1*2)*(3*4)
    • (1*2*3)*4

    文法を見ると、 の左にあるものはすべて*aでなければならないcast-expression、つまり(括弧で囲まれていない) を含んではいけない*ことがわかります。したがって、3 番目の選択肢のみが実行可能です。

  2. 優先度。表現を想像する

    a*b+c
    

    次のいずれかとして解析できます

    • (a*b)+c
    • a*(b+c)

    ただし、cast-expression右側には (括弧で囲まれていない) を含めることができないことがわかっています+(または、調べれば文法からそれを解決できます)。これにより、最初のオプションが唯一の可能な代替手段として残ります。

    別の表現

    a+b*c
    

    次に、次のように解析できます

    • (a+b)*c
    • a+(b*c)

    ただし、 multiplicative-expressionの左側に*は (括弧で囲まれていない) どちらも含めることはできません (+読者の演習として残しておきます)。したがって、2 番目の選択肢のみが実行可能です。

conditional-expression に関するあなたの質問に対して: 文法規則では、同等またはそれ以下の代入演算子をconstant-expressions として解析することは許可されていません。したがって、a=ba,ba+=bは定数式になることはできませんが、 、a+ba[b]およびa(b)は可能です。たとえば、許可しないことに注意してください。(a=b); 定数式とは何かを指定する実際の句に目を向ける必要があります。これにより、文法よりも定数式の領域が制限されます。

于 2012-04-25T13:15:36.247 に答える
1

なぜ乗法演算子の構文に「キャスト式」があるのだろうか?

はるかに単純な問題と、それに応じてより単純な文法から始めましょう。1 + 2単純な算術式 ( 、3 * (4 - 2)42など)を表す文法を定義します。単純な数値定数を正当な式にしたいので、ルートの非終端式から単純な数値へのパスが存在するように文法を定義する必要があります。

:
    用語  |
    term add-op 式

:
    因子|
    因子マルチ演算項

係数:
    |
    () 

numberadd-opmul-opなどの非終端記号は明らかです。

42であり、因子の生産であり、項の生産であり、表現の生産である。このよう42に、私たちの文法に従った正当な算術式です。termfactorは、このパスの中間生成物です。

同様のことが C 文法でも起こっています。キャスト式は、と、識別子や数値定数などの端末との間の中間生成物です。この単純な文法では、2 つのレベルの優先順位が定義されています。C の文法では、16 の異なるレベルの優先順位が定義されており、演算子が大量に追加されているため、そのパスに沿ってさらに多くの中間生成が存在します。また、次のようなケースを処理できるように、キャスト式の優先順位を乗法式よりも高くしたいと考えています。

x = a * (int) b;

ちゃんと。

于 2012-04-25T14:49:03.400 に答える