-2
#include<stdio.h>

#define N (sizeof(array) / sizeof(array[0]))

main()
{
   int array[5]={1,2,3,4,5};
   int d;
   for(d=-1;d <= N;d++)
       printf("%d\n",array[d+1]);
   return 0;
}

上面的代码没有显示任何东西?谁能告诉我为什么?

4

7 回答 7

1

首先,我会顺便指出,当前的代码将在数组边界之外读取,因为d+16在循环的最后一次迭代中,而最高有效数组索引是4. 但这不是您的代码的主要问题;就目前而言,当 时d = -1,条件d <= N实际上将评估为false,因此循环立即终止而无需经过任何迭代。问题是表达式的结果 sizeof(array) / sizeof(array[0])是类型size_t,它是一个无符号整数,d而是一个int,即一个有符号整数。在实际比较之前,先d转换为 a size_t(这称为类型提升),结果是 a大的正整数,因此表达式的d <= N计算结果为假。有关更多信息,请参阅c-faq 条目。要真正把重点放在家里,您可能想尝试以下代码,看看它是否按预期工作:

int d = -1;
printf("%u\n", d); 

size_t n = 5000;
if (d > n) printf("oops!\n");

修复您的代码相当简单 - 例如,正如其他人所建议的那样,将循环重写为

for (d = 0; d < N; d++) {
        printf("%d\n", array[d]);    
}

将工作。

于 2012-06-19T10:32:51.833 回答
1

d 的范围从 -1 到 5 (含),因此您可以通过 array[6] 访问 array[0] ...或者您可以访问,除了 的值为sizeoftype unsigned,因此 -1 <= N 为假。

于 2012-06-19T10:33:43.287 回答
1

只要索引的有效值以这样一种方式计算,即您可以在有效范围内引用数组,您就可以对索引进行任何类型的 mumbo jombo 魔术游戏。

您的代码最终会解析为有效的索引范围,即:0to 4,因此它是有效的。

于 2012-06-19T08:13:51.730 回答
0

数组几乎从 [0] 开始,到 [n-1] 结束,这里使用数组 int 并声明 d 变量。你可以打印数组输入的样式然后 arr[0] 启动它们。

for(d=0;d<=array[5-1];d++)/声明 for 循环/

printf("%d",array[d];/*按顺序打印数组*/

于 2012-06-19T08:46:39.467 回答
0

不,因为:你在哪里定义 Nt? Nt 未申报

于 2012-06-19T08:13:57.240 回答
0

假设Nt你的意思是N,那么是的,它应该工作。

于 2012-06-19T08:14:40.663 回答
0

好吧,这看起来像是一种有效的打印格式,但for(d=-1;d <= Nt;d++)我认为您的意思是 N,您已在宏中定义

于 2012-06-19T08:15:24.680 回答