C++ 为什么不期望输出是现在的样子?

C++ 为什么不期望输出是现在的样子?,c++,c,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 <= (T

已通过以下代码:

#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;
}
#包括
#定义总元素(sizeof(数组)/sizeof(数组[0]))
int数组[]={1,2,3,4,5,6,7};
int main()
{
签名int d;
printf(“数组中的元素总数=>%d\n”,元素总数);

对于(d= -1;d)程序看起来应该会抛出编译错误。在定义之前,您使用“数组”。切换前两行,应该是好的。< /p> < p>原因是C++中得到了隐式提升。即使<代码> d>代码>被声明为已签名,当将它与(TooToLeEnts-2)比较时。(未经签名,由于<代码> sieOS/<代码>),<代码> d>代码>被提升为无符号。C++具有非常具体的规则,基本上表示D的未签名值将是一致的无符号值mod <代码>数字限制::()
。在本例中,这是可能的最大无符号数,明显大于比较另一侧的数组大小


请注意,一些编译器,如g++(带-Wall)可以被告知对此类比较发出警告,这样您就可以确保代码在编译时看起来正确。

该程序做什么?@Acme:我宁愿让我的技能用不那么难看的程序进行测试。:)@Gman::这是对我知识贫乏的赞扬还是讽刺?@Acme:我是说我希望没有人真的写这样的代码,这样就不会有问题了。哦,而且
#include
是无效的C。预处理器是文本替换。在被替换的地方,
数组
是定义的。数组用于定义。在所有地方,TOTAL\ELEMENTS被扩展,它将被定义。TOTAL_元素没有在第一行中使用,它是被定义的。@AJG85:数组在什么上下文中是保留字?@AJ:好的……那么,
array
什么时候是保留关键字呢?而且每一个半体面的编译器都会警告你,这是一个完美的例子,忽略的警告会让你受到警告。@Acme我不熟悉C标准足以说明升级规则是否相同。