起因
在体会 break 和 continue 的跳转的时候,突发奇想,能不能利用 goto 语句实现 break 和 continue 的功能,而不使用 break 语句和 continue 语句
思考
首先梳理一下for, break, continue的语法,然后再考虑使用goto语句转换
- for 循环的语法:
for (init-statement; condition; expression)
statement
nextline
break 语句直接跳出了循环体,不再执行 expression,也就是跳转到 nextline 处。
continue 语句跳转至 expression 处,不再执行当前循环的剩余内容。
- for 循环用 goto 语句实现可能是这样的:
INITIALIZATION:
init-statement
CONDITION:
if (condition)
goto LOOP_BODY;
else
goto NEXT_LINE;
LOOP_BODY:
statement
END_OF_ITERATION:
expression
goto CONDITION;
NEXT_LINE:
XXXXXXXX
- break 和 continue 的实现
// break
goto NEXT_LINE;
// continue
goto END_OF_ITERATION;
实现
开始动手做实验,get your hands dirty!
- 首先用 for, break, continue 写一段简单的测试程序,以便和 goto 版本的实现进行对照
int i;
for (i = 0; i < 10; ++i)
{
if (i == 3)
continue;
cout << i << " ";
if (i == 7)
break;
}
cout << endl;
cout << "NEW LINE" << endl;
- 然后是 goto 版本的实现
int i;
INITIALIZATION:
i = 0;
CONDITION:
if (i < 10)
goto LOOP_BODY;
else
goto NEXT_LINE;
LOOP_BODY:
if (i == 3)
// continue;
goto END_OF_ITERATION;
cout << i << " ";
if (i == 7)
// break;
goto NEXT_LINE;
END_OF_ITERATION:
++i;
goto CONDITION;
NEXT_LINE:
cout << endl;
cout << "NEW LINE" << endl;
结果
两个版本代码的运行结果是一样的
完整代码如下:
#include <iostream>
using namespace std;
int main()
{
// goto version
int i;
INITIALIZATION:
i = 0;
CONDITION:
if (i < 10)
goto LOOP_BODY;
else
goto NEXT_LINE;
LOOP_BODY:
if (i == 3)
// continue;
goto END_OF_ITERATION;
cout << i << " ";
if (i == 7)
// break;
goto NEXT_LINE;
END_OF_ITERATION:
++i;
goto CONDITION;
NEXT_LINE:
cout << endl;
cout << "NEW LINE" << endl;
// normal version
for (i = 0; i < 10; ++i)
{
if (i == 3)
continue;
cout << i << " ";
if (i == 7)
break;
}
cout << endl;
cout << "NEW LINE" << endl;
return 0;
}
这样子似乎更理解了for, break 和 continue,对程序的执行流程也更清晰了。
另外,此次实验主要针对的是 for 循环中的 break 语句;while 循环和switch 中则是另一个故事了。