可能重复:
A riddle (in 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]);
return 0;
}
答案 0 :(得分:2)
d <= (TOTAL_ELEMENTS-2)
d
已签名:它是int
。
但TOTAL_ELEMENTS
未签名:sizeof
生成size_t
值,size_t
为无符号类型。
在<=
表达式d
中,通过通常的算术转换将其转换为无符号数,并且它变为一个巨大的数字。
答案 1 :(得分:1)
当d
为-1且与TOTAL_ELEMENTS-2
(size_t
类型,即无符号整数)进行比较时,d
为在无符号类型中提升为大数。然后,d
大于TOTAL_ELEMENTS-2
,因此循环永远不会执行。
§6.5.8关系运营商
如果两个操作数都具有算术类型,则通常的算术转换是 进行。§6.3.1.8通常的算术转换
否则,如果具有无符号整数类型的操作数的等级大于或等于 等于另一个操作数的类型的等级,然后是操作数 有符号整数类型转换为带有unsigned的操作数的类型 整数类型。