2011-03-18 66 views
2

已经持续通过这个代码:为什么输出结果不符合它的要求?

#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

程序做了什么**? – templatetypedef 2011-03-18 19:32:23

+2

测试你的技能。 – Sadique 2011-03-18 19:38:36

+1

@Acme:我宁愿让我的技能在不太难看的节目中测试。 :) – GManNickG 2011-03-18 19:43:52

回答

15

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

请注意,像g ++(带-Wall)的编译器可以被告知警告这样的比较,所以您可以确保代码在编译时看起来正确。

+4

另外,每半个体面的编译器都会警告你,它是一个完美的例子,在这个例子中,忽略警告能够帮助你。 – pmr 2011-03-18 19:40:48

+0

+1为更快:) – MByD 2011-03-18 19:43:03

+0

为什么只有C++?而不是C? http://www.ideone.com/JzkCv – Sadique 2011-03-18 19:51:50

-3

该程序看起来应该会引发编译错误。你甚至在定义之前使用“数组”。切换前两行,应该没问题。

+2

预处理器是文本替换。在被替换的地方,定义了“数组”。 – GManNickG 2011-03-18 19:37:08

+0

数组用于定义。在所有地方TOTAL_ELEMENTS被扩展后,它将被定义。 – pmr 2011-03-18 19:37:11

+0

TOTAL_ELEMENTS在第一行没有被使用,它被定义。 – 2011-03-18 19:37:18

相关问题