C / C ++式で演算子の優先順位と結合性の規則に違反したことはありますか?
もしそうなら、例を挙げていただけますか?
優先順位と結合性のルールの主張は次のとおりであると想定します。
各演算子には特定の優先順位レベルがあり、各優先順位レベルには特定の結合性があります。部分式がオペランドを期待する2つの演算子によって見られる場合、それは優先順位の高い方に属します。結合は結合性によって切断されます。
編集:背景
この標準では、C / C ++式をCFGとして定義しています。これは、優先順位ベースのパーサーよりもはるかに柔軟性があります。たとえば、二項演算子に非対称の「優先順位」を与えることができたため、優先順位テーブルが正しくなくなりました。しかし、文法の設計は単純な優先順位規則を支持するように制約されていたように私には思えます。これが私が出くわしたいくつかの疑わしい「反例」です:
1) a?b,c:d
は次のように解釈されません(a?b),(c:d)
たとえば、はとして解釈されない?:
ため、演算子は他のオペランドとは異なる優先順位を中間オペランドに対して示すと主張する人もいます。ただし、内部オペランドとして表示される位置を占めることもありません。その推論によって、ばかげていると解釈されるべきです。a?b,c:d
(a?b),(c:d)
b
c
?:
a[b+c]
(a[b)+(c])
2) ではなくsizeof(int)*a
として解釈されます(sizeof(int))*a
sizeof((int)(*a))
... Cは、括弧で囲まれていないキャストをsizeofの演算子として許可しないためです。ただし、これらの解釈は両方とも優先順位規則に準拠しています。混乱は、*
演算子のあいまいさから生じます(それは2進演算子ですか、それとも単項演算子ですか?)。優先順位テーブルは、演算子のあいまいさを解決するためのものではありません。結局のところ、これらは演算子記号の優先順位テーブルではありません。したがって、演算子の優先順位ルール自体はそのままです。
3) a+b=c
セマンティックエラーではなく、構文エラーが発生します
a+b=c
、標準によれば、無効なC構文です。Cに優先順位ベースのパーサーがあった場合、セマンティックレベルでのみキャッチされます。Cでは、単項式ではない式をl値にすることができない場合があります。したがって、これらの意味的に運命づけられたLHS式は、構文的に対応する必要はありません。言語全体に違いはなく、優先順位テーブルは、式から生じるエラーの構文/構文性を予測するためのものである必要はありません。