Arduino 控制语句

控制语句

  • if
  • if...else
  • for
  • switch case
  • while
  • do...while
  • break
  • continue
  • return
  • goto

if

用于与比较运算符结合使用,测试是否已达到某些条件,例如一个输入数据在某个范围之外。使用格式如下:

if (value > 50)
{
  // 这里加入你的代码
}

该程序测试value是否大于50。如果是,程序将执行特定的动作。换句话说,如果圆括号中的语句为真,大括号中的语句就会执行。如果不是,程序将跳过这段代码。大括号可以被省略,如果这么做,下一行(以分号结尾)将成为唯一的条件语句。

if (x > 0) 
   digitalWrite(LEDpin, HIGH); 

if (x > 0)
   digitalWrite(LEDpin, HIGH); 

if (x > 0){ 
   digitalWrite(LEDpin, HIGH); 
} 

if (x > 0){ 
   digitalWrite(LEDpin1, HIGH);
   digitalWrite(LEDpin2, HIGH); 
}                                 

// 都是正确的

圆括号中要被计算的语句需要一个或多个操作符。


if...else

与基本的if语句相比,由于允许多个测试组合在一起,if/else可以使用更多的控制流。例如,可以测试一个模拟量输入,如果输入值小于500,则采取一个动作,而如果输入值大于或等于500,则采取另一个动作。代码看起来像是这样:

if (pinFiveInput < 500)
{
     // 动作A
}
else
{
     // 动作B
}

else中可以进行另一个if测试,这样多个相互独立的测试就可以同时进行。每一个测试一个接一个地执行直到遇到一个测试为真为止。当发现一个测试条件为真时,与其关联的代码块就会执行,然后程序将跳到完整的if/else结构的下一行。如果没有一个测试被验证为真。缺省的else语句块,如果存在的话,将被设为默认行为,并执行。

注意:一个else if语句块可能有或者没有终止else语句块,同理。每个else if分支允许有无限多个。

if (pinFiveInput < 500)
{
     // 执行动作A
}
else if (pinFiveInput >= 1000)
{
     // 执行动作B
}
else
{
     // 执行动作C
}

另外一种表达互斥分支测试的方式,是使用switch case语句。


for

for语句 描述 for语句用于重复执行被花括号包围的语句块。一个增量计数器通常被用来递增和终止循环。for语句对于任何需要重复的操作是非常有用的。常常用于与数组联合使用以收集数据/引脚。for循环的头部有三个部分:

for (初始化部分; 条件判断部分; 数据递增部分) {
    //语句块
    ......
}

初始化部分被第一个执行,且只执行一次。每次通过这个循环,条件判断部分将被测试;如果为真,语句块和数据递增部分就会被执行,然后条件判断部分就会被再次测试,当条件测试为假时,结束循环。

示例:

//使用一个PWM引脚使LED灯闪烁
int PWMpin = 10; // LED在10号引脚串联一个470欧姆的电阻
void setup()
{
     //这里无需设置
}
void loop()
{
    for (int i=0; i <= 255; i++){
    analogWrite(PWMpin, i);
    delay(10);
 }
}

编码提示: C中的for循环比在其它计算机语言中发现的for循环要灵活的多,包括BASIC。三个头元素中的任何一个或全部可能被省略,尽管分号是必须的。而且初始化部分、条件判断部分和数据递增部分可以是任何合法的使用任意变量的C语句。且可以使用任何数据类型包括floats。这些不常用的类型用于语句段也许可以为一些罕见的编程问题提供解决方案。

例如,在递增部分中使用一个乘法将形成对数级增长:

for(int x = 2; x < 100; x = x * 1.5){
 println(x);
}

输出: 2, 3, 4, 6, 9, 13, 19, 28, 42, 63, 94

另一个例子,在一个for循环中使一个LED灯渐渐地变亮和变暗:

void loop()
{
   int x = 1;
   for (int i = 0; i > -1; i = i + x){
   analogWrite(PWMpin, i);
   if (i == 255) x = -1; // 在峰值切换方向
   delay(10);
 }
}

switch case

switch case 语句 就像if语句,switch...case通过允许程序员根据不同的条件指定不同的应被执行的代码来控制程序流。特别地,一个switch语句对一个变量的值与case语句中指定的值进行比较。当一个case语句被发现其值等于该变量的值。就会运行这个case语句下的代码。

