Arduino-流程控制语句-系列5

  • 内容
  • 评论
  • 相关

在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
}

语法说明:

  1. switch 后面括号内的“表达式”必须是整数类型。也就是说可以是 int 型变量、char 型变量,也可以直接是整数或字符常量,哪怕是负数都可以。但绝对不可以是实数,float 型变量、double 型变量、小数常量通通不行,全部都是语法错误。
  2. switch 下的 case 和 default 必须用一对大括号{}括起来。
  3. 当switch后面括号内“表达式”的值与某个case后面的“常量表达式”的值相等时,就执行此case后面的语句。执行完一个case后面的语句后,流程控制转移到下一个case继续执行。如果你只想执行这一个case语句,不想执行其他case,那么就需要在这个case语句后面加上break,跳出switch语句。再重申一下:switch是“选择”语句,不是“循环”语句。很多新手看到break就以为是循环语句,因为break一般给我们的印象都是跳出“循环”,但break还有一个用法,就是跳出switch。
  4. 若所有的 case 中的常量表达式的值都没有与 switch 后面括号内“表达式”的值相等的,就执行 default 后面的语句,default 是“默认”的意思。如果 default 是最后一条语句的话,那么其后就可以不加 break,因为既然已经是最后一句了,则执行完后自然就退出 switch 了。
  5. 每个 case 后面“常量表达式”的值必须互不相同,否则就会出现互相矛盾的现象,而且这样写造成语法错误。
  6. “case常量表达式”只是起语句标号的作用,并不是在该处进行判断。在执行 switch 语句时,根据 switch 后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。
  7. 各个 case 和 default 的出现次序不影响执行结果。但从阅读的角度最好是按字母或数字的顺序写。
  8. 当然你也可以不要 default 语句,就跟 if…else 最后不要 else 语句一样。但最好是加上,后面可以什么都不写。这样可以避免别人误以为你忘了进行 default 处理,而且可以提醒别人 switch 到此结束了。
  9. 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;
}