【正文】
用goto語句而大大簡化編碼的實例。示例: for(byte r = 0。 r++){ for(byte g = 255。 g){ for(byte b = 0。 b++){ if (analogRead(0) 250){ goto bailout。 } }}bailout:相關(guān)語法分號用于一個語句的結(jié)束示例 int a = 13。該錯誤信息可能是明顯的,且會提及丟失分號,但也許不會。編譯器會在前一行的附近發(fā)出抱怨。它們用在幾個不同的結(jié)構(gòu)中,大致如下,這可能會令初學(xué)者感到困惑。這是一個常被稱為平衡括號的條件。只需選擇一個大括號,甚至直接在一個大括號后面點擊插入點,然后它的邏輯上的同伴就會高亮顯示。初級程序員,和從BASIC轉(zhuǎn)到C的程序員常常發(fā)現(xiàn)使用大括號令人困惑或畏縮。由于大括號的使用是如此的多樣,當(dāng)插入一個需要大括號的結(jié)構(gòu)時,直接在打出開括號之后打出閉括號是個不錯的編程實踐。你的大括號,還有你的態(tài)度,將永遠(yuǎn)不會變得不平衡。因為它們的多樣的使用,大括號對于程序的語法也是極其重要的,對一個大括號移動一行或兩行常常顯著地影響程序的意義。 for (initialisation。 incrementing expr) { statement(s) } //條件語句 if (boolean expression) { statement(s) } else if (boolean expression) { statement(s) } else { statement(s) }注釋注釋是程序中的一些行,用于讓自己或他人了解程序的工作方式。注釋唯一的目的是幫助你理解(或記憶)你的程序是怎樣工作的,或者是告知其他人你的程序是怎樣工作的。 //這是一個單行注釋。 /* 但是其中不可以使用另一個多行注釋 這是不合法的 */}//別忘了加上“關(guān)閉”注釋符 它們必須是平衡的*/提示當(dāng)實驗代碼時,“注釋掉”你的程序的一部分來移除可能是錯誤的行是一種方便的方法。這在定位問題時,或者當(dāng)程序無法編譯通過且編譯錯誤信息很古怪或沒有幫助時特別有用。在arduino中定義的常量不會在芯片中占用任何程序空間。這雖然可能有些有害的副作用,舉例來說,一個已被定義的常量名被包含在一些其它的常量或變量名中。通常,用const關(guān)鍵字定義常量是更受歡迎的且用來代替define會很有用。提示define語句的后面分號。define ledPin 3。define ledPin = 3 // this is also an error includeinclude 包含include用于在你的sketch中包含外部的庫。AVR C庫(AVR是Atmel芯片的一個基準(zhǔn),Arduino正是基于它)的主參考手冊頁在這里。示例該示例包含一個用于輸出數(shù)據(jù)到程序空間閃存的庫,而不是內(nèi)存。include avr/prog_uint16_t myConstants[] PROGMEM = {0, 21140, 702 , 9128, 0, 25764, 8456,0,0,0,0,0,0,0,0,29810,8968,29762,29762,4500}。 在C語言中單個等號被稱為賦值運算符。賦值運算符告訴微控制器求值等號右邊的變量或表達(dá)式,然后把結(jié)果存入等號左邊的變量中。 //聲明一個名為sensVal的整型變量 senVal = analogRead(0)。如果它不足以大到容納一個值,那個存儲在該變量中的值將是錯誤的。加,減,乘,除描述這些運算符(分別)返回兩人運算對象的和,差,積,商。所以,例如,9 / 4結(jié)果是2,如果9和2是整型數(shù)。(例如,給整型數(shù)值32767加1結(jié)果是32768)。如果其中一個數(shù)字(運算符)是float類型或double類型,將采用浮點數(shù)進行計算。x = x 7。r = r / 5。result = value1 value2。result = value1 / value2。要知道你的變量在哪一點將會“翻轉(zhuǎn)”且要知道在另一個方向上會發(fā)生什么,例如:(0 1)或(0 32768)。使用強制類型轉(zhuǎn)換符例如:(int)myFloat以在運行中轉(zhuǎn)換一個變量到另一個類型。這對于保持一個變量在一個特定的范圍很有用(例如:數(shù)組的大小)。 // x now contains 2x = 9 % 5。 // x now contains 0x = 4 % 5。int i = 0。 i = (i + 1) % 10。比較運算符if(條件) and ==, !=, , (比較運算符)if,用于和比較運算符聯(lián)合使用,測試某一條件是否到達(dá),例如一個輸入超出某一數(shù)值。如果是, 程序執(zhí)行特定的動作。否則,程序跳過該代碼。如果這么做了,下一行(由分號定義的行)就會變成唯一的條件語句。 if (x 120)digitalWrite(LEDpin, HIGH)。 } if (x 120){ digitalWrite(LEDpin1, HIGH)。 } // all are correct圓括號中被求值的語句需要使用一個或多個運算符:比較運算符: x == y (x is equal to y) x != y (x is not equal to y) x y (x is less than y) x y (x is greater than y) x = y (x is less than or equal to y) x = y (x is greater than or equal to y) 警告:小心偶然地使用單個等號(例如if(x = 10))。改用雙等號(例如if (x == 10)),這個是比較運算符,用于測試x是否等于10。這是因為C如下求值語句if(x=10):10分配給x(切記單個等號是賦值運算符),因此x現(xiàn)在為10。if39。由此,if (x = 10)將總是求值為真,這不是使用if語句所期望的結(jié)果。if也可以是使用[if...else]的分支控制結(jié)構(gòu)的一部分。amp。amp。amp。(單個與符號)。同樣,不要混淆布爾或運算符||(雙豎杠)與按位或運算符|(單豎杠)。例如 if (a = 10 amp。 a = 20){} // true if a is between 10 and 20指針運算符amp。并且可能寫大量的Arduino程序甚至都不會遇到指針。位運算位與按位與(amp。它們幫助解決各種常見的編程問題。[1]描述和語法以下是所有這些運算符的描述和語法。按位與(amp。按位與運算獨立地在周圍的表達(dá)式的每一位上執(zhí)行操作。表達(dá)這一思想的另一個方法是: 0 0 1 1 operand1 0 1 0 1 operand2 0 0 0 1 (operand1 amp。所以在兩個整型表達(dá)式之間使用amp。代碼片斷就像這樣: int a = 92。 // in binary: 0000000001100101 int c = a amp。 // result: 0000000001000100, or 68 in decimal. 在a和b的16位的每一位將使用按位與處理。按位與的其中一個最常用的用途是從一個整型數(shù)中選擇特定的位,常被稱為掩碼屏蔽。就像amp。(當(dāng)然)它所做的是不同的(操作)。換句話說: 0 0 1 1 operand1 0 1 0 1 operand2 0 1 1 1 (operand1 | operand2) returned result 這是一個使用一小斷C++代碼描述的按位或(運算)的例子: int a = 92。 // in binary: 0000000001100101 int c = a | b。在微控制器中,每個端口是一個8位數(shù)字,每一位表示一個引腳的狀態(tài)。PORTD是內(nèi)建的參照數(shù)字口0,1,2,3,4,5,6,7的輸出狀態(tài)的常量。(引腳總是需要用pinMode()指令設(shè)置為輸出模式)。一個小小的問題是,我們同時也改變了某些引腳的0,1狀態(tài)。我們的程序規(guī)則是:僅僅獲取和清除我們想控制的與相應(yīng)引腳對應(yīng)的位(使用按位與)。int i。void setup(){DDRD = DDRD | B11111100。}void loop(){for (i=0。 i++){PORTD = PORTD amp。 // clear out bits 2 7, leave pins 0 and 1 untouched (xx amp。 // shift variable up to pins 2 7 to avoid pins 0 and 1PORTD = PORTD | j。 // debug to show maskingdelay(100)。按位異或運算符使用符號^。 0 0 1 1 operand1 0 1 0 1 operand2 0 1 1 0 (operand1 ^ operand2) returned result 看待XOR的另一個視角是,當(dāng)輸入不同時結(jié)果為1,當(dāng)輸入相同時結(jié)果為0。 // binary: 1100 int y = 10。 // binary: 0110, or decimal 6 “^”運算符常用于翻轉(zhuǎn)整數(shù)表達(dá)式的某些位(例如從0變?yōu)?,或從1變?yōu)?)。以下是一個閃爍引腳5的程序.// Blink_Pin_5// demo for Exclusive ORvoid setup(){DDRD = DDRD | B00100000。}void loop(){PORTD = PORTD ^ B00100000。} 位非按位取反(~)在C++中按位取反運算符為波浪符“~”?!焙汀皘”,按位取反運算符應(yīng)用于其右側(cè)的單個操作數(shù)。0變?yōu)?,1變?yōu)?。 // binary: 0000000001100111 int b = ~a。如果最高位為1,該整數(shù)被解釋為負(fù)數(shù)。欲了解更多信息,請參閱維基百科條目:補碼。有時候,符號位在有符號整數(shù)表達(dá)式中能引起一些不期的意外。這些運算符將使左邊操作數(shù)的每一位左移或右移其右邊指定的位數(shù)。 // binary: 0000000000000101 int b = a 3。 // binary: 0000000000000101, or back to 5 like we started with當(dāng)把x左移y位(x y),x中最左邊的y位將會丟失。 // binary: 0000000000000101 int b = a 14。例如,要生成2的乘方,可以使用以下表達(dá)式: 1 0 == 1 1 1 == 2 1 2 == 4 1 3 == 8 ... 1 8 == 256 1 9 == 512 1 10 == 1024 ... 當(dāng)把x右移y位,x的最高位為1,該行為依賴于x的確切的數(shù)據(jù)類型。在這種情況下,符號位會復(fù)制到較低的位: int x = 16。 // binary: 1111111111111110該行為,被稱為符號擴展,常常不是你所期待的。事實上右移規(guī)則對于無符合整型表達(dá)式是不同的。 int x = 16。 // binary: 0001111111111110 如果你可以很小心地避免符號擴展,你可以使用右移位運算符,作為除以2的冪的一種方法。 int y = x 3。 //相當(dāng)于 i = i + 1。 //相當(dāng)于 i = i 1。 //相當(dāng)于 i = i + 5。 //相當(dāng)于 i = i 5。 //相當(dāng)于 i = i * 5。 //相當(dāng)于 i = i / 5。=iamp。 //相當(dāng)于 i = i amp。復(fù)合或|=i|=5。變量(本節(jié)轉(zhuǎn)自極客工坊)常量constants是在Arduino語言里預(yù)定義的變量。我們按組將常量分類。false在這兩個常量中false更容易被定義。truetrue通常被定義為1,這是正確的,但true具有更廣泛的定義。所以在布爾含義內(nèi)1,2和200都定義為ture。——這里引申一下題外話arduino是大小寫敏感語言(case sensitive)。HIGHHIGH(參考引腳)的含義取決于引腳(pin)的設(shè)置,引腳定義為INPUT或OUTPUT時含義有所不同。如果當(dāng)前引腳的電壓大于等于3V,微控制器將會返回為HIGH。輸入引腳的值將被一個內(nèi)在的20K上拉電阻 控制 在HIGH上,除非一個外部電路將其拉低到LOW。在這種狀態(tài)下,它可以 輸出電流 。LOW