开发者

Strange behaviour with for loop and size_t

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

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

The above cod开发者_高级运维e (using gcc) outptus

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);
 }

This code (i is initialized to -1) outputs only 4 and nothing in the loop.

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

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

Adding a cast makes the code run fine again. The output is

4

-1 0 1 2 3

What's going wrong in the second code? Why doesn't printf go wrong anywhere?


i < size

When i is signed and size is unsigned, then i is converted to unsigned before the comparison is performed. This is part of what are called the usual arithmetic conversions.

When -1 is converted to an unsigned type, the result is the largest possible value representable by the unsigned type, thus i < size is false when i is -1 for any value of size.

When you use i < (int)size instead, both operands of < are of type int, so no conversions need to be performed and since both operands are signed, you get the expected result.


size_t is unsigned. When you cast size to int, you're casting back to signed, and the comparison works.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