for循环和size_t的奇怪行为

时间:2010-11-30 07:43:42

标签: c for-loop printf size-t

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

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

以上代码(使用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);
 }

此代码(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在任何地方都不会出错?

2 个答案:

答案 0 :(得分:9)

i < size

签名isize未签名后,i会在执行比较之前转换为无符号。这是所谓的通常算术转换的一部分。

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

当您使用i < (int)size时,<的两个操作数都属于int类型,因此不需要执行任何转换,并且由于两个操作数都已签名,因此您将获得预期的结果。

答案 1 :(得分:1)

size_t是无符号。当你将size转换为int时,你将返回到signed,并进行比较。