为什么这两段C代码输出的结果会不一样?

这里有一段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循环,直接执行了后面的打印。

请问为什么会这样呢?

阅读 1.6k
1 个回答

因为类型转换, 在这个表达式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循环中不要使用无符号整数, 否则负数会转换成无符号数,导致循环条件出问题.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进