2013-01-01 127 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循環來做到這一點。