一个不寻常的for循环语句



在C和C#中,这个片段:

int ii;
for(ii=1;ii<5;ii++);
printf("ii = %d",ii);

打印出ii = 5,而这个片段(注意<=):

int ii;
for(ii=1;ii<=5;ii++);
printf("ii = %d",ii);

打印出CCD_ 3。

你能解释一下这里发生了什么吗?为什么for循环以分号结尾?

for循环的主体为空:

int ii;
for(ii=1;ii<5;ii++);
//                 ↑ body of the for loop
printf("ii = %d",ii);

该代码将ii设置为1,然后递增ii直到5,而不在for循环体中执行任何操作,最后打印ii

如果你想打印数字1到4,那么你应该把printf调用放在for循环体中:

int ii;
for(ii=1;ii<5;ii++) {
    printf("ii = %d",ii);
}
for (i = 0; i < 5; i++);

从0到4进行迭代,每次迭代都不执行任何操作。这个nothing是一个空语句,它是分号。

这是有意义的,例如:

for (i = 0; i < 5; printf ("%d", i++) );

由于for循环包含一个空语句(末尾为分号),因此ii的值是导致循环退出的值。所以当ii<5不为真时(因为ii是5),您会看到5的输出。

请记住,循环声明的增量部分发生在循环的末尾,因此输出正如预期的那样——在第一个示例中,循环在ii变为5后停止(循环体为空,在ii为0到4的情况下执行)。

第二个循环的(空)主体执行六次(从0到5),当ii变为6时停止。

使用您的代码,获得输出6是正确的。流程如下:您的"ii"将分别递增到5和6(第一个和第二个循环)。因为您正在循环for循环,而不需要执行正文

对于(ii=1;ii<5;ii++);#分号意味着循环它而不需要执行正文,这意味着它循环时除了递增计数器之外什么都不做。

对于(…){//车身}

如果您"需要"执行正文,则不使用分号。

删除for后面的分号,当表达不带{}的for循环时,它将在语句后面的循环中执行代码,直到找到;在您的情况下,for循环找不到要执行的语句。删除for和下一行代码后的分号,print语句将被执行。

最新更新