Historie van de vraag:
De switch-operator werd geïntroduceerd in de C-taal voor het gemak van het verdelen van de controle over verschillende takken, afhankelijk van de waarde van een expressie. Het is een alternatief voor een lange keten van if-else en wordt algemeen gebruikt voor het verwerken van commando's, toestanden en enumeratiewaarden.
Probleem:
De belangrijkste gevaren van de switch-operator zijn gerelateerd aan vergeten break-instructies, onverwacht binnenvallen in "doorvallen" (fallthrough), moeilijkheden met variabelen die binnen een blok zijn gedeclareerd, evenals het feit dat het type van de expressie een geheel getal moet zijn.
Oplossing:
Voor veilig gebruik:
break gebruiken (of expliciet de noodzaak van fallthrough markeren met opmerkingen);int of compatibel met int;case zijn voorzien, behandelen in de default-tak;case-constructies of in {}-blokken declareren.Voorbeeldcode:
#include <stdio.h> void print_day(int day) { switch (day) { case 1: printf("Maandag "); break; case 2: printf("Dinsdag "); break; case 3: printf("Woensdag "); break; case 4: printf("Donderdag "); break; case 5: printf("Vrijdag "); break; case 6: case 7: printf("Weekend "); break; default: printf("Onbekende dag "); } }
Belangrijke kenmerken:
break.Mag je het type float gebruiken in een switch-expressie?
Nee. De standaard van de C-taal vereist dat de expressie in switch een geheel getal of geconverteerd naar een geheel getal is (char, short, int, long, enum, enz.).
Wat gebeurt er als je de case's verwisselt — beïnvloedt de volgorde de logica?
De volgorde van de case-declaraties in switch heeft geen invloed op het vinden van de vereiste waarde. De code wordt uitgevoerd vanaf de overeenkomende case tot de eerste break. Maar de volgorde beïnvloedt het geval dat er geen break is (fallthrough).
Kun je variabelen binnen een case zonder accolades declareren?
Nee. Als je een variabele na een case zonder een extra {}-blok declareert, leidt dit tot een compilatiefout. Correct:
switch (x) { case 1: { int y = 0; break; } }
break vergeten aan het einde van een case-blok, wat onnodige side-effecten veroorzaakt.default gebruiken, wat het onderhoud bemoeilijkt.In een groot project vergat een programmeur break na een van de cases en kreeg foutieve uitvoering van meerdere takken achter elkaar. De bug werd pas opgemerkt door de gebruiker.
Voordelen:
Nadelen:
In geval van noodzakelijke doorvallen werden geregelde fallthroughs met uitleg toegepast, alle kritieke cases werden vergezeld van break of return, in default werd een waarschuwing uitgegeven.
Voordelen:
Nadelen: