1

C / C ++式で演算子の優先順位と結合性の規則に違反したことはありますか?
もしそうなら、例を挙げていただけますか?

優先順位と結合性のルールの主張は次のとおりであると想定します。

各演算子には特定の優先順位レベルがあり、各優先順位レベルには特定の結合性があります。部分式がオペランドを期待する2つの演算子によって見られる場合、それは優先順位の高い方に属します。結合は結合性によって切断されます。

編集:背景

この標準では、C / C ++式をCFGとして定義しています。これは、優先順位ベースのパーサーよりもはるかに柔軟性があります。たとえば、二項演算子に非対称の「優先順位」を与えることができたため、優先順位テーブルが正しくなくなりましたしかし、文法の設計は単純な優先順位規則を支持するように制約されていたように私には思えます。これが私が出くわしたいくつかの疑わしい「反例」です:

1) a?b,c:dは次のように解釈されません(a?b),(c:d)

たとえば、はとして解釈されない?:ため、演算子は他のオペランドとは異なる優先順位を中間オペランドに対して示すと主張する人もいます。ただし、内部オペランドとして表示される位置を占めることもありません。その推論によって、ばかげていると解釈されるべきです。a?b,c:d(a?b),(c:d)bc?:a[b+c](a[b)+(c])

2) ではなくsizeof(int)*aとして解釈されます(sizeof(int))*asizeof((int)(*a))

... Cは、括弧で囲まれていないキャストをsizeofの演算子として許可しないためです。ただし、これらの解釈は両方とも優先順位規則に準拠しています。混乱は、*演算子のあいまいさから生じます(それは2進演算子ですか、それとも単項演算子ですか?)。優先順位テーブルは、演算子のあいまいさを解決するためのものではありません。結局のところ、これらは演算子記号の優先順位テーブルではありません。したがって、演算子の優先順位ルール自体はそのままです。

3) a+b=cセマンティックエラーではなく、構文エラーが発生します

a+b=c、標準によれば、無効なC構文です。Cに優先順位ベースのパーサーがあった場合、セマンティックレベルでのみキャッチされます。Cでは、単項式ではない式をl値にすることができない場合があります。したがって、これらの意味的に運命づけられたLHS式は、構文的に対応する必要はありません。言語全体に違いはなく、優先順位テーブルは、式から生じるエラーの構文/構文性を予測するためのものである必要はありません。

4

3 に答える 3

6

一例として、通常の優先順位テーブルではsizeof、キャスト式とキャスト式の優先順位は同じであると示されています。表と標準の両方が、右から左に関連付けられていると言っています。

この単純化は、たとえば、を表示している場合は問題ありません。*&fooこれは、と同じ意味*(&foo)です。

sizeof (int) 1また、それは合法的なC ++であり、と同じことを意味することを示唆しているかもしれませんsizeof( (int) 1 )。しかし、それは合法ではありません。なぜなら、実際sizeof( type-id )には、文法においてそれ自体が特別なものだからです。その存在は、オペランドが。であるキャスト式であるオペランドをsizeof (int) 1持つ式になることを防ぎます。sizeof1

したがって、C ++文法での「sizeof( type-id)」の生成は、通常の優先順位/結合性テーブルが言うことの例外であると言えると思います。それらは、「単項式のサイズ」の生成を正確に記述します。

于 2012-11-25T14:37:58.093 に答える
3

「ルール」が正しいかどうかによります。言語定義は優先順位について説明していないため、さまざまな場所に表示される優先順位テーブルは、言語定義が実際に必要とするものを反映している場合と反映していない場合があります。

于 2012-11-25T13:58:29.733 に答える
0

誰かが反例を見つけるまで、私はこれをデフォルトの答えとして提案します:

いいえ、C /C++の優先順位と結合性のルールに違反することはありません。

于 2012-11-25T19:08:57.180 に答える