x>y(x大于y)
x<=y(x小于等于y)
x>=y(x大于等于y)
警告:
注意使用赋值运算符的情况(如if(x=10))。
一个“=”表示的是赋值运算符,作用是将x的值设为10(将值10放入x变量的内存中)。
两个“=”表示的是比较运算符(如if(x==10)),用于测试x和10是否相等。
后面这个语句只有x是10时才为真,而前面赋值的那个语句则永远为真。
这是因为C语言按以下规则进行运算if(x=10):
10赋值给x(只要非0的数赋值的语句,其赋值表达式的值永远为真),因此x现在值为10。
此时if的测试表达式值为10,该值永远为真,因为非0值永远为真。
所以,if(x=10)将永远为真,这就不是我们运行if所期待的结果。
另外,x被赋值为10,这也不是我们所期待的结果。
if的另外一种分支条件控制结构是 if...else 形式。
if/else
if/else是比if更为高级的流程控制语句,它可以进行多次条件测试。
比如,检测模拟输入的值,当它小于500时该执行哪些操作,大于或等于500时执行另外的操作。
代码如下:
if(pinFiveInput<500)
{
//执行A操作
}
else
{
//执行B操作
}
else可以进行额外的if检测,所以多个互斥的条件可以同时进行检测。
测试将一个一个进行下去,直到某个测试结果为真,此时该测试相关的执行语句块将被运行,然后程序就跳过剩下的检测,直接执行到if/else的下一条语句。
当所有检测都为假时,若存在else语句块,将执行默认的else语句块。
注意elseif语句块可以没有else语句块。
elseif分支语句的数量无限制。
if(pinFiveInput<500)
{
//执行A操作
}
elseif(pinFiveInput>=1000)
{
//执行B操作
}
else
{
//执行C操作
}
另外一种进行多种条件分支判断的语句是switchcase语句。
for语句
描述
for语句用于重复执行一段在花括号之内的代码。
通常使用一个增量计数器计数并终止循环。
for语句用于重复性的操作非常有效,通常与数组结合起来使用来操作数据、引脚。
for循环开头有3个部分:
(初始化;条件;增量计数){
//语句
}
“初始化”只在循环开始执行一次。
每次循环,都会检测一次条件;如果条件为真,则执行语句和“增量计数”,之后再检测条件。
当条件为假时,循环终止。
例子
//用PWM引脚将LED变暗
intPWMpin=10;//将一个LED与47Ω电阻串联接在10脚
voidsetup()
{
//无需设置
}
voidloop()
{
for(inti=0;i<=255;i++){
analogWrite(PWMpin,i);
delay(10);
}
}
编程提示
C语言的for循环语句比BASIC和其他电脑编程语言的for语句更灵活。
除了分号以外,其他3个元素都能省略。
同时,初始化,条件,增量计算可以是任何包括无关变量的有效C语句,任何C数据类型包括float。
这些不寻常的for语句可能会解决一些困难的编程问题。
例如,在增量计数中使用乘法可以得到一个等比数列:
for(intx=2;x<100;x=x*1.5){
println(x);
}
生成:
2,3,4,6,9,13,19,28,42,63,94
另一个例子,使用for循环使LED产生渐亮渐灭的效果:
voidloop()
{
intx=1;
for(inti=0;i>-1;i=i+x){
analogWrite(PWMpin,i);
if(i==255)x=-1;//在峰值转变方向
delay(10);
}
}
switch/case语句
和if语句相同,switch…case通过程序员设定的在不同条件下执行的代码控制程序的流程。
特别地,switch语句将变量值和case语句中设定的值进行比较。
当一个case语句中的设定值与变量值相同时,这条case语句将被执行。
关键字break可用于退出switch语句,通常每条case语句都以break结尾。
如果没有break语句,switch语句将会一直执行接下来的语句(一直向下)直到遇见一个break,或者直到switch语句结尾。
例子
switch(var){
case1:
//当var等于1时,执行一些语句
break;
case2
//当var等于2时,执行一些语句
break;
default:
//如果没有任何匹配,执行default
//default可有可不有
}
语法
switch(var){
caselabel:
//声明
break;
caselabel:
//声明
break;
default:
//声明
}
参数
var:
用于与下面的case中的标签进行比较的变量值
label:
与变量进行比较的值
while循环
描述
while循环会无限的循环,直到括号内的判断语句变为假。
必须要有能改变判断语句的东西,要不然while循环将永远不会结束。
这在您的代码表现为一个递增的变量,或一个外部条件,如传感器的返回值。
语法
while(表达){
//语句
}
参数
表达:
为真或为假的一个计算结果
例子
var=0;
while(var<200){
//重复一件事200遍
var++
}
do...while
do…while循环与while循环运行的方式是相近的,不过它的条件判断是在每个循环的最后,所以这个语句至少会被运行一次,然后才被结束。
do
{
//语句
}while(测试条件);
例子
do
{
delay(50);//等待传感器稳定
X=readSensors();//检查传感器取值
}while(X<100);//当x小于100时,继续运行
break
break用于退出do,for,while循环,能绕过一般的判断条件。
它也能够用于退出switch语句。
例子
for(x=0;x<255;x++)
{
digitalWrite(PWMpin,x);
sens=analogRead(sensorPin);
if(sens>threshold){//超出探测范围
x=0;
break;
}
delay(50);
}
return
终止一个函数,如有返回值,将从此函数返回给调用函数。
语法:
return;
returnvalue;//两种形式均可
参数
value:
任何变量或常量的类型
例子:
一个比较传感器输入阈值的函数
intcheckSensor(){
if(analogRead(0)>400){
return1;}
else{
return0;
}
}
return关键字可以很方便的测试一段代码,而无需“commentout(注释掉)”大段的可能存在bug的代码。
voidloop(){
//写入漂亮的代码来测试这里。
return;
//剩下的功能异常的程序
//return后的代码永远不会被执行
}
goto
程序将会从程序中已有的标记点开始运行
语法
label:
gotolabel;//从label处开始运行
提示
不要在C语言中使用goto编程,某些C编程作者认为goto语句永远是不必要的,但用得好,它可以简化某些特定的程序。
许多程序员不同意使用goto的原因是,通过毫无节制地使用goto语句,很容易创建一个程序,这种程序拥有不确定的运行流程,因而无法进行调试。
的确在有的实例中goto语句可以派上用场,并简化代码。
例如在一定的条件用if语句来跳出高度嵌入的for循环。
例子
for(byter=0;r<255;r++){
for(byteg=255;g>-1;g--){
for(byteb=0;b<255;b++){
if(analogRead(0)>250){
gotobailout;
}
//更多的语句...
}
}
}
bailout: