在Arduino中流程控制语句是非常重要的,什么是流程控制语句呢?其实就是一系列的条件判断,它要求程序代码对给出的一个或多个条件进行判断,如果条件被判断为true,则执行该语句;如果条件被判断为false,则可选择执行其他语句。下图是大多数编程语言中常见的典型判断结构的形式。
控制语句是控制代码执行重要元素,它包含以下几类。
If 语句
if 控制单个语句的形式
if ( 表达式 ) 语句 ;
在 C 语言中, if 只能控制其后的一个语句。如果要控制多个语句就必须加大括号 { }。
if 控制多个语句的形式
if ( 表达式 ){ 语句块 ; }
它先判断括号中的条件或代码,如果为真,则执行后面的或大括号中的代码,否则将跳过这些语句。例如:
/* 定义全局变量 */ int A = 5 ; int B = 9 ; Void setup () { } Void loop () { // 判断逻辑条件 ; if (A > B) // 如果条件为真,则执行以下语句; A++; // 判断逻辑条件 ; If ( ( A < B ) && ( B != 0 )) // 如果条件为真,则执行以下语句; { A += B; B--; } }
If …else 语句
if 语句后面可以跟着一个可选的 else 语句,else 在条件为false时执行。
语法结构
if (表达式) { 语句块 ; } else { 语句块 ; }
if 先判断()内的条件,如果为真,执行{}内的代码;否则将执行else语句{}中的代码。如:
/* 定义全局变量 */ int A = 5 ; int B = 9 ; Void setup () { } Void loop () { // 判断逻辑条件; if (A > B) //执行{}内的语句; { A++; }else { //否则,执行else语句; B -= A; } }
1. else 也只能控制到其后的一个语句,如果要控制多个语句的话必须要加大括号{};
2. if 可以没有 else 单独使用,但如果要用 else,它必须是 if 的一部分。else 绝对不可能脱离if而单独使用。
If…else if …else 语句
if 语句后面可以跟一个可选的 else if …else语句。这是一个多条件判断语句,相比单 if 语句,在多条件判断时更好用。它的结构如下:
if (表达式_1) { 语句块 ; } else if(表达式_2) { 语句块 ; } . . . else { 语句块 ; }
if…else if…else 比 if…else 复杂一点,if…else if…else 的意思就是:“如果”第一个成立,就执行第一个;“否则如果”第二个成立就执行第二个;“否则”就执行第三个。当使用 if…else if …else语句时,需要记住以下规则:if 后面可以有多个 else if 语句,但else if 必须位于 else 之前;只要第一个 else if 语句的条件为真,其余的 else if 或else 语句都不会被执行。如:
/* 定义全局变量 */ int A = 5 ; int B = 9 ; int c = 15; Void setup () { } Void loop () { // 判断逻辑条件 if (A > B) //如果为真 { A++; } // 判断逻辑条件 else if ((A == B )||( B < c) ) //如果为真 { C = B* A; }else c++; }
switch case 语句
从功能上说,switch 语句和 if 语句完全可以相互取代。但从编程的角度,它们又各有各的特点,所以至今为止也不能说谁可以完全取代谁。当嵌套的 if 比较少时(三个以内),用 if 编写程序会比较简洁。但是当选择的分支比较多时,嵌套的 if 语句层数就会很多,导致程序冗长,可读性下降。因此需要用 switch 语句来处理多分支选择。所以 if 和 switch 可以说是分工明确的。switch case语法结构如下:
switch (表达式) { case 常量表达式1: 语句1 case 常量表达式2: 语句2 ┇ case 常量表达式n: 语句n default: 语句n+1 }
语法说明:
- switch 后面括号内的“表达式”必须是整数类型。也就是说可以是 int 型变量、char 型变量,也可以直接是整数或字符常量,哪怕是负数都可以。但绝对不可以是实数,float 型变量、double 型变量、小数常量通通不行,全部都是语法错误。
- switch 下的 case 和 default 必须用一对大括号{}括起来。
- 当switch后面括号内“表达式”的值与某个case后面的“常量表达式”的值相等时,就执行此case后面的语句。执行完一个case后面的语句后,流程控制转移到下一个case继续执行。如果你只想执行这一个case语句,不想执行其他case,那么就需要在这个case语句后面加上break,跳出switch语句。再重申一下:switch是“选择”语句,不是“循环”语句。很多新手看到break就以为是循环语句,因为break一般给我们的印象都是跳出“循环”,但break还有一个用法,就是跳出switch。
- 若所有的 case 中的常量表达式的值都没有与 switch 后面括号内“表达式”的值相等的,就执行 default 后面的语句,default 是“默认”的意思。如果 default 是最后一条语句的话,那么其后就可以不加 break,因为既然已经是最后一句了,则执行完后自然就退出 switch 了。
- 每个 case 后面“常量表达式”的值必须互不相同,否则就会出现互相矛盾的现象,而且这样写造成语法错误。
- “case常量表达式”只是起语句标号的作用,并不是在该处进行判断。在执行 switch 语句时,根据 switch 后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。
- 各个 case 和 default 的出现次序不影响执行结果。但从阅读的角度最好是按字母或数字的顺序写。
- 当然你也可以不要 default 语句,就跟 if…else 最后不要 else 语句一样。但最好是加上,后面可以什么都不写。这样可以避免别人误以为你忘了进行 default 处理,而且可以提醒别人 switch 到此结束了。
- default 后面可以什么都不写,但是后面的冒号和分号千万不能省略,省略了就是语法错误
来看个例子:
switch (phase) { case 0: Lo(); break; case 1: Mid(); break; case 2: Hi(); break; default: Message("Invalid state!"); }
条件运算符 ? 和 :
条件运算符的语法形式
条件 ? 表达式1 : 表达式2
条件运算符为 ? 和 : ,它们又称三目运算符,? 和 : 是一对运算符,不能分开单独使用。它的执行流程是:如果条件的值为真,则以表达式1的值作为结果值;否则以表达式2的值作为结果值。
条件运算符的第一个操作数是条件,必须是标量类型,也就是算术类型或指针类型。第二个和第三个操作数分别是表达式 1 和表达式 2,它们必须满足下面条件之一:
(1) 两个可选表达式都具有算术类型,在这种情况下,整个运算的最终结果类型,是后面两个操作数进行寻常算术转换的类型。
(2) 两个可选操作数都有相同的结构或联合类型,或者 void 类型。整个运算的最终结果类型也属于与这两个操作数一样的类型。
(3) 两个可选操作数都是指针,并且符合下面的一个条件:
两个指针属于相同类型。整个运算的结果也属于相同的类型。
其中一个操作数是空指针常量。整个运算的结果属于另一个操作数类型。
其中一个操作数是对象指针,另一个是指向 void 指针。整个运算的结果属于 void* 类型。
来看具体实例:
#include <stdio.h> int main(void) { int a, b, max; printf("please input two bumbers:"); scanf("%d %d", &a, &b); max = a > b ? a : b; printf("max = %d\n", max); return 0; }