2016-12-17 3 views
0

私は、x86、x64、およびARMのアセンブラ命令の束を吐き出す式パーサを書いています。GCC C++警告:カッコを提案する

私はランダムな表現を生成し、GCCでコンパイルし、結果を自分のコードと比較する小さなアプリケーションを作成しました。

私はパーサーがGCCに似た警告を出したいと思っています。

私はGCC 5.1.0

int a = 100 + 100 | 10; 

とGCCは、周りの警告提案括弧を与えることに気付きました|

しかし

int b = 100 * 100 | 10; 

GCCは警告を与えません。

しかし、加算と乗算の両方がビットごとのORよりも優先順位が高いので、int b = expressionの警告はなぜですか?

私は非常に疲れているので、何か見落としている可能性があります。

+4

個人的には、何が起こっているかを明確にするために、両方とも括弧を使用します –

+0

https://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index-Weparentheses- 201 –

+0

私は個人的にどちらかにはカッコを使用しませんが、コンパイラが冗長構文を追加することを示唆する完全な無関心と確信しています。 – EJP

答えて

1

究極の答えが唯一のから来ることができるかどうかというルールを持っています他の言語のユーザーがこの式を誤って解釈する可能性があります。例えば、some Pascal dialects,&は、同じ優先順位を*|と同じにしています優先度は+となりますので、+|の両方を含む式括弧の間には異なる解釈があるかもしれません(標準パスカルには&または|はありませんが、標準パスカルではandorの優先順位が同じ規則に従います)。私は、多くの言語がC演算子の優先順位をコピーしているのと同じように、他はPascalをコピーしていると思います。

2

これは、*が優先順位5で、Precedenceの問題です+は6であり、あなたが1から警告を受けるが、他からあなたは、コンパイラの矛盾を発見していないとき|だから12

です。あるいは、コンパイラは意味がありません(priorityDifference(X、Y)< 7表示parentesis警告、。

ポストバージョンに対するバグ報告。

+1

私はまったくバグだとは思わない。これはhttps://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Warning-Options.html#index-Weparentheses-201 -Wraparentes(-Wallに含まれています) –

+0

@CaptainGiraffeでカバーされていますそれはここでの具体的な違いの中でなぜ人々は '+'ではなく*で混乱するのでしょうか? – Surt

+1

これはバグではありません!優先順位が重要なので。これは、算術演算子とビット演算子を混在させます。 2つのintまたはint式の結果にビット単位のORを適用することは珍しいことではありません。ビット単位の論理積の結果で数学を行うのは本当に奇妙です。 – geipel

0

celtschkによってコメントを読んだ後、私はC++でのいくつかの表現とFree Pascal

C++

a = 100 + 100 & 100; // = 64 
    a = (100 + 100) & 100; // = 64 

Free Pascalの

a := 100 + 100 and 100; // = 200 
    a := (100 + 100) and 100; // = 64 

Free Pascalの

a := (100 + 100) and 222; // = 200 
    a := 100 + 100 and 222; // = 168 
を試してみました

// C++

a = 100 * 100 & 222; // = 16 

// Free Pascalの

a := 100 * 100 and 222; // = 16 

だから、他の言語のビット演算子は、言語間の翻訳た場合に頭痛を引き起こすことになる、C++と同じ優先レベルを持たないかもしれないと思われます。たぶん、GCCによって生成された警告メッセージは、もう少し説明的かもしれません。

関連する問題