1

可能重复:
一个谜语(C 语言)

有人可以解释一下这段代码有什么问题吗?

#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

2 回答 2

2
d <= (TOTAL_ELEMENTS-2)

d已签名:它是一个int. 但是TOTAL_ELEMENTS是无符号的:sizeof产生一个size_t值并且size_t是无符号类型。

<=表达式 d中通过通常的算术转换方式转换为无符号数,它变成一个巨大的数字。

于 2012-11-05T09:59:01.900 回答
1

d为-1 并与之比较TOTAL_ELEMENTS-2(即size_t类型,即无符号整数)时,d提升为无符号类型中的大数。然后,d大于TOTAL_ELEMENTS-2,因此永远不会执行循环。

§ 6.5.8 关系运算符
如果两个操作数都具有算术类型,则执行通常的算术转换。

§ 6.3.1.8 通常的算术转换
否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则具有符号整数类型的操作数被转换为具有无符号的操作数的类型整数类型。

于 2012-11-05T09:59:21.073 回答