前面我们陆续介绍了Arduino的程序结构、数据类型、常量和变量,本章介绍Arduino的运算符,运算符是一个特定的符号,它告诉计算机执行特定的数学或逻辑运算。在C语言中内置了丰富的运算符,包含以下类型:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 混合运算符
算术运算符
算术运算符也就是常见的加减乘除、赋值运算和模数运算,详细了解一下,我们先假设变量A的值是10,变量B的值是20:
- 赋值运算符:“ = ”,表示将等号右边的值存储在等号左边的变量中。如:A=B。这里注意不能理解为等于符号。
- 加法运算符:“ + ”,表示两个操作数相加。如:A+B,将会得到30。
- 减法运算符:“ – ”,表示两个操作数相减。如:A-B,将会得到-10。
- 乘法运算符:“ * ”,表示两个操作数相乘。如:A*B,将会得到200。
- 除法运算符:“ / ”,表示两个操作数相除。如:B/A,将会得到2。
- 模数运算符:“ % ”,表示求整数除法中的余数。如:B%A,将得到0。
再看一个实际例子:
void loop () { int a = 9,b = 4,c; c = a + b; c = a - b; c = a * b; c = a / b; c = a % b; }
/*代码将输出:*/ a + b = 13 a - b = 5 a * b = 36 a / b = 2 //不计余数,取整数商; a % b = 1 //余数是1;
关系运算符
关系运算符在C语言中主要起判断的作用。同样的,我们先假设变量A的值是10,变量B的值是20:
- 等于:“ == ” ,判断两个操作数的值是否相等,如果是,则条件为真。如:A == B,结果不为真,会返回 false;
- 不等于:“ != ”,判断两个操作数的值是否相等,如果值不相等,则条件为真。如:A != B,结果为真,会返回 true;
- 小于:“ < ”,判断符号左边操作数的值是否小于右边操作数的值,如果是,则条件为真。如A < B,结果为真,会返回 true;
- 大于:“ > ”,判断符号左边操作数的值是否大于右边操作数的值,如果是,则条件为真。如A > B,结果不为真,会返回 false;
- 小于等于 :“ <= ”,判断符号左边操作数的值是否小于或等于右边操作数的值,如果是,则条件为真。如A <= B,结果为真,会返回 true;
- 大于等于:“ >= ”, 判断符号左边操作数的值是否大于或等于右边操作数的值,如果是,则条件为真。 如A >= B,结果不为真,会返回 false;
看实际例子:
void loop () { int a = 9,b = 4 bool c = false; if(a == b) c = true; else c = false; if(a != b) c = true; else c = false; if(a < b) c = true; else c = false; if(a > b) c = true; else c = false; if(a <= b) c = true; else c = false; if(a >= b) c = true; else c = false; }
输出结果如下:
c = false c = true c = false c = true c = false c = false
逻辑运算符
同样的,我们先通过假设变量A的值是10,变量B的值是20:
- 逻辑与‘and’:“ && ”,如果两个操作数都非零,则条件为真。如:A && B,结果为真;
- 逻辑或‘or’:“ || ”,如果两个操作数中有一个非零,则条件为真。如:A || B,结果也为真;
- 逻辑非‘not’:“ ! ”,用于反转操作数的逻辑状态。如操作数的逻辑状态条件为真,则逻辑非的结果为假。如:!(A&&B),因为A && B,结果为真,则逻辑非结果为假。
看一下实际例子:
void loop () { int a = 9,b = 4 bool c = false; if((a > b)&& (b < a)) c = true; else c = false; if((a == b)|| (b < a)) c = true; else c = false; if( !(a == b)&& (b < a)) c = true; else c = false; }
输出:
c = true c = true c = true
位运算符
Arduino中的位运算符包括:按位与(&)、按位或(|)、按位异或(^)、取反(~),它们的运算对象都必须为整数,而且除了取反运算符,其余三种均为双目运算符(见文末注解)。当然Arduino中还包括左移运算符(<<)和右移运算符(>> )。老惯例,假设变量A的值是60(二进制0011 1100),变量B的值是13(二进制0000 1101):
- 按位与(&):让参与运算的两个数相对应的二进制位相与。规则:只有对应的两个二进制位都为1时,结果位才为1;只要有一个二进制位为0,结果位就为0。如A&B,A对应二进制为 0011 1100 ;B对应二进制为 0000 1101 ,结果为12,对应二进制运算结果为 0000 1100。
- 按位或(|):让参与运算的两个数相对应的的二进制位相或。规则:只有对应的两个二进制位都为0时,结果位才为0;只要有一个二进制位为1,结果位就为1。如:A|B,结果对应的二进制位为 0011 1101,结果为61;
- 按位异或(^):让参与运算的两个数相对应的的二进制位相异或。规则:当对应的两个二进制位相同(都为1或都为0)时,结果位为0;当对应的两个二进制位相异时,结果位为1。如A^B,结果对应的二进制位为00110001,结果为49;
- 取反(~):用于求整数的二进制反码。规则:二进制位为1的取反后变为0,二进制位为0的取反后变为1。如:~A,结果二进制为1100 0011;
- 左移运算符(<<):规则:左操作数值由右操作数指定的位数向左移动,左边“抛弃”,右边补0。如:(A << 2)结果为 240, 二进制为 1111 0000;
- 右移运算符(>> ):左操作数值按右操作数指定的位数右移,左边用0填充,右边丢弃。如:(A >> 2) 结果为 15, 二进制为 0000 1111。
看一些实际例子:
void loop () { int a = 60,b = 13 int c = 0; c = a & b ; c = a | b ; c = a ^ b ; c = a ~ b ; c = a << b ; c = a >> b ; }
输出:
c = 12 c = 61 c = 49 c = -60 c = 240 c = 15
混合运算符
我们还是以实际例子来帮助理解,假设变量A的值是10,变量B的值是20:
- “++”:增量运算符,将整数值增加1。如:A++,结果为11;
- “–”: 递减运算符,使整数值减少1 。如:A–,结果为9;
- “+=”:将右操作数添加到左操作数并将结果分配给左操作数。如:B += A,等价于B = B+ A;
- “-=”:将左操作数减去右操作数并将结果赋给左操作数。如:B -= A等价于B = B – A;
- “*=”:将右操作数与左操作数相乘,并将结果赋给左操作数。如:B*= A等价于B = B*A;
- “/=”:将左操作数与右操作数分开,并将结果分配给左操作数。如:B /= A等价于B = B / A;
- “%=”:对两个操作数取模,并将结果赋给左操作数。如:B %= A等价于B = B % A。
看实际例子:
void loop () { int a = 10,b = 20 int c = 0; a++; a--; b += a; b -= a; b *= a; b /= a; a %= b; a |= b; a &= b; }
输出为:
a = 11 a = 9 b = 30 b = 10 b = 200 b = 2 a = 0 a = 0 a = 30
注解
单目运算符:只对一个变量进行操作。如:a++;
双目运算符:对两个变量进行操作。如:a=1; b=3; c=a+b;就是双目运算符;
多目运算符:对三个变量进行操作。如:int a = boolean ? b : c; 。