c代码输出意外/预期的行为

pee*_*ush 1 c

这段代码有什么问题?谁有人解释一下?

#include <stdio.h>
#include <malloc.h>

#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
  int array[] = {23,34,12,17,204,99,16};

  int main()
  {
      int num;
      int d;
      int size = TOTAL_ELEMENTS -2;
      printf("%d\n",(TOTAL_ELEMENTS-2));

      for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
          printf("%d\n",array[d+1]);

      return 0;
  }
Run Code Online (Sandbox Code Playgroud)

当我打印它给5,但内部循环发生了什么?

Gre*_*ill 5

sizeof运算符返回类型的值size_t,这是一个无符号的值.在你的for循环条件测试中:

d <= (TOTAL_ELEMENTS-2)
Run Code Online (Sandbox Code Playgroud)

您正在将带符号的值(d)与无符号值(TOTAL_ELEMENTS-2)进行比较.这通常是一个警告条件,您应该在编译器上调高警告级别,以便正确获取警告消息.

编译器只能为有符号或无符号比较生成代码,在这种情况下,比较是无符号的.整数值in d转换为无符号值,在2的补码结构上最终为0xFFFFFFFF或类似.这不低于你的TOTAL_ELEMENTS-2价值,因此比较是错误的.