#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;
}
上面的代码没有显示任何内容?谁能告诉我为什么?
答案 0 :(得分:1)
只要索引的有效值以您在有效范围内引用数组的方式进行求值,就可以对索引执行任何类型的mumbo jombo magic play。
您的代码最终会解析为有效的索引范围,例如:0
到4
,因此它有效。
答案 1 :(得分:1)
首先,我会顺便注意到它所代表的代码将在数组的边界之外读取,因为d+1
在循环的最后一次迭代时将是6
,而最高的是有效数组索引为4
。但这不是您的代码的主要问题;就目前而言,当d = -1
时,条件d <= N
实际上将评估为false
,因此循环立即终止而不经历任何迭代。问题是表达式sizeof(array) / sizeof(array[0])
的结果是size_t
类型,它是无符号整数,而d
是int
,即一个签名的整数。在实际比较之前,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]; / *按顺序打印数组* /