C++中for循环内的额外增量

3
以下代码是否安全并且符合标准?如果“condition”为真,“i”将会增加2吗?
for (size_t i = 0; i < 100; i++) {
    do_something;
    if (condition)
        i++;
}

6
是的,没错。而且这种写法很常见。for 循环在大多数情况下只是 while 循环的一种语法糖。 - Basile Starynkevitch
1
是的,毫无疑问...这是程序的一般流程,没有特殊情况。 - nobalG
在我看来,仅仅因为某个东西在标准中被允许并且能够工作,并不意味着它是安全的(或者长期易于维护)。 - Max
3个回答

4
当然可以。语法上没有任何问题。你甚至可以像这样做:
int i = 0;
for (;;) {
    if (i >= 100) {

      break;
    }
    ++i;
}

这段代码等同于:
int i = 0;
while(true) {
    if (i >= 100) {
        break;
    }
    ++i;
}

此外,你可以将几乎任何有效的代码放入for语句中。例如:
for (do_something_begin(); some_condition(); do_something_end()) {
     CODE;
}

而编译器对这段代码的处理方式大致如下:
do_something_begin()
while (some_condition()) {
    CODE;
    do_something_end();
} 

是的 - 我知道实际上它并不完全与编译器所做的相同(do_something_begin()的变量作用域是错误的),但出于教育目的,我认为保持这种方式更好。 - Jendas
值得指出的是,在其他一些编程语言中,在循环内修改循环计数器是非法的,并且在循环外部,无论变量作用域如何,循环计数器的值都是未定义的。但C/C++不是这样的。不要因为在其他语言中是非法的而放弃在C/C++中这样做。 - Ian Goldby

0
如果我从0开始,并且条件为真,则i=1,然后当循环再次迭代时,i将增加1到2,所以是的。

0

你刚刚写了

size_t i = 0;

while (i < 100) {
    do_something;
    if (condition)
        i++;
    i++;
}

这是完全合法的。如果我是你,我会添加一条注释说“跳过下一个”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接