惭愧一直对这部分不是特别的明确,总是跟着感觉写,并且我的程序中也很少出现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是想去哪里就去哪里.