1

下面的代码有问题...有人可以向我解释问题出在哪里,为什么?

#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;
}
4

3 回答 3

3

通常的算术转换。

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

采用:

for(d=-1;d <= (int) (TOTAL_ELEMENTS-2);d++)
于 2013-06-07T10:20:30.463 回答
1

请找到以下更改

#包括

 #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;
}
于 2013-06-07T10:27:20.873 回答
1

sizeof运算符:...

“结果的值是实现定义的,它的类型(无符号整数类型)是 size_t,在 <stddef.h>(和其他头文件)中定义。” - C99 标准。

转换:...

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

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

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

你应该有一个警告......有符号/无符号不匹配......

C99标准

于 2013-06-07T10:42:15.457 回答