我们可以打印这样的数组吗?

时间:2012-06-19 08:11:17

标签: c

#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;
}

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

7 个答案:

答案 0 :(得分:1)

只要索引的有效值以您在有效范围内引用数组的方式进行求值,就可以对索引执行任何类型的mumbo jombo magic play。

您的代码最终会解析为有效的索引范围,例如:04,因此它有效。

答案 1 :(得分:1)

首先,我会顺便注意到它所代表的代码将在数组的边界之外读取,因为d+1在循环的最后一次迭代时将是6,而最高的是有效数组索引为4。但这不是您的代码的主要问题;就目前而言,当d = -1时,条件d <= N实际上将评估为false,因此循环立即终止而不经历任何迭代。问题是表达式sizeof(array) / sizeof(array[0])的结果是size_t类型,它是无符号整数,而dint,即一个签名的整数。在实际比较之前,d会转换为size_t(这称为类型促销),从而产生大正整数,以及因此表达式d <= N的计算结果为false。有关详细信息,请参阅this 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]);    
}

会奏效。

答案 2 :(得分:1)

d的范围从-1到5(包括-1和5),因此您可以通过数组[6]访问数组[0] ...或者除了sizeof的值为unsigned类型外,您可以访问它所以-1&lt; = N是假的。

答案 3 :(得分:0)

不,因为: 你在哪里定义Nt? Nt未声明

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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