2

Cの定数表現について正確に理解したいので、C99の関連規定を読みました。「6.6定数式」の最初の条項では、定数式の構文について説明していますが、理解できません。

C99の「6.6定数式」の章の最初の規定:

定数式
条件式

C99が定数式を説明するために条件式を使用するのはなぜですか?間違いなく、式2+3は定数式です。条件式ですか?

4

3 に答える 3

3

§6.6定数式を理解するには、文法がどのように機能するかを理解している必要があり、§6.5式を読む必要があります。

§6.5式の中で、セクション§6.5.15条件式は次のように述べています。

conditional-expression:
        logical-OR-expression
        logical-OR-expression ? expression : conditional-expression

これは、標準が優先順位などを指定する方法です。アイデアは、代入演算子とコンマ式を「定数式」から除外することですが、§6.6で定義された制約(特に、 、代入演算子とコンマ演算子を明示的に除外します。おそらく、ルールの一般にそれらが含まれているためです)。

于 2012-12-02T15:55:25.080 に答える
3

「定数式:条件式」という表記は、定数式の構文の仕様にすぎません。構文は、定数式である可能性のある文字列を記述します。構文を満たすことに加えて、定数式は6.6節にリストされている制約も満たさなければなりません。

C標準が「定数式:条件式」を使用しているという事実は混乱を招く可能性があります。ただし、以下に示すように、標準で「定数式:式」を使用した場合もまったく同じです。つまり、式の構文だけでなく、6.6節にリストされている制約にも従う場合、どの式も定数式です。

条件式の一例はです3 < 4 ? 5 : 6。この式は、6.6節の制約を満たすため、定数式でもあります。一方、x < 4 ? 5 : 6は条件式でもありますが、定数式ではありません(xオブジェクトの名前であり、定数などに置き換えられるマクロではないと仮定します)。

6.6節は、条件式が制約を満たしている場合、定数式である可能性があることを示しています。6.5.15節は、条件式がalogical-OR-expressionまたは。のいずれかであることを示していlogical-OR-expression ? expression : conditional-expressionます。チェーンを介して作業を続けると、aはaでlogical-OR-expressionある場合もlogical-AND-expressionあれば、論理OR演算子で作成された式である場合もあります||。各レベルの名前はのようなものですがfoo-expression、各レベルは実際には前に来た式のタイプであるか、 。で作成された式fooです。foo-expression-or-prior-type-of-expressionだけでなく、名前を付けるのは面倒foo-expressionです。

したがって、文法は、識別子、定数、文字列リテラル、および後で説明する1つの特別なものであるプライマリから始まり、文法はそれらのプライマリをより複雑な式に構築し、Cが許可する各演算子を使用する可能性を追加します。可能であれば、前の式を後の式の前に解析する必要があるため、このように文法を階層化すると、演算子の優先順位が定義されます。

プライマリの特別なことは、括弧で囲まれた式です( expression )expressionトークンは、6.5.17で定義されている一連の定義の終わりです。これにより、文法がループバックされます。任意の式を括弧で囲むことができるため、新しい式primaryになり、演算子を適用できます。

constant-expression6.6節では、aはであると述べている可能性がexpressionあり、それはであると言っているのと同じ効果がありconditional-expressionます。これは、6.6の制約により、代入演算子とコンマ演算子が禁止されているためです。したがって、が何であるかを考えるとexpression、6.5.17節はそれがまたはのいずれかである可能性があると述べていassignment-expressionますexpression , assignment-expression。ただし、コンマ演算子を禁止する制約により、後者は禁止されます。したがって、expression定数式のanは。でなければなりませんassignment-expression。同様に、assignment-expressionaはaである必要があり、ではconditional-expressionありませんunary-expression assignment-operator assignment-expression

于 2012-12-02T16:24:13.837 に答える
2

まず第一に、C規格は何も説明していません。C言語がどのように定義されているかはわかりますが、その理由はわかりません。

構文セクションは、コンパイラがCソースコードを解釈する方法を説明するために使用される特別な言語( EBNFの変形)で記述されています。仕様

 constant-expression:
     conditional-expression

基本的に、定数式が。と同じ構文を使用することを意味しますconditional-expression。条件演算子(6.5.15)に関するセクションには、aのconditional-expression構築方法を定義する同様の構文セクションがあります。

constant-expressionすべての構文規則をトレースすると、代入演算子(=, *=, /=, +=, -=, <<=, >>= &=, ^=, |=)とコンマ演算子()を除く任意の演算子を使用できることがわかります(,括弧で囲まれていない場合)。

于 2012-12-02T16:07:09.247 に答える