使用“for”建模“if”

时间:2014-01-28 17:52:21

标签: c++ language-lawyer

以下代码不应该像“if(condition)”语句一样工作,直到明显的错误行为,当它在另一个循环中并且“body”有自己的break或continue语句时:

for( ; condition ; break ) {
    body;
}

这是由关于C ++语法的咖啡休息聊天引发的,该假设是

for( init ; condition ; update ) {
    body;
}

相同
{
    init;
    while( condition ) {
         body;
         update;
   }
}

使用g ++进行的快速实验表明,使用“for(; condition; break)”建模“if(condition)”不会编译。所以问题是:根据最新标准,g ++应该吞下这样的结构还是拒绝它?

5 个答案:

答案 0 :(得分:4)

拒绝它是正确的 - for循环的形式(见ISO C ++§6.5.3):

  

for(for-init-statement condition opt ; expression opt )语句

break是一个陈述,而不是表达。

如上所述,解决方法是

for( ; condition ; ) {
    body;
    break;
}

这是另一种不使用break的方式:

bool b = false;
for (; condition && !b++; ) { // this usage of operator++ on bool is deprecated
   body
}

答案 1 :(得分:3)

这不是有效的C ++,6.6.1 部分中的草案C ++标准 强调我的

  

break语句应仅在iteration-statement或switch语句中出现,并导致终止最小的封闭iteration-statement或switch语句;控制权传递给终止语句后的语句,如果有的话。

我们可以从

6.5
语句 for 循环的主体。

修改

由于dasblinkenlight纠正了我,这对于一般情况来说还不够强大。我们需要注意 break 是一个语句而不是表达式,因此不能在 for 循环的标题中。

答案 2 :(得分:1)

拒绝它是正确的。 break不能位于构成循环体本身的代码块之外。该代码无效C ++。

答案 3 :(得分:1)

break应该在for循环的主体中:

for( ; condition ; ) {
    body;
    break;
}

答案 4 :(得分:1)

for语句的语法是:

for ( for-init-statement condition[opt] ; expression[opt] ) statement

因此update子句必须是表达式,而break不是表达式。