break关键字将中止并跳出switch语句段,常常用于每个case语句的最后面。如果没有break语句,switch语句将继续执行下面的表达式(“持续下降”)直到遇到break,或者是到达switch语句的末尾。

示例:

 switch (var) {
   case 1:
   //当var等于1执行这里
   break;
   case 2:
   //当var等于2执行这里
   break;
   default:
   // 如果没有匹配项,将执行此缺省段
   // default段是可选的
 }

语法

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

参数
var: 与不同的case中的值进行比较的变量
label: 相应的case的值


while

while循环

描述:
while循环将会连续地无限地循环,直到圆括号()中的表达式变为假。被测试的变量必须被改变,否则while循环将永远不会中止。这可以是你的代码,比如一个递增的变量,或者是一个外部条件,比如测试一个传感器。

语法:

 while(expression){
   // statement(s)
}

参数:
expression - 一个(布尔型)C语句,被求值为真或假

示例:

var = 0;
while(var < 200){
   // 做两百次重复的事情
   var++;
 }

do...while

do循环 do循环与while循环使用相同方式工作,不同的是条件是在循环的末尾被测试的,所以do循环总是至少会运行一次。

do
{
 // 语句块
} while (测试条件);

示例:

do
{
 delay(50); // 等待传感器稳定
 x = readSensors(); // 检查传感器的值
} while (x < 100 );

break

break用于中止do,for,或while循环,绕过正常的循环条件。它也用于中止switch语句。

示例:

for (x = 0; x < 255; x ++)
{
   digitalWrite(PWMpin, x);
   sens = analogRead(sensorPin);
   if (sens > threshold){ // bail out on sensor detect
       x = 0;
       break;
   }
 delay(50);
}

continue

continue语句跳过一个循环的当前迭代的余下部分。(do,for,或while)。通过检查循环测试条件它将继续进行随后的迭代。

示例:

for (x = 0; x < 255; x ++)
{
    if (x > 40 && x <0){ // create jump in values
        continue;
    }
   digitalWrite(PWMpin, x);
   delay(50);
}

return

终止一个函数,并向被调用函数并返回一个值,如果你想的话。

语法:

return;
return value; // both forms are valid

参数: value: 任何类型的变量或常量

示例:

//一个函数,用于对一个传感器输入与一个阈值进行比较
 int checkSensor(){      
     if (analogRead(0) > 400) {
         return 1;
     else{
         return 0;
     }
}

return 关键字对测试一段代码很方便,不需“注释掉”大段的可能是错误的代码。

void loop(){
    //在此测试代码是个好想法
    return;
    // 这里是功能不正常的代码
    // 这里的代码永远也不会执行
}

goto

在程序中转移程序流到一个标记点

语法:

label:
goto label; // sends program flow to the label

提示: 在C程序中不建议使用goto,而且一些C编程书的作者主张永远不要使用goto语句,但是明智地使用它可以简化某些代码。许多程序员不赞成使用goto的原因是,无节制地使用goto语句很容易产生执行流混乱的很难被调试程序。尽管如是说,仍然有很多使用goto语句而大大简化编码的实例。其中之一就是从一个很深的循环嵌套中跳出去,或者是if逻辑块,在某人些条件下。

示例:

 for(byte r = 0; r < 255; r++){
     for(byte g = 255; g > -1; g--){
         for(byte b = 0; b < 255; b++){
               if (analogRead(0) > 250){ goto bailout;}
                     // 其它语句。。。
               }
         }
}
bailout:
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,663评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,125评论 3 414
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,506评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,614评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,402评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,934评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,021评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,168评论 0 287
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,690评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,596评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,784评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,288评论 5 357
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,027评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,404评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,662评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,398评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,743评论 2 370

推荐阅读更多精彩内容

  • Swift 提供了类似 C 语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行...
    穷人家的孩纸阅读 714评论 1 1
  • [The Swift Programming Language 中文版]本页包含内容: Swift提供了多种流程控...
    风林山火阅读 576评论 0 0
  • 控制流 Swift提供了各种控制流程语句。这些包括while循环多次执行任务; if,guard以及switch基...
    Fuuqiu阅读 378评论 0 0
  • Swift提供了多种控制流声明。包括while循环来多次执行一个任务;if,guard和switch声明来根据确定...
    BoomLee阅读 1,971评论 0 3
  • 熬夜有时候似乎能带来快感,现在这个时代的生活节奏都越来越快。虽然一天有很多的时间在荒度,但是真正能一个人在房间,在...
    颓废的少女阅读 400评论 0 0