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

第二个代码出了什么问题?为什么 printf 在任何地方都不会出错?

4

2 回答 2

8
i < size

i有符号和size无符号时,则i在执行比较之前将其转换为无符号。这是所谓的通常算术转换的一部分。

-1转换为无符号类型时,结果是无符号类型可表示的最大可能值,因此当为的任何值i < size时为假。i-1size

当您i < (int)size改为使用时,两个操作数<都是 type int,因此不需要执行转换,并且由于两个操作数都是有符号的,您会得到预期的结果。

于 2010-11-30T07:46:11.593 回答
0

size_t 是无符号的。当您将 size 转换为 int 时,您将转换回有符号,并且比较有效。

于 2010-11-30T07:47:50.080 回答