为什么输出预计不会是这样的?

时间:2011-03-18 19:29:44

标签: c++ c

一直在阅读这段代码:

#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循环。 是什么原因?

2 个答案:

答案 0 :(得分:15)

原因是在C ++中你得到一个隐式的提升。即使d被声明为已签名,但当您将其与(TOTAL_ELEMENTS-2)(由于sizeof而未签名)进行比较时,d会被提升为无符号。 C ++有非常具体的规则,基本上说d的无符号值将是全等无符号值mod numeric_limits<unsigned>::max()。在这种情况下,这是最大可能的无符号数,它明显大于比较另一侧的数组大小。

请注意,可以告诉某些编译器(如g ++(带-Wall))警告此类比较,以便确保代码在编译时看起来正确。

答案 1 :(得分:-3)

该程序看起来应该抛出编译错误。你在定义之前就使用“数组”了。切换前两行,应该没问题。