我想知道为什么这个 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;
}
答案 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]);