goto关键词
1.前言
goto,一个蒟蒻一用就废,大佬一用就吊炸天的神奇关键字。
今天,我要来盘它!!!
2、goto只能在函数内实现跳转,不能跨函数跳转
因为标号label是局部有效的。
#include <iostream>
#include <vector>
using namespace std;
void fun(){
loop:
for (int i = 0; i < 2; ++i) {
cout<<"loop"<<endl;
}
goto loop;
};
int main() {
fun();
return 0;
}
这样会一直打印loop,正常。
#include <iostream>
#include <vector>
using namespace std;
void fun(){
loop:
for (int i = 0; i < 2; ++i) {
cout<<"loop"<<endl;
}
goto loop;
};
int main() {
goto loop;
return 0;
}
会报错,说loop标号未定义,说明识别不到别的函数内的标号,也就没法跳转。
那把标号标到别的函数前面会怎样?
#include <iostream>
#include <vector>
using namespace std;
label:void fun(){
loop:
for (int i = 0; i < 2; ++i) {
cout<<"loop"<<endl;
}
goto loop;
};
int main() {
goto label;
return 0;
}
结果也是一样,识别不出来label这个标号。说明goto能识别的标号也必须在它所在的函数内。
3、基本功能跳转
#include <iostream>
using namespace std;
int main()
{
int x;
cin>>x;
if(x<2)
{
goto ld;
}
ls:
cout<<x<<endl;
ld:
cout<<x<<endl;
return 0;
}
输入1,输出1
输入2,if语句不执行,顺序执行代码,输出1,1
4、跳出本次循环,功能类似continue
先尝试,直接像continue那样使用。
#include <iostream>
#include <vector>
using namespace std;
int main() {
label:
for (int i =0; i < 3; ++i) {
if(i == 1)
goto label;
cout<<i<<endl;
}
return 0;
}
最后一直循环打印0;
解释:i一开始是0,然后++i,i为1;这时候goto label,跳转去的for循环,i重新被初始化为0,就这样重复这个循环。。。
考虑到上面是因为被重新初始化,达不到效果,将初始化放外面。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int i =0;
label:
for (; i < 3; ++i) {
if(i == 1)
goto label;
cout<<i<<endl;
}
return 0;
}
这时候只打印一个0出来
解释i一开始为0,打印出来,++i后i为1,if条件成立,goto label,这时候++i没有执行,i仍然为1,这样就会一直循环下去,所以这个也是死循环,只不过不打印。。。
由于上面是因为++i不执行造成的死循环,我们将++i放在里面.
#include <iostream>
#include <vector>
using namespace std;
int main() {
int i =0;
label:
for (; i < 3; ) {
if(i == 1)
{
++i;
goto label;
}
else
{
cout<<i<<endl;
++i;
}
}
return 0;
}
打印出0,2,程序也正常退出,达到预期效果。
但是这个for循环被大改,失去了for循环使用的简单性。有点像do。。while了有没有?所以。。。
使用do…while,while版本达到continue效果。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int i =0;
loop:
do{
if(i==1)
{
++i;
goto loop;
}
cout<<i<<endl;
++i;
}while(i<3);
return 0;
}
输出0,2,达到预期效果。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int i =0;
loop:
while(i<3){
if(i == 1)
{
++i;
goto loop;
}
cout<<i<<endl;
++i;
}
return 0;
}
输出0,2。达到预期效果。
5、goto往后跳,跳转到循环外的下一条语句,效果同break,用于多重循环跳出。
#include <iostream>
#include <vector>
using namespace std;
int main() {
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 4; ++j)
for (int k = 0; k < 5; ++k)
if(k == 1)
goto label;
label:
cout<<"break for"<<endl;
return 0;
}
打印出break for,程序也正常结束。
6、goto往前跳,可以形成循环
#include <iostream>
#include <vector>
using namespace std;
int main() {
label:
cout<<"front"<<endl;
goto label;
return 0;
}
循环打印front,而且还是死循环。
解释:goto跳到哪条语句就从哪条语句继续往下执行,直到程序块结束。
7、goto跳转到goto语句
#include <iostream>
#include <vector>
using namespace std;
int main() {
goto label2;
label1:
cout<<"label1"<<endl;
label2:
{
cout<<"label2"<<endl;
goto label1;
}
return 0;
}
goto的标号中又有goto语句,也是可以的。
个人感受
好东西是好东西,不会用就自掘坟墓。。。。