【发布时间】:2014-09-07 01:31:12
【问题描述】:
所以我前段时间遇到了这个问题,无法弄清楚它的问题,但它让我想知道它为什么有效。我没有摆在我面前的问题,但我会尽力从记忆中重复它。
为什么这两段代码在 C 中的输出完全相同?其中一个显然是错误的。
代码 1:
int main()
{
int a;
int b[] = {1,2,3,4};
for(a = 0; a<4; a++)
printf("%i\n",b[a]);
return;
}
代码 2:
int main()
{
int a;
int b[] = {1,2,3,4};
for(a = 0; a<4; a++)
printf("%i\n",a[b]);
return;
}
两段代码的输出是:
1
2
3
4
有人告诉我这与堆栈和内存位置有关,但解释不够清楚。谁能帮忙更清楚地解释一下?
【问题讨论】:
-
其实语法是正确的。唯一的问题是 printf() 中缺少双引号。
-
这两个程序都不是远程正确的。
b也不是数组,因此b的初始化程序出现故障。返回int的函数不应包含没有值的return。printf()语句需要双引号。我们假设两者都以#include <stdio.h>开头;如果他们不这样做,他们应该这样做。 -
当您查看此评论时,代码中的一些问题可能已通过一次或多次编辑修复(有一个待定的编辑修复了最严重的语法问题)。程序之间的唯一区别是
b[a]与a[b]在printf()语句中的使用。重复的问题涵盖了这一点。 -
@Mo2 抱歉,我的第一条评论不是很好。正如@JonathanLeffler 同时回答的那样,问题是将
b声明为int(而不是int[])。一旦解决了这个问题,行为就如其他答案所解释的那样。如果编译你的代码,我的编译器只给了我一个关于虚假初始化程序的警告,但在int使用 anotherint下标的那一行出现错误。