这段代码有什么问题?谁有人解释一下?
#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,但内部循环发生了什么?
的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价值,因此比较是错误的.