-1

谁能解释我的输出
我有代码

#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
             int array[] = {23,34,12,17,204,99,16};
             for(d=-1;d <= (TOTAL_ELEMENTS);d++)
             {
              printf("%d\n",array[d+1]);
              }

它没有显示输出,为什么会这样?
但是当我像 d=1 这样在 for 循环中更改 d 的值时,它会显示输出为什么?
如果我删除宏 TOTAL_ELEMENT wit d<=4 ;我得到了想要的输出为什么?

4

3 回答 3

6

正如其他人在他们的回答中所说,d = -1它不会打印任何内容,如:

d <= TOTAL_ELEMENTS

d被转换为无符号整数类型(TOTAL_ELEMENTSis of type size_tbecause of sizeof)。转换后d的值变成一个巨大的无符号整数并且与 TOTAL_ELEMENTS值的比较失败。

然后:

printf("%d\n",array[d+1]);

将溢出您的数组,因为数组的最后一个元素位于索引处TOTAL_ELEMENTS - 1,并且您访问数组最多TOTAL_ELEMENTS + 1.

要显示您的数组元素,只需使用从 index 开始的常规形式0

int i;

for (i = 0; i < TOTAL_ELEMENTS; i++)
{
    printf("%d\n", array[i]);
}
于 2013-05-07T12:27:30.610 回答
3

您需要了解“有符号和无符号类型之间比较的转换规则”。在示例中for(d=-1;d <= (TOTAL_ELEMENTS);d++),这里 d 是有符号 int,并且TOTAL_ELEMENTS是无符号的,d <= TOTAL_ELEMENTS并将 d 转换为无符号。Unsigned -1 是一个巨大的数字,不是< TOTAL_ELEMENTS,所以循环永远不会被执行。如下图所示。它会起作用的。

for(d=-1;d <= (int)(TOTAL_ELEMENTS);d++)
于 2013-05-07T12:39:06.777 回答
-1

尝试将 TOTAL_ELEMENTS 转换为 int

for(d=-1;d <= (int)(TOTAL_ELEMENTS);d++)
于 2013-05-07T12:32:00.940 回答