7

バックグラウンド

前回、括弧が暗黙のキャスト ( here ) を引き起こしているかどうかについて尋ねたとき、@pmg は「C では int の下では何も行われていない」と指摘してくれました。気を散らすだけです。

序章

以下、カッコがポイントです。または、もっと退屈ですが正確に言うと、私が目にする唯一の演算子は括弧と代入演算子です。

C の括弧 operator に関するこのリファレンスでは、括弧が型を変更することについては何も見ていません (型キャスト構文以外では、このケースではありません)。

一方、ここに代入の自動型変換があることを思い出させるリファレンスがありますが、ここで説明する静的解析ツールの動作を説明するものではないと思います。

以前の質問と同様に、「OK」は静的解析ツールが暗黙の型変換について警告しなかったことを意味し、「NOT OK」は警告したことを意味します。

int main(void)
{
    unsigned int  ui;
    int i;

    ui = (256U); // NOT OK (*) (1)
    i = (256U); // NOT OK (*)  (2)

    i = 256; // OK
    i = 256U; // NOT OK
    ui = 256U; // OK   (3)
    ui = 256; // NOT OK

 return(0);
}

最初の 2 つを除いてすべて理解できます - 括弧は何をしますか? それらが暗黙的な型キャストの方法で何もしない場合、(1) は OK であり、(2) は OK ではないことが期待されます。int よりも小さい型から int までの型の自動型昇格を行う場合、(1) は OK ではなく、(2) は OK であると予想されます。しかし、このツールは、どちらもOKではないと言っています。

これは静的解析ツールのエラーですか、それともツールは正しく、C での暗黙的な型変換について他に学ぶ必要があることはありますか?

(ところで、値 256 が十分に小さく、マシンでオーバーフローが発生しないことを願っています...)

4

2 に答える 2

8

まず、いくつかの用語を明確にしましょう。そのようなものはないため、「暗黙のキャスト」を引き起こすことはできません。キャストは明示的な演算子であり、 (double)42;のように、式の前に括弧で囲まれた型名で構成されます。変換を指定します。変換は、明示的 (キャスト演算子で指定) または暗黙的のいずれかdouble x = 42;です。したがって、あなたが本当に求めているのは、括弧が暗黙の変換を引き起こす可能性があるかどうかです。

そして、少なくともあなたが示したコードでは、答えはノーです。

C99 標準(3.7 MB PDF) のセクション 6.5.1p5を引用します。

括弧で囲まれた式は一次式です。その型と値は、括弧で囲まれていない式のものと同じです。括弧で囲まれていない式がそれぞれ左辺値、関数指定子、または void 式である場合、それは左辺値、関数指定子、または void 式です。

256Uはすでに であるためprimary expression、括弧はまったく違いはありません。括弧は一般に優先順位を示しますが、この場合、示す優先順位はありません。

どの静的解析ツールを使用していますか? おそらくバグレポートを提出する必要があります。

于 2011-09-17T19:11:01.780 に答える
4

ツールはどういうわけか混乱しています。ここにはキャスティングはありません。これらの括弧は単に優先順位を示しています。

于 2011-09-17T18:21:22.563 に答える