Zoeken…


if () verklaringen

Een van de eenvoudigste manieren om de programmastroom te regelen is door if selectieverklaringen te gebruiken. Met deze verklaring kan worden besloten of een codeblok moet worden uitgevoerd of niet.

De syntaxis voor if selection statement in C kan als volgt zijn:

if(cond) 
{
  statement(s);  /*to be executed, on condition being true*/
}

Bijvoorbeeld,

if (a > 1) {
    puts("a is larger than 1");
}

Waar a > 1 een voorwaarde is die moet worden geëvalueerd om true te zijn om de instructies in het if blok uit te voeren. In dit voorbeeld wordt "a groter dan 1" alleen afgedrukt als a > 1 waar is.

if selectieverklaringen de omhullende accolades { en } kunnen weglaten als er slechts één instructie in het blok staat. Het bovenstaande voorbeeld kan worden herschreven naar

if (a > 1)
    puts("a is larger than 1");

Voor het uitvoeren van meerdere instructies binnen het blok moeten de accolades worden gebruikt.

De voorwaarde voor if kan meerdere expressies bevatten. if voert de actie alleen uit als het eindresultaat van expressie waar is.

Bijvoorbeeld

if ((a > 1) && (b > 1)) {
    puts("a is larger than 1");
    a++;
}

voert alleen de printf en a++ als zowel a als b groter zijn dan 1 .

if () ... anders statements en syntaxis

Hoewel if alleen een actie uitvoert wanneer de voorwaarde wordt geëvalueerd als true , kunt u met if / else de verschillende acties opgeven wanneer de voorwaarde true en wanneer de voorwaarde false .

Voorbeeld:

if (a > 1)
    puts("a is larger than 1");
else 
    puts("a is not larger than 1");

Net als de if instructie, wanneer het blok in if of else uit slechts één instructie bestaat, kunnen de accolades worden weggelaten (maar dit wordt niet aanbevolen omdat het gemakkelijk onvrijwillig problemen kan veroorzaken). Als er echter meer dan één bewering in het if of else blok staat, moeten de accolades op dat specifieke blok worden gebruikt.

if (a > 1) 
{
    puts("a is larger than 1");
    a--;
}
else 
{
    puts("a is not larger than 1");
    a++;
}

schakelaar () verklaringen

switch zijn handig als u wilt dat uw programma veel verschillende dingen doet op basis van de waarde van een bepaalde testvariabele.

Een voorbeeld van het gebruik van switch instructie switch is als volgt:

int a = 1;

switch (a) {
case 1:
    puts("a is 1");
    break;
case 2:
    puts("a is 2");
    break;
default:
    puts("a is neither 1 nor 2");
    break;
}

Dit voorbeeld is gelijk aan

int a = 1;

if (a == 1) {
    puts("a is 1");
} else if (a == 2) {
    puts("a is 2");
} else {
    puts("a is neither 1 nor 2");
}

Als de waarde van a 1 is wanneer de switch wordt gebruikt, wordt a is 1 afgedrukt. Als de waarde van a 2 is, wordt a is 2 afgedrukt. Anders wordt a is neither 1 nor 2 afgedrukt.

case n: wordt gebruikt om te beschrijven waar de uitvoeringsstroom naar binnen springt wanneer de waarde die aan switch instructie switch wordt doorgegeven n is . n moet een compilatie-tijdconstante zijn en dezelfde n kan maximaal één keer in één switch .

default: wordt gebruikt om te beschrijven dat wanneer de waarde niet overeenkwam met een van de keuzes voor case n: Het is een goede gewoonte om in elke schakelopdracht een default op te nemen om onverwacht gedrag op te vangen.

Een break; statement is vereist om uit het switch te springen .

Opmerking: Als u per ongeluk vergeten om een toe te voegen break na het einde van een case , zal de compiler ervan uit dat u van plan om "val door" en alle volgende case-statements, indien van toepassing, zal worden uitgevoerd (tenzij er een break statement is te vinden in een van de volgende gevallen), ongeacht of de volgende case-statement (s) overeenkomen of niet. Deze specifieke eigenschap wordt gebruikt om Duff's Device te implementeren. Dit gedrag wordt vaak beschouwd als een fout in de C-taalspecificatie.

Hieronder is een voorbeeld dat de effecten toont van de afwezigheid van break; :

int a = 1;

switch (a) {
case 1:
case 2:
    puts("a is 1 or 2");
case 3:
    puts("a is 1, 2 or 3");
    break;
default:
    puts("a is neither 1, 2 nor 3");
    break;
}

