这里有一段C代码:
int array[] = {1,2,3,4,5,6,7};
#define LEN (sizeof(array) / sizeof(array[0]))
int main(void) {
int i, sum = 0;
for (i = 0; i < LEN; i++) {
sum += array[i];
}
printf("%d\n", sum);
return 0;
}
输出结果是28,可是如果把上面的for循环改成下面这样:
for (i = -1; i < LEN - 1; i++) {
sum += array[i + 1];
}
结果就成了0.我用gdb运行了一下,发现第二种写法根本没进for循环,直接执行了后面的打印。
请问为什么会这样呢?
因为类型转换, 在这个表达式
i < LEN - 1
中,LEN - 1
将被宏扩展为,(sizeof(array) / sizeof(array[0])) -1
.这个表达式的类型是,
long unsigned int
,所以在表达式i < LEN - 1
中的i
为-1
类型转换为long unsigned int
成为2^n-1
(n与系统有关)大于6,所以没有执行.for循环中不要使用无符号整数, 否则负数会转换成无符号数,导致循环条件出问题.