C Language
Selectie verklaringen
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 eendefault
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 andereenum
zijn of dat het een bescherming is voor "voor het geval dat". En als er andereenum
zijn, heeft de codeerder opzettelijk hetdefault
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;
}