任何人都可以解释我的输出 我有像
这样的代码#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中更改d in的值时,它显示输出为什么?
如果我删除宏TOTAL_ELEMENT机智d&lt; = 4;我得到了所需的输出为什么?
答案 0 :(得分:6)
正如其他人在答案中所述,d = -1
它不会打印任何内容,如:
d <= TOTAL_ELEMENTS
d
转换为无符号整数类型(TOTAL_ELEMENTS
的类型为size_t
,因为sizeof
)。转换后d
值变为一个巨大的无符号整数,并且与TOTAL_ELEMENTS
值的比较失败。
然后:
printf("%d\n",array[d+1]);
会使数组溢出,因为数组的最后一个元素位于索引TOTAL_ELEMENTS - 1
,并且您访问的数组最多为TOTAL_ELEMENTS + 1
。
要显示数组元素,只需使用从索引0
开始的常规表单:
int i;
for (i = 0; i < TOTAL_ELEMENTS; i++)
{
printf("%d\n", array[i]);
}
答案 1 :(得分:3)
您需要了解“有符号和无符号类型之间比较的转换规则”。在示例for(d=-1;d <= (TOTAL_ELEMENTS);d++)
中,此处d为signed int,TOTAL_ELEMENTS
为无符号,d <= TOTAL_ELEMENTS
将d转换为无符号。无符号-1是一个非常大的数字,不是< TOTAL_ELEMENTS
,因此循环永远不会被执行。 Typecast如下图所示。它会起作用。
for(d=-1;d <= (int)(TOTAL_ELEMENTS);d++)
答案 2 :(得分:-1)
尝试将TOTAL_ELEMENTS转换为int
for(d=-1;d <= (int)(TOTAL_ELEMENTS);d++)