Wanneer de waarde van a 1 of 2 is, is a is 1 or 2 en wordt a is 1, 2 or 3 afgedrukt. Wanneer a 3 is, wordt alleen a is 1, 2 or 3 afgedrukt. Anders wordt a is neither 1, 2 nor 3 afgedrukt.

Merk op dat het default niet nodig is, vooral wanneer de reeks waarden die u in de switch is voltooid en bekend is tijdens het compileren.

Het beste voorbeeld is het gebruik van een switch op een enum .

enum msg_type { ACK, PING, ERROR };
void f(enum msg_type t)
{
  switch (t) {
  case ACK:
    // do nothing
    break;
  case PING:
    // do something
    break;
  case ERROR:
    // do something else
    break;
  }
}

Dit heeft meerdere voordelen:

  • de meeste compilers zullen een waarschuwing rapporteren als u geen waarde verwerkt (dit zou niet worden gemeld als er een default aanwezig was)
  • om dezelfde reden, als u een nieuwe waarde toe te voegen aan de enum , wordt u in kennis gesteld van alle plaatsen waar je vergeten bent om de nieuwe waarde te behandelen (met een default geval zou je nodig hebt om uw code op zoek naar dergelijke gevallen handmatig te verkennen)
  • De lezer hoeft niet te achterhalen "wat standaard wordt verborgen default: ", of er andere enum zijn of dat het een bescherming is voor "voor het geval dat". En als er andere enum zijn, heeft de codeerder opzettelijk het default daarvoor gebruikt of is er een bug geïntroduceerd toen hij de waarde toevoegde?
  • het hanteren van elke enum maakt de code zelfverklarend omdat je je niet kunt verbergen achter een jokerteken, je moet ze expliciet behandelen.

Desondanks kun je niet voorkomen dat iemand slechte code schrijft zoals:

enum msg_type t = (enum msg_type)666; // I'm evil

U kunt dus vóór uw schakelaar een extra controle uitvoeren om het te detecteren, als u het echt nodig hebt.

void f(enum msg_type t)
{
   if (!is_msg_type_valid(t)) {
      // Handle this unlikely error
   }

   switch(t) { 
    // Same code than before
   }
}

if () ... anders Ladder Chaining twee of meer if () ... anders verklaringen

Hoewel de instructie if ()... else slechts één (standaard) gedrag kan definiëren dat zich voordoet wanneer niet wordt voldaan aan de voorwaarde binnen if () , laten het koppelen van twee of meer if () ... else instructies toe om een paar te definiëren meer gedrag voordat ik naar de laatste else tak werkt als een "default", indien van toepassing.

Voorbeeld:

int a = ... /* initialise to some value. */

if (a >= 1) 
{
    printf("a is greater than or equals 1.\n");
} 
else if (a == 0) //we already know that a is smaller than 1
{
    printf("a equals 0.\n");
}
else /* a is smaller than 1 and not equals 0, hence: */
{ 
    printf("a is negative.\n");
}

Genest als () ... anders VS als () .. anders Ladder

Geneste if()...else instructies nemen meer uitvoeringstijd in beslag (ze zijn langzamer) in vergelijking met een if()...else ladder omdat de geneste if()...else instructies alle innerlijke voorwaardelijke statements controleren zodra de buitenste voorwaardelijke if() -instructie is voldaan, terwijl de if()..else ladder de conditietest stopt zodra een van de if() of de else if() voorwaardelijke statements waar zijn.

Een if()...else ladder:

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a, b, c;
  printf("\nEnter Three numbers = ");
  scanf("%d%d%d", &a, &b, &c);
  if ((a < b) && (a < c))
  {
    printf("\na = %d is the smallest.", a);
  }
  else if ((b < a) && (b < c))
  {
    printf("\nb = %d is the smallest.", b);
  }
  else if ((c < a) && (c < b))
  {
    printf("\nc = %d is the smallest.", c);
  }
  else
  {
    printf("\nImprove your coding logic");
  }
  return 0;
}

Wordt in het algemeen als beter beschouwd dan het geneste equivalent if()...else :

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a, b, c;
  printf("\nEnter Three numbers = ");
  scanf("%d%d%d", &a, &b, &c);
  if (a < b)
  {
    if (a < c)
      {
        printf("\na = %d is the smallest.", a);
      }
    else
      {
        printf("\nc = %d is the smallest.", c);
      }
  }
  else
  {
    if(b < c)
    {
      printf("\nb = %d is the smallest.", b);
    }
    else
    {
      printf("\nc = %d is the smallest.", c);
    }
  }
  return 0;  
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow