2013-01-01 123 views
0

我有以下代码:开关的情况下避免循环

int send_cmd(int sock, char * buffer, int lbuffer) 
{ 
    int err = 0; 

    //do_something part 1 

while(1) 
    switch(check_status(buffer)){ 
      case 1: 
       return 0; 
       break; 
      case 0: 
       if (err > 0) 
        break; 

       //do_something part 2 

       err = 1; 
      } 
     return -1; 
    } 

我不认为这是很好的编码,但我不知道如何去优化它。

我想运行“第2部分代码”只有一次,只有“第1部分代码”给出错误。

你能告诉我如何使它正确运行?原因现在不会在第2部分执行一次后返回任何内容。

+0

这个不清楚。你在问如何同时摆脱switch语句和while循环吗? –

+0

第2部分代码是否适用于开关柜中的两种情况? –

+0

第一种情况是OK回复,第一种情况是错误。如果有错误,我想执行命令2但只能执行一次。 – ShaMora

回答

2

我想运行“第2部分代码”只有一次,只有当“第1部分代码”给出错误。

不需要while循环或switch语句。

// Do something part 1 
if (check_status(buffer) == 1) { 
    return 0; 
} 

// Do something part 2 
if (check_status(buffer) == 1) {  
    return 0; 
} 
else { 
    return -1; 
} 
+0

谢谢!这比使用开关更好吗? – ShaMora

+0

@ShaMora在这种情况下相当好。 – WhozCraig

2

如果你不需要循环,你可以使用ifreturn。既然你不使用err,你也可以省略它。

// first command 
int status = check_status(buffer); 
if (status == 1) 
    return 0; 

// second command 
status = check_status(buffer); 
if (status == 1) 
    return 0; 

return -1; 

至少在这个简单的例子,switch是不是更好或大于if更快。有些情况下,这是真的,但我不会赌它。通常情况下,无论使用switch还是if,优化器都足以发出最佳机器代码。所以去寻找简单,可读和可维护的代码。

+0

谢谢,但我想使用开关,因为我读的速度比语句快,编译器处理得更好。除此之外,我需要那个while循环。我有最多3例。 1.第一个命令=确定; 2.第一个命令=错误,第二个命令=确定; 3.第一个命令错误,第二个命令错误因此退出。我不知道我是否解释得很好:P – ShaMora

+0

@ShaMora你总是有两个命令顺序吗? –

+0

@ShaMora请参阅最新的答案。 –

1

看着你,我认为这是你正在尝试使用err变量来实现的:

//Part 1 
if (check_status(buffer)) return 0; //No error 

//Part 2 
if (check_status(buffer)) return 1; //One error 
else return -1; //Two errors 

你不需要任何while循环来做到这一点。