Cの定数表現について正確に理解したいので、C99の関連規定を読みました。「6.6定数式」の最初の条項では、定数式の構文について説明していますが、理解できません。
C99の「6.6定数式」の章の最初の規定:
定数式:
条件式
C99が定数式を説明するために条件式を使用するのはなぜですか?間違いなく、式2+3は定数式です。条件式ですか?
Cの定数表現について正確に理解したいので、C99の関連規定を読みました。「6.6定数式」の最初の条項では、定数式の構文について説明していますが、理解できません。
C99の「6.6定数式」の章の最初の規定:
定数式:
条件式
C99が定数式を説明するために条件式を使用するのはなぜですか?間違いなく、式2+3は定数式です。条件式ですか?
§6.6定数式を理解するには、文法がどのように機能するかを理解している必要があり、§6.5式を読む必要があります。
§6.5式の中で、セクション§6.5.15条件式は次のように述べています。
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
これは、標準が優先順位などを指定する方法です。アイデアは、代入演算子とコンマ式を「定数式」から除外することですが、§6.6で定義された制約(特に、 、代入演算子とコンマ演算子を明示的に除外します。おそらく、ルールの一般式にそれらが含まれているためです)。
「定数式:条件式」という表記は、定数式の構文の仕様にすぎません。構文は、定数式である可能性のある文字列を記述します。構文を満たすことに加えて、定数式は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-expression
6.6節では、aはであると述べている可能性がexpression
あり、それはであると言っているのと同じ効果がありconditional-expression
ます。これは、6.6の制約により、代入演算子とコンマ演算子が禁止されているためです。したがって、が何であるかを考えるとexpression
、6.5.17節はそれがまたはのいずれかである可能性があると述べていassignment-expression
ますexpression , assignment-expression
。ただし、コンマ演算子を禁止する制約により、後者は禁止されます。したがって、expression
定数式のanは。でなければなりませんassignment-expression
。同様に、assignment-expression
aはaである必要があり、ではconditional-expression
ありませんunary-expression assignment-operator assignment-expression
。
まず第一に、C規格は何も説明していません。C言語がどのように定義されているかはわかりますが、その理由はわかりません。
構文セクションは、コンパイラがCソースコードを解釈する方法を説明するために使用される特別な言語( EBNFの変形)で記述されています。仕様
constant-expression:
conditional-expression
基本的に、定数式が。と同じ構文を使用することを意味しますconditional-expression
。条件演算子(6.5.15)に関するセクションには、aのconditional-expression
構築方法を定義する同様の構文セクションがあります。
constant-expression
すべての構文規則をトレースすると、代入演算子(=, *=, /=, +=, -=, <<=, >>= &=, ^=, |=
)とコンマ演算子()を除く任意の演算子を使用できることがわかります(,
括弧で囲まれていない場合)。