是什么原因导致以下代码中的数组无法打印?

时间:2013-06-07 10:19:26

标签: c puzzle

下面的代码有问题......有人可以向我解释这个问题是什么?为什么?

#include<stdio.h>

 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};

 int main()
 {
  int d;

  for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
      printf("%d\n",array[d+1]);

  return 0;
}

3 个答案:

答案 0 :(得分:3)

通常的算术转换。

<=表达式中,int-1转换为无符号类型sizeof并变为巨大值,然后<=表达式假。

使用:

for(d=-1;d <= (int) (TOTAL_ELEMENTS-2);d++)

答案 1 :(得分:1)

请查看以下更改

的#include

 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};

 int main()
 {
  int d,k;
k=TOTAL_ELEMENTS-2;
  for(d=-1;d <=k ;d++)
      printf("%d\n",array[d+1]);

  return 0;
}

答案 2 :(得分:1)

sizeof 运算符: ......

“结果的值是实现定义的,它的类型(无符号整数类型) 是size_t,定义于&lt; stddef.h&gt; (和其他标题)。“ - C99标准。

<强>转化: ...

“否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。 “ - C99标准。

int d(-1)被转换为(TOTAL_ELEMENTS-2)类型,它是sizeof返回类型(无符号整数)。这通常通过将位重新解释为无符号值=&gt;来完成。 -1 signed integer = 0xFFFFFFFF(如果int有32位)无符号整数。

您正在尝试将0xFFFFFFFF与0x5(TOTAL_ELEMENTS-2)进行比较,这是错误的。

你应该有警告......签名/未签名不匹配......

C99 standard