1
 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = 0; i < size; i++) {
    printf("%d ", i);
 }

上記のコード (gcc を使用) の出力

4

0 1 2 3

 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = -1; i < size; i++) {
    printf("%d ", i);
 }

このコード (i は -1 に初期化されます) は 4 のみを出力し、ループには何も出力しません。

 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = -1; i < (int) size; i++) {
    printf("%d ", i);
 }

キャストを追加すると、コードが再び正常に実行されます。出力は

4

-1 0 1 2 3

2 番目のコードで何が問題になっていますか? printf がどこにも問題を起こさないのはなぜですか?

4

2 に答える 2

8
i < size

isize符号付きで符号なしの場合i、比較が実行される前に符号なしに変換されます。これは、通常の算術変換と呼ばれるものの一部です。

-1unsigned 型に変換されると、結果は unsigned 型で表現可能な最大値になるため、 がの任意の値である場合はi < sizefalse になります。i-1size

i < (int)size代わりにを使用すると、 の両方のオペランド<が typeintであるため、変換を実行する必要がなく、両方のオペランドが署名されているため、期待される結果が得られます。

于 2010-11-30T07:46:11.593 に答える
0

size_t はunsignedです。size を int にキャストすると、signed にキャストし直され、比較が機能します。

于 2010-11-30T07:47:50.080 に答える