#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;
}
上面的代码没有显示任何东西?谁能告诉我为什么?
#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;
}
上面的代码没有显示任何东西?谁能告诉我为什么?
首先,我会顺便指出,当前的代码将在数组边界之外读取,因为d+1
将6
在循环的最后一次迭代中,而最高有效数组索引是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]);
}
将工作。
d 的范围从 -1 到 5 (含),因此您可以通过 array[6] 访问 array[0] ...或者您可以访问,除了 的值为sizeof
type unsigned
,因此 -1 <= N 为假。
只要索引的有效值以这样一种方式计算,即您可以在有效范围内引用数组,您就可以对索引进行任何类型的 mumbo jombo 魔术游戏。
您的代码最终会解析为有效的索引范围,即:0
to 4
,因此它是有效的。
数组几乎从 [0] 开始,到 [n-1] 结束,这里使用数组 int 并声明 d 变量。你可以打印数组输入的样式然后 arr[0] 启动它们。
for(d=0;d<=array[5-1];d++)/声明 for 循环/
printf("%d",array[d];/*按顺序打印数组*/
不,因为:你在哪里定义 Nt? Nt 未申报
假设Nt
你的意思是N
,那么是的,它应该工作。
好吧,这看起来像是一种有效的打印格式,但for(d=-1;d <= Nt;d++)
我认为您的意思是 N,您已在宏中定义