一位朋友给了我一个谜语:
#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]);
      getchar();
      return 0;
  }
上面的代码应该打印所有的数组元素,代码中的问题是什么(输出什么都没有)?我认为循环不会迭代一次?
我发现以下代码确实有效:
#include<stdio.h>
#define TOTAL_ELEMENTS ((sizeof(array) / sizeof(array[0])))
  int array[] = {23,34,12,17,204,99,16};
  int main()
  {
      int d;
      int x = (TOTAL_ELEMENTS-2);
      for(d=-1;d <= x;d++)
          printf("%d\n",array[d+1]);
      getchar();
      return 0;
  }
我有一个理论认为它与宏有关,但我不能指责问题.
int*_*jay 35
问题是这(TOTAL_ELEMENTS-2)是一个无符号值.进行比较时d <= (TOTAL_ELEMENTS-2),两个值都将转换为无符号值,结果为false.
在你的第二个例子中,x签名所以没有问题.
的sizeof操作者产生类型的结果size_t.在第一个版本中,您将int(签名)与size_t(未签名)进行比较.
在第二个版本中,通过赋值将size_t表达式转换为a int,因此比较的两个操作数具有相同的类型.