2

MSVS 2005 では、次の C コードで 1 つの警告が生成されます。

int main() {
    short a = 0;
    a += a; // C4244 (level 4)
    a = a + a; // OK
}

警告メッセージは次のとおりです。

warning C4244: '+=' : conversion from 'int' to 'short', possible loss of data

同じことが C++ コードにも当てはまります。

2つのステートメントの違いは何ですか? 複合演算子が右側の式を左側の型に暗黙的にキャストすると聞いたことがありますが、C または C++ 標準への参照は見つかりませんでした。しかし、sum-and-assignment ステートメントは同じことをすべきではないでしょうか? 私はそれが int 昇格に関係しているのではないかと疑っていましたが、逆アセンブルからわかるように、これは両方の場合に起こります:

[...]
    a += a; // C4244 (level 4)
00411394  movsx       eax,word ptr [a] 
00411398  movsx       ecx,word ptr [a] 
0041139C  add         ecx,eax 
0041139E  mov         word ptr [a],cx 
    a = a + a; // OK
004113A2  movsx       eax,word ptr [a] 
004113A6  movsx       ecx,word ptr [a] 
004113AA  add         eax,ecx 
004113AC  mov         word ptr [a],ax 
[...]

さらに、警告レベルが 4 に設定されている MSVS 2008 では警告は表示されません。これは、後で修正された VS 2005 のバグと見なすことができますか、それとも元の警告に何らかの意味がありますか? ドキュメントはここでは役に立ちません。

4

1 に答える 1

3

偽の警告のようです。

警告は、中間操作についてではなく、作成したコードについて警告することになっています。

あなたが書いたコードは、どの操作でも機能しませんint- 中間操作のみが機能します。

Visual Studio 言語フォーラムでのあなたのケースとほぼ同じケースについての問い合わせには、Jonathan Caves - MSFT が回答しています。彼の答えは次のように終わります。

「これはかなり長い間、修正すべきバグのリストにありました。残念ながら、修正すべき「重要な」バグは常に見つかっているため、このバグを修正することはできませんが、いつか修正する予定です。」

于 2013-09-03T12:38:42.657 に答える