一个谜语(在C中)

一个谜语(在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;
  }

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

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

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

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


慕虎7371278
浏览 429回答 3
3回答

喵喵时光机

问题是这(TOTAL_ELEMENTS-2)是一个无符号值。进行比较时d <= (TOTAL_ELEMENTS-2),两个值都将转换为无符号值,结果为false。在你的第二个例子中,x签名所以没有问题。

白板的微信

的sizeof操作者产生类型的结果size_t。在第一个版本中,您将int(签名)与size_t(未签名)进行比较。在第二个版本中,通过赋值将size_t表达式转换为a&nbsp;int,因此比较的两个操作数具有相同的类型。

慕容3067478

另一种看待这个问题的方法如下#include<stdio.h>int&nbsp;main()&nbsp;{int&nbsp;i&nbsp;=&nbsp;-5;unsigned&nbsp;int&nbsp;j&nbsp;=&nbsp;6;if(i&nbsp;<&nbsp;j) &nbsp;&nbsp;printf("-5&nbsp;is&nbsp;less&nbsp;than&nbsp;6");else &nbsp;&nbsp;printf("-5&nbsp;is&nbsp;greater&nbsp;than&nbsp;6");return&nbsp;0;}输出是:-5&nbsp;is&nbsp;greater&nbsp;than&nbsp;6原因:&nbsp;将无符号整数与有符号整数进行比较将始终返回false。在提问者的情况下,&nbsp;sizeof返回无符号数据类型,但它与签名数据类型进行比较( - 是一个错误)
打开App,查看更多内容
随时随地看视频慕课网APP