以下代码不应该像“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 ++应该吞下这样的结构还是拒绝它?
答案 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
不是表达式。