在 For 循环中初始化数组的紧凑代码

Compact Code for Initialization an Array in For-loop

我正在审查包含以下代码片段的代码,以获取最小的可重现示例。所以这里的代码 运行 是一个初始化数组 done 的迭代,如下所示:

#include <stdio.h>
int i,j;
N=10;
int done[500];
void main() {

 done[0]=done[N]=1;
 for(i=0;i<N+1;done[i++]=0){
  printf("Done val %d iteration %d\n",done[i],i);

 }
}

我关心的是我故意初始化了 done[0]=done[1]=1 的值但是当我 运行 初始化循环时,索引 0 和 10 处的值保持不变。我想了解 done[i++] 的语法实际上是如何评估的?

for 循环的递增步骤发生在 循环体执行之后。相当于下面的代码:

i = 0;
while (i < N+1) {
    printf("Done val %d iteration %d\n",done[i],i);
    done[i++] = 0;
}

如您所见,它在 更改它之前打印 done[i] 的值。所以它打印原始值。

您提供的代码片段一开始就无法正确编译!虽然,我假设您已经知道原因。所以,我简单回答你的问题。

首先,您没有按照预期的方式初始化索引。您改为执行以下操作:

done[0]=done[N]=1;

因此,索引零将设置为一,但索引十设置为一而不是索引一。因此,您应该执行以下操作:

done[0]=done[1]=1;

至于for循环本身,你要明白你的增量变量是最后执行的! for 循环是一个遵循程序顺序的三步过程,其中,

  1. 增量变量被初始化
  2. 检查条件语句
  3. 如果条件语句为true,则执行code body then increment/decrement 增量变量,然后转到第二步。否则退出for循环!

因此,done[i++]=0 在提供的代码块中的 printf() 语句之后得到评估!更多信息请查看C++ for loop - Tutorialspoint