for循环中宏的未定义行为

时间:2013-05-07 12:21:31

标签: c

任何人都可以解释我的输出 我有像

这样的代码
#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;我得到了所需的输出为什么?

3 个答案:

答案 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++)