0

このコードは、VisualStudio2010でコンパイルした場合

#include <cstdlib>
#include <cstdio>

int numbers[] = { 23, 24, 25, 25, 28, 20, 20 };

int main(void) {
    int d = -1, x=0;
    size_t count = sizeof(numbers) / sizeof(numbers[0]);

    if (d <= (sizeof(numbers) / sizeof(numbers[0]))-2)
        x = numbers[d+1];

    if (d <= count-2)
        x = numbers[d+1];
}

に符号付き/符号なしの不一致の警告if (d <= count-2)が表示されますが、は表示されませんif (d <= (sizeof(numbers) / sizeof(numbers[0]))-2)。どうしてこれなの?すべての警告を有効にしました。

4

3 に答える 3

1

この場合、VisualC++コンパイラが警告C4018を発行しないのはバグです。MicrosoftConnectのバグレポート「sizeof演算子に関するC4018(符号付き/符号なしの不一致)の警告」を参照してください。

この問題は、の使用に間接的にのみ関連しているようですsizeof。コンパイラは、符号なし型の定数値が比較に含まれる他の場合にも警告を発しません。たとえば、にconst-qualificationを追加するcountと、2回目の比較でもC4018は出力されません。

于 2012-04-13T23:07:15.620 に答える
0

私の推測では、それはintとして扱わ2れるので、角かっこのためにintに昇格 (sizeof(numbers) / sizeof(numbers[0]))-2)し、comaprisonはint < int

于 2012-04-13T21:35:19.843 に答える
0

size_tはunsignedとして定義されているため、signedunsignedの競合が発生します。

sizeofコンパイル時に評価され、定数値に置き換えられるため、符号の不一致については文句を言わないことに注意してください。ただし、他の式では、値をsize_t変数に明示的に変換します。これは、次のようにするとオーバーフローする可能性があります。署名された番号と比較してください。

于 2012-04-13T21:38:23.533 に答える