阅读有关C的书籍,我们经常看到书中提到在c语言中尽量避免使用goto语句,最好不要使用goto语句,但是我认为存在即合理,适当使用也未尝不是一件好事。
我们先来对goto语句做一个简单的了解
goto语句有俩部分:goto语句 + 标签名
goto语句作用:
1.跳出多重循环(break,continue只能跳出本次循环;
2.使用goto语句可以进行错误处理;
接下来依次用代码来演示
1.跳出多重循环
//跳出多重循环
#include<stdio.h>
int main()
{
int i,j,k,z;
for(i=0;i<100;i++)
{
for(j=0;j<10;j++)
{
for(k=0;k<10;k++)
{
for(z=0;z<10;z++)
{
//不满足条件时
goto part;
}
}
}
}
return 0;
part:
printf("this is a goto\n");
}
当然这里如果不使用goto语句,也可以使用return 0;或者exit(0)来结束函数也是可以的。
2.进行错误处理
//使用goto语句进行错误处理
int main()
{
//2.bind the local computer address and port
int ret = bind(server_sockfd,(struct sockaddr*)&myaddr,sizeof(myaddr));
if(ret < 0){
perror("bind exist error");
goto err;
}
//3.set listen socket
ret = listen(server_sockfd,8);
if(ret < 0){
perror("listen exist error");
goto err;
}
printf("start listening...\n");
//4.receive client connent and produce new socket
struct sockaddr_in client_addr;
socklen_t cliaddr_len = sizeof(client_addr);
int connfd = accept(server_sockfd,(struct sockaddr*)&client_addr, &cliaddr_len);
if(connfd < 0){
perror("accept exist error");
goto err;
}
return 0;
//goto jump
err:
close(server_sockfd);
return -1;
}
这应该是goto语句最有用的部分(个人感觉),拿上面的代码举例(socket通信代码的一部分),我们在写代码的时候肯定希望我们的代码没有任何错误,可是真真好的代码不可能做到没有错误,而是对错误的处理做到完美的处理,使用goto语句可以对错误集中管理,节省代码量。比如同一类型的错误可以使用同一个标签,直接goto到相应的标签即可。