C' s for循环的参数

时间:2015-02-04 22:16:23

标签: c

我想用4个像素的块来初始化一个16个单元长的数组,其中0,1,2和3。所以这是我的第一次尝试:

int main(void) {
int t[16];
int i;
for (i = 0; i<=15; t[i++]=i/4)
{
    printf("%d \n", t[i]);
}

return 0;
}

然而,here是我得到的。我知道我可以通过将效果放入for循环来做到不同,但为什么这不起作用?

编辑:请注意,printf仅用于检查循环在阵列中放置的内容。

5 个答案:

答案 0 :(得分:5)

初始化工作正常;您只是在初始化之前打印单元格。请记住,循环增量在每次迭代后完成。如果您展开循环,则有:

i = 0;          /* i is now 0  */
print(t[i]);    /* prints t[0] */
t[i++] = i/4;   /* sets t[0]   */
                /* i is now 1  */
print(t[i]);    /* prints t[1] */
t[i++] = i/4;   /* sets t[1]   */
                /* i is now 2  */
print(t[i]);    /* prints t[1] */
/* etc. */

答案 1 :(得分:2)

我不明白你想要完成什么,但请让我先给你看一段类似的代码。

int main(void) {
int t[16];
int i;
//edited the code; providing standard way to do the task
for (i = 0; i<=15; i++)
{
    t[i]=i/4;
    printf("%d \n", t[i]);
}

return 0;
}

修改

while循环应该这样写:

int i = 0;
while (i<=15){
    t[i] = i%4;
    i++;
}

这意味着设置t[i]等于i%4,然后增加i

由于您是初学者,我已经更新了for循环,它现在提供了执行任务的标准方法。在第三个for循环命令上有一个简单的增量是更好的;如上所述,在for循环中完成剩下的工作。

答案 2 :(得分:2)

除了其他帖子中提到的循环开始/结束的逐个错误之外,此代码:

t[i++]=i/4

导致未定义的行为,因为i在没有序列点的情况下被读取和写入。 &#34;未定义的行为&#34;意味着任何事情都可能发生:价值可能是3,或4,或其他任何事情,或者程序可能崩溃等等。

See this thread进行更深入的讨论,欢迎来到C .. :)

答案 3 :(得分:1)

@naltipar:是的,我只是忘了初始化第一个cel,就像grawity指出的那样。实际上,我为自己编写的版本是使用i ++,但即便如此,因为第三个表达式在每个循环之后执行,它发出相同的结果。但无论如何,它现在已得到修复。

然而,我有另一个问题,我确信我错过了但仍然无法理解:

int i = 0;
while (i<=15)
    t[++i] = i%4;

这是第一次:

for(i = 0; i<=15; t[++i] = i%4);

但是它产生了无限循环。因此,为了确保这不是特定于问题的问题,我切换到了同时仍然发生同样的事情。话虽如此,如果我用i ++替换++ i,就不会发生这种情况。我展开了整个循环,一切似乎都很好......

顺便说一下,如果你想知道的话,我是初学者。

答案 4 :(得分:0)

更清晰的方式来写这个更不容易出错:

for (i = 0; i < 16; ++i)
  printf ("%d\n", (t[i] = i % 4));

我个人用这种方式编写代码,但我从不推荐它。此外,我并没有真正看到像这样的叙述语句中的许多好处,特别是在最重要的类别中:执行时间。优化可能更加困难,因此与简单使用相比,性能实际上可能会降低:

for (i = 0; i < 16; ++i)
  {
    t[i] = i % 4;
    printf ("%d\n", t[i]);
  }

即使您正在阅读自己的代码,也会让您未来的自我难以理解。 KISS(保持简单,愚蠢),您现在可以更容易地编写代码,并且如果需要,可以在以后轻松修改代码。