为什么这段代码有输出?

时间:2016-01-15 09:31:50

标签: c type-conversion

我想知道为什么这个 code的输出什么都没有?它是否与在SIZE循环表达式中使用for相关?

CODE

#include<stdio.h>
int array[6] = {4, 5, 6, 10, -1, 0};
#define SIZE (sizeof(array)/sizeof(array[0]))
int main() {
    int i;  
    for (i= -1; i< SIZE; ++i)  printf("%d", array[i+1]);
    return 0;
}

3 个答案:

答案 0 :(得分:10)

for (i= -1; i< SIZE; ++i)  printf("%d", array[i+1]);

相反,请在循环中将i初始化为0 -

for (i= 0; i< SIZE; ++i)  printf("%d", array[i]);

由于有符号整数和无符号整数( -1 的转换,因此因为循环不迭代而导致无法输出的原因 unsigned int 并产生非常大的值,因此条件为假)。

答案 1 :(得分:5)

sizeof运算符的结果始终是size_t类型,它保证是大于或等于unsigned int的无符号整数。

因此,整个SIZE宏的结果类型为size_t,为无符号整数类型。

然而,迭代器i被声明为普通int,它被签名并包含负值。

在表达式i< SIZE中,i的隐式类型转换为与SIZE相同的类型(“通常的算术转换”)。由于它是一个负数,它最终将成为一个非常大的无符号数。条件的计算结果为false,因此永远不会执行for循环。

答案 2 :(得分:3)

在你的循环中

for (i= -1; i< SIZE; ++i)

支票i < SIZE被评估为无符号,即MAX_UINT < 6,即false

然后您的for不会重复。

使用下面的循环

for (i=0; i<SIZE; i++)  printf("%d", array[i]);

另一种选择,不推荐,可能是

for (i= -1; i< (int)SIZE-1; i++)  printf("%d", array[i+1]);