11

几本书向我展示了如何正确编写 for、while 和 do 循环。许多在线文章将它们相互比较。

但我还没有找到任何地方告诉我不该做什么。例如,如果我在循环中更改计数器或条件变量的值,会不会搞砸?

我想要一个不依赖于机器的答案。

4

10 回答 10

12

是的,您可以在循环中更改计数器,它有时非常有用。例如,在解析命令行参数时,其中有一个选项标志后跟一个值。这方面的一个例子如下所示:

输入以下命令:

program -f filename -o option -p another_option

代码:

#include <string.h>

int main(int argc, char** argv)
{

 char *filename, *option, *another_option;

 if(argc > 1){
   for(int i=1; i<argc; i++){
     if(strcmp(argv[i],"-f")==0){
        filename = argv[++i];
     } else if(strcmp(argv[i],"-o")==0){
       option = argv[++i];
     } else if(strcmp(argv[i],"-p")==0){
       another_option = argv[++i];
     } else {
       printf("Option \"%s\" not recognized, skipping\n",argv[i]);
       continue;
     }
   }
 } /* end if argc > 1 */

 return 0;
}

示例程序自动增加计数器以访问正确的命令行字符串。当然有一些方法可以合并计数器等,但在这种情况下它们只会使代码更加麻烦。

正如其他人指出的那样,这是许多人编写错误的地方,并且在循环内递增计数器时必须小心,特别是当循环以计数器值为条件时。

于 2012-05-30T00:37:38.763 回答
7

在 C 中的循环内更改循环计数器并非无效。

但是,这可能会让未来的读者感到困惑,这是这样做的一个很好的理由。

于 2012-05-30T00:19:04.797 回答
4

这取决于您所说的“搞砸”是什么意思。

如果您知道自己在做什么,则可以更改计数器。语言对此没有限制。

于 2012-05-30T00:19:15.280 回答
4

允许在循环中更改计数器变量,但要小心知道您在做什么,以免在不应该的情况下通过减小变量来创建无限循环。

一些算法实际上从中受益,但当然,如果你这样做,它会使你的代码可读性降低,所以请确保你也评论你正在做的事情。

于 2012-05-30T00:20:35.747 回答
3

是的,您可以更改计数器和条件变量。它们只会在循环的下一次迭代中进行评估。

于 2012-05-30T00:18:58.480 回答
2

一定可以。但要注意不要使循环混乱。在循环中更改一个 conter 在 do...while 和 while 中发生了很多。

do{
  counter++;
  some expressions;
}
while(counter < SOMEVALUE);
于 2012-05-30T01:26:35.830 回答
1

是的,在 C/C++/C# 中,您可以在循环中更改计数器等。

于 2012-05-30T00:19:08.503 回答
1

像许多其他技术一样,只要您知道自己在做什么,就可以了。

例如,这段代码:

int i;
for (i=0;i<5;i++)
  printf("%d\n",i--);

是一个无限循环,但是这个版本的冒泡排序:

int *arr,n;
//allocate memory, assign values, and store the length of the array in n
int i;
for (i=0;i<n-1;i++)
  if (arr[i]>arr[i+1]) {
    int temp=arr[i];
    arr[i]=arr[i+1];
    arr[i+1]=temp;
    if (i) i-=2;
  }

很好。(这不完全是冒泡排序。我没有使用嵌套循环,而是在交换成员后返回数组)

于 2012-05-30T00:42:03.290 回答
1

小心在循环内更改计数器变量,并非所有循环都相同,“while”循环的行为不同。看到这个例子了吗?

不,它不是无限循环(在某些编译器上)。运行它,看看...

i=5;
while (i--)
{
    i=100;
    printf("%d \n",i)
}
于 2013-09-20T17:34:23.067 回答
0

我们可以更改循环内的计数器值,但最终的计数器值不会被反映,因为 for 循环不会覆盖计数器值。这是 QTP VB 脚本中的示例。

iLast = 4
For i= 1 to iLast
iLast=2    
Next

这里 for 循环应该只执行 2 次,因为 iLast 值在循环内更新为 2,但它执行了 4 次。

于 2013-06-19T14:35:11.593 回答