2016-07-08 6 views
2

ich den folgenden Code haben:wenn in while-Schleife in 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; 
} 

Was ich tun möchte, ist dies: wenn der Code in der if-Struktur ausgeführt wird (dh, die wenn Bedingung ausgewertet zu true), ich möchte es nicht mehr in allen folgenden While-Schleifen ausführen, wie könnte ich das tun?

+1

bitte präzisieren/klar was du willst –

+4

Wirf nicht auf "const char *", es ist nutzlos und bedeutungslos. Verwerfen Sie auch keine Literale in 'unsigned int', verwenden Sie ** 16777221U **, wenn Sie ein' unsigned int'-Literal wollen. –

+0

@GiorgiMoniava Unter allen while-Schleifen, wenn zu einem Zeitpunkt in einer bestimmten Schleife die if-Bedingung zu true ausgewertet wird, dann möchte ich in allen folgenden Schleifen ignorieren, wenn Struktur, das ist, was ich will –

Antwort

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

dies wird sicherlich weniger Zeit als mein Code brauchen. –

1

ich dies auf zwei Arten tun denken kann:

  1. kürzeren Kern, weniger effizient -> einen Flag verwenden:

    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. mehr Code, aber ein wenig mehr effizient -> teilen Sie den Code:

    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(); 
    } 
    

Der zweite Weg ist effizienter, weil der gemeinsame Code eine bessere Cash-Lokalität hat und Sie die if-Anweisung nicht für jede Iteration ausführen müssen, wenn die Bedingung offensichtlich nicht erfüllt ist. Abhängig davon, wie oft der Code ausgeführt wird, kann es sich lohnen ...

+0

Wenn 'foo()' nicht inline wird, kann der zweite Code weniger effizient sein –

+0

Jede Methode hat ihre Vorteile, aber ich würde die erste bevorzugen. –

+0

'flag' kann vollständig aus dem zweiten Snippet entfernt werden. – alk