switch / case

Description

Tout comme l'instruction if, l'instruction switch / case ("communtateur de cas" en anglais) contrôle le déroulement des programmes. L'instruction switch / case permet au programmeur de construire une liste de "cas" (ou possibilités) à l'intérieur d'accolades. Le programme teste chaque cas avec la variable de test, et exécute le code si une correspondance (un test VRAI) est trouvé.

switch / case est légèrement plus flexible qu'une structure if / else en ce sens que le programmeur peut définir si la structure switch devra continuer à tester les cas sous la forme d'une liste, même après avoir trouvé une correspondance. Si l'instruction break n'est pas trouvée après avoir exécuté le code d'une condition vraie, le programme continuera à tester les conditions restantes parmi les cas restants. Si une instruction break est rencontrée, le cas fait sortir de la structure, de la même façon que pour une construction if / else if.

Syntaxe

switch (var) { case label1: // statements break; case label2: // statements break; default: // statements break; }

Paramètres

  • var: variable dont vous vouler tester l'état
  • default: si aucune autre condition vraie n'est rencontrée, le code default sera exécuté
  • break: Sans une instruction break, l'instruction switch continuera à exécuter les expressions suivantes ("en tombant dedans") jusqu'à un rencontrer un break ou jusqu'à la fin du switch. Si une est trouvée, le code sera exécuté, même si ce n'est pas votre intention. L'instruction break indique à l'instruction switch d'arrêter de rechercher des conditions vraies, et fait sortir de la structure de choix.

Exemple

void setup() { Serial.begin(9600); Serial.println("====== TEST START ======"); for (int i = 0; i < 5; i++) { switch (i) { case 0: Serial.print("Inside case 0: i = "); Serial.println(i); break; case 1: Serial.print("Inside case 1: i = "); Serial.println(i); break; case 2: Serial.print("Inside case 2: i = "); Serial.println(i); break; default: Serial.print("Inside default: i = "); Serial.println(i); break; } } Serial.println("====== TEST END ========"); } void loop() { }

The result on Serial Monitor:

COM6
Send
====== TEST START ====== Inside case 0: i = 0 Inside case 1: i = 1 Inside case 2: i = 2 Inside default: i = 3 Inside default: i = 4 ====== TEST END ========
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Remarque:

if we does not use the break in a case, the next case will also be executed. The execution is stopped when it reaches a break. Let's comment or remove a break in the above example and see the result.

void setup() { Serial.begin(9600); Serial.println("====== TEST START ======"); for (int i = 0; i < 5; i++) { switch (i) { case 0: Serial.print("Inside case 0: i = "); Serial.println(i); break; case 1: Serial.print("Inside case 1: i = "); Serial.println(i); // break; case 2: Serial.print("Inside case 2: i = "); Serial.println(i); break; default: Serial.print("Inside default: i = "); Serial.println(i); break; } } Serial.println("====== TEST END ========"); } void loop() { }

The result on Serial Monitor:

COM6
Send
====== TEST START ====== Inside case 0: i = 0 Inside case 1: i = 1 Inside case 2: i = 1 Inside case 2: i = 2 Inside default: i = 3 Inside default: i = 4 ====== TEST END ========
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

As you can see, when i = 1, the code run through case 1 and case 2.

Advanced Usage

If we miss a break in a case by accident, it results in the wrong operation of the code. Why the language does not force to use break instead of optional? Let's see two advanced usages to know the reason why.

Advanced Usage 1

Let's see the below example:

void setup() { Serial.begin(9600); for (int i = 0; i < 5; i++) { switch (i) { case 0: Serial.println("HELLO!"); break; case 1: Serial.println("ARDUINO"); break; case 2: Serial.println("ARDUINO"); break; case 3: Serial.println("ARDUINO"); break; default: Serial.println("ArduinoGetStarted.com"); break; } } } void loop() { }

The result on Serial Monitor:

COM6
Send
HELLO! ARDUINO ARDUINO ARDUINO ArduinoGetStarted.com
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

In the above code, you can see the case 1, 2 and 3 have the same code (do the same work). Let's remove all code in the case 1 and case 2:

void setup() { Serial.begin(9600); for (int i = 0; i < 5; i++) { switch (i) { case 0: Serial.println("HELLO!"); break; case 1: case 2: case 3: Serial.println("ARDUINO"); break; default: Serial.println("ArduinoGetStarted.com"); break; } } } void loop() { }

The result on Serial Monitor:

COM6
Send
HELLO! ARDUINO ARDUINO ARDUINO ArduinoGetStarted.com
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

As you can see, the results of both example codes are the same. But the second example code are shorter. Furthermore, if you get familiar to the second example code, you will realize that the second code is more readable. That is the benefit of not using the break;

Advanced Usage 2

Let's see the below example:

void setup() { Serial.begin(9600); for (int i = 0; i < 4; i++) { switch (i) { case 0: Serial.println("Hello!"); break; case 1: Serial.print("Let's learn "); Serial.println("Arduino"); break; case 2: Serial.println("Arduino"); break; default: Serial.println("via ArduinoGetStarted.com"); break; } } } void loop() { }

The result on Serial Monitor:

COM6
Send
Hello! Let's learn Arduino Arduino via ArduinoGetStarted.com
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

In the above code, you can see the case 1 and 2 have the same a line of code (Serial.println("Arduino")). Let's compare with the below code:

void setup() { Serial.begin(9600); for (int i = 0; i < 4; i++) { switch (i) { case 0: Serial.println("Hello!"); break; case 1: Serial.print("Let's learn "); case 2: Serial.println("Arduino"); break; default: Serial.println("via ArduinoGetStarted.com"); break; } } } void loop() { }

The result on Serial Monitor:

COM6
Send
Hello! Let's learn Arduino Arduino via ArduinoGetStarted.com
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

As you can see, the results of both example codes are the same. However, the second example code are shorter. That is another benefit of not using the break;

※ Remarque:

Pour éviter les comportements inattendus, il est important de mettre une instruction break à la fin du code de chaque cas. Il n'y a que dans le cas de conditions imbriquées entre-elles qu'on pourra ne pas mettre le break.

On peut utiliser des caractères après les instructions case.

Les conditions de cas ne doivent pas nécessairement être listée de façon chronologique ou progressive.

ARDUINO BUY RECOMMENDATION

Arduino UNO R3
Arduino Starter Kit
Disclosure: Some links in this section are Amazon affiliate links. If you make a purchase through these links, we may earn a commission at no extra cost to you.
Additionally, some links direct to products from our own brand, DIYables.

※ OUR MESSAGES