一直在阅读这段代码:
#include<cstdio>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {1,2,3,4,5,6,7};
int main()
{
signed int d;
printf("Total Elements in the array are => %d\n",TOTAL_ELEMENTS);
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
return 0;
}
现在显然它没有进入for循环。 是什么原因?
答案 0 :(得分:15)
原因是在C ++中你得到一个隐式的提升。即使d
被声明为已签名,但当您将其与(TOTAL_ELEMENTS-2)
(由于sizeof
而未签名)进行比较时,d
会被提升为无符号。 C ++有非常具体的规则,基本上说d的无符号值将是全等无符号值mod numeric_limits<unsigned>::max()
。在这种情况下,这是最大可能的无符号数,它明显大于比较另一侧的数组大小。
请注意,可以告诉某些编译器(如g ++(带-Wall))警告此类比较,以便确保代码在编译时看起来正确。
答案 1 :(得分:-3)
该程序看起来应该抛出编译错误。你在定义之前就使用“数组”了。切换前两行,应该没问题。