一个谜语(在C中)

Gil*_*man 16 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]);
      getchar();
      return 0;
  }
Run Code Online (Sandbox Code Playgroud)

上面的代码应该打印所有的数组元素,代码中的问题是什么(输出什么都没有)?我认为循环不会迭代一次?

我发现以下代码确实有效:

#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;
  }
Run Code Online (Sandbox Code Playgroud)

我有一个理论认为它与宏有关,但我不能指责问题.

int*_*jay 35

问题是这(TOTAL_ELEMENTS-2)是一个无符号值.进行比较时d <= (TOTAL_ELEMENTS-2),两个值都将转换为无符号值,结果为false.

在你的第二个例子中,x签名所以没有问题.

  • 这就是为什么几乎所有人都写这种循环以减少有符号/无符号错误的方式:for(d = 0; d <TOTAL_ELEMENTS; d ++)printf("%d \n",array [d]); (5认同)

Bla*_*iev 8

sizeof操作者产生类型的结果size_t.在第一个版本中,您将int(签名)与size_t(未签名)进行比较.

在第二个版本中,通过赋值将size_t表达式转换为a int,因此比较的两个操作数具有相同的类型.