switch...case

Descrição

Da mesma forma que o comando if, o comando switch case controla o fluxo do programa permitindo ao programador especificar código diferente para ser executado em várias condições. Em particular, um comando switch compara o valor de uma variável aos valores especificados nos comandos case. Quando um comando case é encontrado cujo valor é igual ao da variável, o código para esse comando case é executado.

A palavra-chave break interrompe o comando switch, e é tipicamente usada no final de cada case. Sem um comando break, o comando switch irá continuar a executar as expressões seguintes (desnecessariamente) até encontrar um break, ou até o final do comando switch ser alcançado.

Sintaxe

switch (var) { case valor1: // comando(s) break; case valor2: // comando(s) break; default: // comando(s) break; }

Parâmetros

  • var: uma variável para ser comparada com os vários cases. Tipos de dados permitidos: int, char
  • valor1, valor2: constantes. Tipos de dados permitidos: int, char

Retorna

Nada

Código de Exemplo

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  

※ Notas e Advertências:

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;

Ver Também

ARDUINO BUY RECOMMENDATION

Arduino UNO R3
Arduino Starter Kit
Please note: These are affiliate links. If you buy the components through these links, We may get a commission at no extra cost to you. We appreciate it.

※ OUR MESSAGES

  • We are AVAILABLE for HIRE. See how to hire us to build your project
  • Any suggestion, correction, and translation? please email us at ArduinoGetStarted@gmail.com, We appreciate it
  • We mainly keep improving the references in English. See English version of this page for the latest update.