2016-07-08 38 views
2

我有以下代碼:如果while循環使用C

while(tmp->next != NULL) 
{ 
    if(tmp->code == (unsigned int)16777221) 
    { 
     CU_ASSERT_STRING_EQUAL("3GPP Zh", tmp->name); 
    } 
    if(strcmp((const char*)tmp->name, (const char*)"IUT-T Rs") == 0) 
    { 
     CU_ASSERT_EQUAL((unsigned int)16777235, tmp->code); 
    } 
    tmp = tmp->next; 
} 

我想這樣做是:一次在if結構的代碼被執行(即,在如果條件評估爲真),我不想在所有以下的while循環中執行它,我怎麼能這樣做呢?

+1

請更具體的你想要什麼 –

+4

不要投給'爲const char *'/ clear-,這是無用的,毫無意義的。也不要將文字轉換爲'unsigned int',如果你想要一個'unsigned int'文字,可以使用** 16777221U **。 –

+0

@GiorgiMoniava在所有的while循環中,如果在某個特定的循環中if條件被評估爲true,那麼在所有的循環中,我想忽略這個如果結構,這就是我想要的 –

回答

4
int once = 0; 

while(tmp->next != NULL) 
{ 
    if(!once && tmp->code == (unsigned int)16777221) 
    { 
     once = 1; 
     CU_ASSERT_STRING_EQUAL("3GPP Zh", tmp->name); 
    } 
    /* deal with subsequent if's in the same manner */ 
    tmp = tmp->next; 
} 
+0

this肯定會比我的代碼使用更少的時間。 –

1

我能想到的這樣做的方法有兩種:

  1. 較短的核心,效率較低 - >使用標誌:

    int flag = 0; 
    while(tmp->next != NULL) 
    { 
        if(flag && tmp->code == (unsigned int)16777221) 
        { 
         flag = 0; 
         CU_ASSERT_STRING_EQUAL("3GPP Zh", tmp->name); 
        } 
        // some other code 
        tmp = tmp->next; 
    } 
    
  2. 較長的代碼,但多一點高效 - >拆分代碼:

    void foo() 
    { 
        //code that needs to be executed 
    } 
    
    while(tmp->next != NULL) 
    { 
        if(tmp->code == (unsigned int)16777221) 
        { 
         CU_ASSERT_STRING_EQUAL("3GPP Zh", tmp->name); 
         break; 
        } 
        foo(); 
    } 
    while(tmp->next != NULL) 
    { 
        foo(); 
    } 
    

第二種方法更高效,因爲通用代碼具有更好的現金局部性,並且您不必爲每次迭代都執行if語句,但顯然情況並非如此。根據的代碼是如何執行的次數,它可能是值得的......

+0

如果'foo()'沒有被內聯,第二個代碼可能效率更低 –

+0

每種方法都有其優點,但我更喜歡第一種方法。 –

+0

'flag'完全可以從第二個片段中刪除。 – alk