我想用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仅用于检查循环在阵列中放置的内容。
答案 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(保持简单,愚蠢),您现在可以更容易地编写代码,并且如果需要,可以在以后轻松修改代码。