几本书向我展示了如何正确编写 for、while 和 do 循环。许多在线文章将它们相互比较。
但我还没有找到任何地方告诉我不该做什么。例如,如果我在循环中更改计数器或条件变量的值,会不会搞砸?
我想要一个不依赖于机器的答案。
几本书向我展示了如何正确编写 for、while 和 do 循环。许多在线文章将它们相互比较。
但我还没有找到任何地方告诉我不该做什么。例如,如果我在循环中更改计数器或条件变量的值,会不会搞砸?
我想要一个不依赖于机器的答案。
是的,您可以在循环中更改计数器,它有时非常有用。例如,在解析命令行参数时,其中有一个选项标志后跟一个值。这方面的一个例子如下所示:
输入以下命令:
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;
}
示例程序自动增加计数器以访问正确的命令行字符串。当然有一些方法可以合并计数器等,但在这种情况下它们只会使代码更加麻烦。
正如其他人指出的那样,这是许多人编写错误的地方,并且在循环内递增计数器时必须小心,特别是当循环以计数器值为条件时。
在 C 中的循环内更改循环计数器并非无效。
但是,这可能会让未来的读者感到困惑,这是不这样做的一个很好的理由。
这取决于您所说的“搞砸”是什么意思。
如果您知道自己在做什么,则可以更改计数器。语言对此没有限制。
允许在循环中更改计数器变量,但要小心知道您在做什么,以免在不应该的情况下通过减小变量来创建无限循环。
一些算法实际上从中受益,但当然,如果你这样做,它会使你的代码可读性降低,所以请确保你也评论你正在做的事情。
是的,您可以更改计数器和条件变量。它们只会在循环的下一次迭代中进行评估。
一定可以。但要注意不要使循环混乱。在循环中更改一个 conter 在 do...while 和 while 中发生了很多。
do{
counter++;
some expressions;
}
while(counter < SOMEVALUE);
是的,在 C/C++/C# 中,您可以在循环中更改计数器等。
像许多其他技术一样,只要您知道自己在做什么,就可以了。
例如,这段代码:
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;
}
很好。(这不完全是冒泡排序。我没有使用嵌套循环,而是在交换成员后返回数组)
小心在循环内更改计数器变量,并非所有循环都相同,“while”循环的行为不同。看到这个例子了吗?
不,它不是无限循环(在某些编译器上)。运行它,看看...
i=5;
while (i--)
{
i=100;
printf("%d \n",i)
}
我们可以更改循环内的计数器值,但最终的计数器值不会被反映,因为 for 循环不会覆盖计数器值。这是 QTP VB 脚本中的示例。
iLast = 4
For i= 1 to iLast
iLast=2
Next
这里 for 循环应该只执行 2 次,因为 iLast 值在循环内更新为 2,但它执行了 4 次。