循环和continue,break的那点事

来源:互联网 发布:java 常量类初始化map 编辑:程序博客网 时间:2024/06/03 15:41

惭愧一直对这部分不是特别的明确,总是跟着感觉写,并且我的程序中也很少出现continue和break,不过这次写网络程序会用到不少这些语句,所以为了程序的健壮性,只能深入的理解这部分的内容了,总是以为简单就一闪过去的态度还是要不得啊....

网上几个continue和break的例子让人看了比较蛋疼,根本不是说这几个语句的,中间还加有别的逻辑,搞的人很晕,自己写程序测试下就知道了:

1.continue

continue的作用是:循环体剩余的语句不再执行,直接跳转到判断循环的地方.

在VC 6.0下输入如下的语句,从打印可以判断这点

#include #include #include int main(int argc, char *argv[]){int i = 1;//recv:while (1){Sleep(1000);printf("11111/n");while (1){printf("22222/n");Sleep(2000);if (i > 0){printf("33333/n");if (i == 1){continue;//goto recv;//break;}}}printf("44444/n");}return 0;}

输出是什么呢?

11111
22222
33333
22222
33333
......
也就是说会在第二个while(1)里面一直循环.那么continue就完成了自己的作用,continue后面的语句不再执行(这里没有出现44444的打印),而跳转到while(1)的地方.
有人会不会有疑问说是不是跳转到if(i > 0)这里?之前continue的作用说的很明确了,是跳转到判断循环的地方.
那么什么是循环?C的循环只有3种:for,while,do-while.除此之外再无他了.(其实我写例子就是判断这点,比较汗,看书不仔细).
2.goto
还是前面的例子,如果我想从原来continue的地方从第一个while(1)开始运行的话,有什么办法呢?
答案就是goto,这就是goto灵活的地方.对goto使用原则就不再多说了,不可多用不可不用.
这个时候的打印就是
11111
22222
33333
11111
22222
33333
......
在socket编程的注册函数中,可以经常看到这样的写法(我用伪代码写下):
int Register_Func()
{
Create:
if(创建socket失败){goto Create;}
Connect:
if(连接服务器失败){goto Connect;}
Select:
if(服务器读状态失败){goto Select;}
Send:
if(向服务器读发送数据失败){goto Send;}
.......//之后可以recv
}也就说说goto可以使语句跳转到标签处,而不受其它的限制.
3.break
break的作用是:终止本次循环,直接运行循环之后的代码.
还是上面的例子,如果改为break的话,那么打印就是:
11111
22222
33333
44444
11111
22222
33333
44444
......
也就是说break跳出了第二个while(1),运行了第二个while(1)后面的打印44444的语句后,才回到第一个while(1)(如果这里不是while(1)的话就继续向下运行了).
4.总结
现在就非常明确了,continue是对循环判断条件的立即跳转,break是终结此次循环运行后面的语句,goto是想去哪里就去哪里.
 
原创粉丝点击