前面我們陸續(xù)介紹了Arduino的程序結(jié)構(gòu)、數(shù)據(jù)類(lèi)型、常量和變量,本章介紹Arduino的運(yùn)算符,運(yùn)算符是一個(gè)特定的符號(hào),它告訴計(jì)算機(jī)執(zhí)行特定的數(shù)學(xué)或邏輯運(yùn)算。在C語(yǔ)言中內(nèi)置了豐富的運(yùn)算符,包含以下類(lèi)型:
- 算術(shù)運(yùn)算符
- 關(guān)系運(yùn)算符
- 邏輯運(yùn)算符
- 位運(yùn)算符
- 混合運(yùn)算符

算術(shù)運(yùn)算符
算術(shù)運(yùn)算符也就是常見(jiàn)的加減乘除、賦值運(yùn)算和模數(shù)運(yùn)算,詳細(xì)了解一下,我們先假設(shè)變量A的值是10,變量B的值是20:
- 賦值運(yùn)算符:“ = ”,表示將等號(hào)右邊的值存儲(chǔ)在等號(hào)左邊的變量中。如:A=B。這里注意不能理解為等于符號(hào)。
- 加法運(yùn)算符:“ + ”,表示兩個(gè)操作數(shù)相加。如:A+B,將會(huì)得到30。
- 減法運(yùn)算符:“ – ”,表示兩個(gè)操作數(shù)相減。如:A-B,將會(huì)得到-10。
- 乘法運(yùn)算符:“ * ”,表示兩個(gè)操作數(shù)相乘。如:A*B,將會(huì)得到200。
- 除法運(yùn)算符:“ / ”,表示兩個(gè)操作數(shù)相除。如:B/A,將會(huì)得到2。
- 模數(shù)運(yùn)算符:“ % ”,表示求整數(shù)除法中的余數(shù)。如:B%A,將得到0。
再看一個(gè)實(shí)際例子:
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 //不計(jì)余數(shù),取整數(shù)商; a % b = 1 //余數(shù)是1;
關(guān)系運(yùn)算符
關(guān)系運(yùn)算符在C語(yǔ)言中主要起判斷的作用。同樣的,我們先假設(shè)變量A的值是10,變量B的值是20:
- 等于:“ == ” ,判斷兩個(gè)操作數(shù)的值是否相等,如果是,則條件為真。如:A == B,結(jié)果不為真,會(huì)返回 false;
- 不等于:“ != ”,判斷兩個(gè)操作數(shù)的值是否相等,如果值不相等,則條件為真。如:A != B,結(jié)果為真,會(huì)返回 true;
- 小于:“ < ”,判斷符號(hào)左邊操作數(shù)的值是否小于右邊操作數(shù)的值,如果是,則條件為真。如A < B,結(jié)果為真,會(huì)返回 true;
- 大于:“ > ”,判斷符號(hào)左邊操作數(shù)的值是否大于右邊操作數(shù)的值,如果是,則條件為真。如A > B,結(jié)果不為真,會(huì)返回 false;
- 小于等于 :“ <= ”,判斷符號(hào)左邊操作數(shù)的值是否小于或等于右邊操作數(shù)的值,如果是,則條件為真。如A <= B,結(jié)果為真,會(huì)返回 true;
- 大于等于:“ >= ”, 判斷符號(hào)左邊操作數(shù)的值是否大于或等于右邊操作數(shù)的值,如果是,則條件為真。 如A >= B,結(jié)果不為真,會(huì)返回 false;
看實(shí)際例子:
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; }
輸出結(jié)果如下:
c = false c = true c = false c = true c = false c = false
邏輯運(yùn)算符
同樣的,我們先通過(guò)假設(shè)變量A的值是10,變量B的值是20:
- 邏輯與‘a(chǎn)nd’:“ && ”,如果兩個(gè)操作數(shù)都非零,則條件為真。如:A && B,結(jié)果為真;
- 邏輯或‘or’:“ || ”,如果兩個(gè)操作數(shù)中有一個(gè)非零,則條件為真。如:A || B,結(jié)果也為真;
- 邏輯非‘not’:“ ! ”,用于反轉(zhuǎn)操作數(shù)的邏輯狀態(tài)。如操作數(shù)的邏輯狀態(tài)條件為真,則邏輯非的結(jié)果為假。如:!(A&&B),因?yàn)锳 && B,結(jié)果為真,則邏輯非結(jié)果為假。
看一下實(shí)際例子:
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
位運(yùn)算符
Arduino中的位運(yùn)算符包括:按位與(&)、按位或(|)、按位異或(^)、取反(~),它們的運(yùn)算對(duì)象都必須為整數(shù),而且除了取反運(yùn)算符,其余三種均為雙目運(yùn)算符(見(jiàn)文末注解)。當(dāng)然Arduino中還包括左移運(yùn)算符(<<)和右移運(yùn)算符(>> )。老慣例,假設(shè)變量A的值是60(二進(jìn)制0011 1100),變量B的值是13(二進(jìn)制0000 1101):
- 按位與(&):讓參與運(yùn)算的兩個(gè)數(shù)相對(duì)應(yīng)的二進(jìn)制位相與。規(guī)則:只有對(duì)應(yīng)的兩個(gè)二進(jìn)制位都為1時(shí),結(jié)果位才為1;只要有一個(gè)二進(jìn)制位為0,結(jié)果位就為0。如A&B,A對(duì)應(yīng)二進(jìn)制為 0011 1100 ;B對(duì)應(yīng)二進(jìn)制為 0000 1101 ,結(jié)果為12,對(duì)應(yīng)二進(jìn)制運(yùn)算結(jié)果為 0000 1100。
- 按位或(|):讓參與運(yùn)算的兩個(gè)數(shù)相對(duì)應(yīng)的的二進(jìn)制位相或。規(guī)則:只有對(duì)應(yīng)的兩個(gè)二進(jìn)制位都為0時(shí),結(jié)果位才為0;只要有一個(gè)二進(jìn)制位為1,結(jié)果位就為1。如:A|B,結(jié)果對(duì)應(yīng)的二進(jìn)制位為 0011 1101,結(jié)果為61;
- 按位異或(^):讓參與運(yùn)算的兩個(gè)數(shù)相對(duì)應(yīng)的的二進(jìn)制位相異或。規(guī)則:當(dāng)對(duì)應(yīng)的兩個(gè)二進(jìn)制位相同(都為1或都為0)時(shí),結(jié)果位為0;當(dāng)對(duì)應(yīng)的兩個(gè)二進(jìn)制位相異時(shí),結(jié)果位為1。如A^B,結(jié)果對(duì)應(yīng)的二進(jìn)制位為00110001,結(jié)果為49;
- 取反(~):用于求整數(shù)的二進(jìn)制反碼。規(guī)則:二進(jìn)制位為1的取反后變?yōu)椋埃M(jìn)制位為0的取反后變?yōu)椋薄H纾簙A,結(jié)果二進(jìn)制為1100 0011;
- 左移運(yùn)算符(<<):規(guī)則:左操作數(shù)值由右操作數(shù)指定的位數(shù)向左移動(dòng),左邊“拋棄”,右邊補(bǔ)0。如:(A << 2)結(jié)果為 240, 二進(jìn)制為 1111 0000;
- 右移運(yùn)算符(>> ):左操作數(shù)值按右操作數(shù)指定的位數(shù)右移,左邊用0填充,右邊丟棄。如:(A >> 2) 結(jié)果為 15, 二進(jìn)制為 0000 1111。
看一些實(shí)際例子:
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
混合運(yùn)算符
我們還是以實(shí)際例子來(lái)幫助理解,假設(shè)變量A的值是10,變量B的值是20:
- “++”:增量運(yùn)算符,將整數(shù)值增加1。如:A++,結(jié)果為11;
- “–”: 遞減運(yùn)算符,使整數(shù)值減少1 。如:A–,結(jié)果為9;
- “+=”:將右操作數(shù)添加到左操作數(shù)并將結(jié)果分配給左操作數(shù)。如:B += A,等價(jià)于B = B+ A;
- “-=”:將左操作數(shù)減去右操作數(shù)并將結(jié)果賦給左操作數(shù)。如:B -= A等價(jià)于B = B – A;
- “*=”:將右操作數(shù)與左操作數(shù)相乘,并將結(jié)果賦給左操作數(shù)。如:B*= A等價(jià)于B = B*A;
- “/=”:將左操作數(shù)與右操作數(shù)分開(kāi),并將結(jié)果分配給左操作數(shù)。如:B /= A等價(jià)于B = B / A;
- “%=”:對(duì)兩個(gè)操作數(shù)取模,并將結(jié)果賦給左操作數(shù)。如:B %= A等價(jià)于B = B % A。
看實(shí)際例子:
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
注解
單目運(yùn)算符:只對(duì)一個(gè)變量進(jìn)行操作。如:a++;
雙目運(yùn)算符:對(duì)兩個(gè)變量進(jìn)行操作。如:a=1; b=3; c=a+b;就是雙目運(yùn)算符;
多目運(yùn)算符:對(duì)三個(gè)變量進(jìn)行操作。如:int a = boolean ? b : c; 。