【正文】
GH 和 LOW 。 需要注意的是true和false常量,不同于HIGH,LOW,INPUT和OUTPUT,需要全部小寫。在布爾含義(Boolean sense)里任何 非零 整數(shù) 為true。false被定義為0(零)。邏輯層定義,true與false(布爾Boolean常量)在Arduino內(nèi)有兩個(gè)常量用來(lái)表示真和假:true和 false。它們被用來(lái)使程序更易閱讀。 //相當(dāng)于 i = i | 5。 5。=5。復(fù)合與amp。復(fù)合除/=i/=5。復(fù)合乘*=i*=5。復(fù)合減=i=5。復(fù)合加+=i+=5。自減i。 // 1000除以8,得y = 125.復(fù)合運(yùn)算符自加++i++。例如 int x = 1000。 // binary: 1111111111110000 int y = (unsigned int)x 3。所以你可以使用強(qiáng)制類型轉(zhuǎn)換來(lái)避免左邊移入1。反而,你可能希望移入左邊的是0。 // binary: 1111111111110000 int y = x 3。如果x的類型是int,最高位為符號(hào)位,決定x是不是負(fù)數(shù),正如我們?cè)谏厦嬉呀?jīng)討論過的。 // binary: 0100000000000000 101中的第一個(gè)1被丟棄 如果您確信沒有值被移出,理解左移位運(yùn)算符一個(gè)簡(jiǎn)單的辦法是,把它的左操作數(shù)乘2將提高其冪值。 int a = 5。 // binary: 0000000000101000, or 40 in decimal int c = b 3。語(yǔ)法variable number_of_bits variable number_of_bits 參數(shù)br *variable (byte, int, long) number_of_bits integer = 32 br示例:br pre style=color:green int a = 5。左移、右移左移運(yùn)算(),右移運(yùn)算()描述From The Bitmath Tutorial in The Playground 在C++中有兩個(gè)移位運(yùn)算符:左移運(yùn)算符和右移運(yùn)算符。順便說一句,值得注意的是,對(duì)于任何整數(shù)x, ~x 與 x1 相等。這里正數(shù)和負(fù)數(shù)的編碼被稱為二進(jìn)制補(bǔ)碼。 // binary: 1111111110011000 = 104 看到此操作的結(jié)果為一個(gè)負(fù)數(shù):104,你可能會(huì)感到驚訝,這是因?yàn)橐粋€(gè)整型變量的最高位是所謂的符號(hào)位。例如: 0 1 operand1 1 0 ~ operand1 int a = 103。按位取反操作會(huì)翻轉(zhuǎn)其每一位。不像“amp。 // invert bit 5 (digital pin 5), leave others untoucheddelay(100)。 // set digital pin five as OUTPUT (9600)。在一個(gè)按位異或操作中,如果相應(yīng)的掩碼位為1, 該位將翻轉(zhuǎn),如果為0,該位不變。 // binary: 1010 int z = x ^ y。這里是一個(gè)簡(jiǎn)單的示例代碼: int x = 12。該運(yùn)算符與按位或運(yùn)算符“|”非常相似 ,唯一的不同是當(dāng)輸入位都為1時(shí)它返回0。 }} 位異或按位異或(^)在C++中有一個(gè)有點(diǎn)不尋常的操作,它被稱為按位異或,或者XOR(在英語(yǔ)中,通常讀作“eksor”)。 // bine the port information with the new information for LED pins(PORTD, BIN)。 11 == xx)j = (i 2)。 B00000011。 i64。 // set direction bits for pins 2 to 7, leave 0 and 1 untouched (xx | 00 == xx)// same as pinMode(pin, OUTPUT) for pins 2 to 7(9600)。 // counter variableint j。合并要修改的PORTD值與所控制的引腳的新值(使用按位或)。這用于Arduino與串口通訊,所以我們可能會(huì)干擾串口通訊。所以如果我們寫入PORTD = B00110001;我們就會(huì)讓引腳2,3和7輸出高。如果一個(gè)比特位是1,那么該引腳置高。寫一個(gè)端口可以同時(shí)控制所有的引腳。 // result: 0000000001111101, or 125 in decimal. 按位與和按位或的一個(gè)共同的工作是在端口上進(jìn)行程序員稱之為讀改寫的操作。 // in binary: 0000000001011100 int b = 101。兩個(gè)輸入位其中一個(gè)或都是1按位或?qū)⒌玫?,否則為0。運(yùn)算符,|獨(dú)立地計(jì)算它周圍的兩個(gè)整型表達(dá)式的每一位。看如下示例:位或按位或(|)在C++中按位或運(yùn)算符是垂直的條桿符號(hào),|。且所有16位結(jié)果存入C中,以二進(jìn)制存入的結(jié)果值01000100,即十進(jìn)制的68。 b。 // in binary: 0000000001011100 int b = 101。將會(huì)導(dǎo)致16個(gè)與運(yùn)算同時(shí)發(fā)生。 operand2) returned result 在Arduino中,int型是16位的。根據(jù)這一規(guī)則:如果兩個(gè)輸入位都是1,結(jié)果輸出1,否則輸出0。)在C++中按位與運(yùn)算符是單個(gè)與符號(hào), 用于其它兩個(gè)整型表達(dá)式之間使用。更詳細(xì)的資料或許可以在參考指南中找到。以下大部分資料來(lái)自一個(gè)有關(guān)位數(shù)學(xué)的優(yōu)秀教程,或許可以在這里找到。)按位操作符在變量的位級(jí)執(zhí)行運(yùn)算。無(wú)論如何,巧妙地控制特定的數(shù)據(jù)結(jié)構(gòu),使用指針可以簡(jiǎn)化代碼,而且在自己工具箱中擁有熟練控制指針的知識(shí)是很方便的。(引用)和 *(間接引用)指針對(duì)于C初學(xué)者來(lái)說是更復(fù)雜的對(duì)象之一。amp。按位取反~(波浪號(hào))看起來(lái)與布爾非!有很大不同(感嘆號(hào)或程序員口中的“棒”),但是你仍然必須確保在什么地方用哪一個(gè)。它們是完全不同的概念。(兩個(gè)與符號(hào))錯(cuò)認(rèn)為按位與運(yùn)算符amp。 digitalRead(3) == HIGH) { // read two switches // ...} 只在兩個(gè)輸入都為高時(shí)返回真|| (邏輯或)任意一個(gè)為真時(shí)返回真,例如:if (x 0 || y 0) { // ...} x或y任意一個(gè)大于0時(shí)返回真! (非)當(dāng)操作數(shù)為假時(shí)返回真,例如:if (!x) { // ...} 若x為假返回真(即如果x等于0)警告確保你沒有把布爾與運(yùn)算符,amp。 (邏輯與)只有在兩個(gè)操作數(shù)都為真時(shí)才返回真,例如:if (digitalRead(2) == HIGH amp。布爾運(yùn)算符它們可用于if語(yǔ)句中的條件amp。另外,變量x將被設(shè)置為10,這也不是期望的操作。條件求值10,其總是為真,由于任何非零數(shù)值都為真值。然后39。后者只在x等于10時(shí)返回真,但是前者將總是為真。單個(gè)等號(hào)是賦值運(yùn)算符,這里設(shè)置x為10(將值10存入變量x)。 digitalWrite(LEDpin2, HIGH)。 if (x 120){ digitalWrite(LEDpin, HIGH)。if (x 120) digitalWrite(LEDpin, HIGH)。if語(yǔ)句后的花括號(hào)可能被省略。換句話說,如果圓括號(hào)中的語(yǔ)句為真,花括號(hào)中的語(yǔ)句就會(huì)運(yùn)行。if條件測(cè)試的格式:if (someVariable 50){ // do something here} 該程序測(cè)試someVariable是否大于50。 // modulo operator rolls over variable } 提示:取模運(yùn)算符不能用于浮點(diǎn)型數(shù)。void setup() {}void loop(){ values[i] = analogRead(0)。 // x now contains 4示例代碼 /* update one value in an array each time through a loop */int values[10]。 // x now contains 4x = 5 % 5。語(yǔ)法 result = dividend % divisor 參數(shù)dividend: 被除數(shù)divisor: 除數(shù)結(jié)果:余數(shù)示例x = 7 % 5。取模%(取模)描述計(jì)算一個(gè)數(shù)除以另一個(gè)數(shù)的余數(shù)。對(duì)于數(shù)學(xué)需要分?jǐn)?shù),就使用浮點(diǎn)變量,但是要注意它們的缺點(diǎn):占用空間大,計(jì)算速度慢。參數(shù):value1:任何變量或常量value2:任何變量或常量編程技巧:要知道整型常量默認(rèn)為int型,因此一些常量計(jì)算可能會(huì)溢出(例如:60 * 1000將產(chǎn)生負(fù)的結(jié)果)選擇一個(gè)大小足夠大的變量以容納你的最大的計(jì)算結(jié)果。result = value1 * value2。語(yǔ)法result = value1 + value2。i = j * 6。示例y = y + 3。如果運(yùn)算對(duì)象是不同的類型,會(huì)用那個(gè)較大的類型進(jìn)行計(jì)算。這也意味著運(yùn)算會(huì)溢出,如果結(jié)果超出其在相應(yīng)的數(shù)據(jù)類型下所能表示的數(shù)。這些操作受運(yùn)算對(duì)象的數(shù)據(jù)類型的影響。不要混淆賦值運(yùn)算符[ = ](單個(gè)等號(hào))和比較運(yùn)算符[ == ](雙等號(hào)),后者求值兩個(gè)表達(dá)式是否相等。 //存儲(chǔ)(數(shù)字的)0號(hào)模擬引腳的輸入電壓值到sensVal編程技巧賦值運(yùn)算符(=號(hào))左邊的變量需要能夠保存存儲(chǔ)在其中的值。示例 int sensVal。它與在代數(shù)課中的意義不同,后者象征等式或相等。算術(shù)運(yùn)算符賦值=賦值運(yùn)算符(單個(gè)等號(hào))把等號(hào)右邊的值存儲(chǔ)到等號(hào)左邊的變量中。這會(huì)為動(dòng)態(tài)內(nèi)存需求節(jié)省存儲(chǔ)空間且使需要?jiǎng)?chuàng)建巨大的查找表變得更實(shí)際。注意include和define相似,沒有分號(hào)終止符,且如果你加了,編譯器會(huì)產(chǎn)生奇怪的錯(cuò)誤信息。這使程序員可以訪問一個(gè)巨大的標(biāo)準(zhǔn)C庫(kù)(預(yù)定義函數(shù)集合)的集合。 // this is an error 類似地,包含一個(gè)等號(hào)通常也會(huì)在進(jìn)一步的頁(yè)面引發(fā)奇怪的編譯錯(cuò)誤。如果你加了一個(gè),編譯器將會(huì)在進(jìn)一步的頁(yè)面引發(fā)奇怪的錯(cuò)誤。Arduino宏定義與C宏定義有同樣的語(yǔ)法語(yǔ)法define constantName value 注意‘’是必須的示例:define ledPin 3// 編譯器在編譯時(shí)會(huì)將任何提及l(fā)edPin的地方替換成數(shù)值3。那樣的話該文本將被替換成被定義的數(shù)字(或文本)。編譯器在編譯時(shí)會(huì)將這些常量引用替換為定義的值。definedefine 宏定義宏定義是一個(gè)有用的C組件,它允許程序員在程序編譯前給常量取一個(gè)名字。這不是把這些行從程序中移除,而是把它們放到注釋中,所以編譯器就會(huì)忽略它們。此斜線后的任何內(nèi)容都是注釋 //直到該行的結(jié)尾 /* 這是多行注釋 用它來(lái)注釋掉整個(gè)代碼塊if (gwb == 0){ //在多行注釋中使用單行注釋是沒有問題的x = 3。標(biāo)記一行為注釋只有兩種方式:示例 x = 5。他們會(huì)被編譯器忽略,而不會(huì)輸出到控制器,所以它們不會(huì)占用Atmega芯片上的任何空間。 termination condition。大括號(hào)的主要用法//函數(shù) void myfunction(datatype argument){ statements(s) } //循環(huán) while (boolean expression) { statement(s) } do { statement(s) } while (boolean expression)。不平衡的大括號(hào)常常導(dǎo)致古怪的,難以理解的編譯器錯(cuò)誤,有時(shí)在大型程序中很難查出。然后在大括號(hào)之間插入一些回車符,接著開始插入語(yǔ)句。畢竟,用同樣的大括號(hào)在子例程(函數(shù))中替換RETURN語(yǔ)句,在條件語(yǔ)句中替換ENDIF語(yǔ)句和在FOR循環(huán)中替換NEXT語(yǔ)句。目前此功能有些許錯(cuò)誤,因?yàn)镮DE經(jīng)常在文本中(錯(cuò)誤地)發(fā)現(xiàn)一個(gè)已經(jīng)被注釋掉的大括號(hào)。Arduino IDE(集成開發(fā)環(huán)境)包含一個(gè)方便的特性以檢驗(yàn)平衡大括號(hào)。一個(gè)左大括號(hào)必須有一個(gè)右大括號(hào)跟在后面。大括號(hào)大括號(hào)(又稱括弧或花括號(hào))是C語(yǔ)言的主要組成部分。如果出現(xiàn)一個(gè)不可理喻的或看起來(lái)不合邏輯的錯(cuò)誤,其中一個(gè)首先要做的事就是檢查分號(hào)丟失。提示忘記在一行的末尾加一個(gè)分號(hào)將產(chǎn)生一個(gè)編譯器錯(cuò)誤。} // 其它語(yǔ)句。 b 255。 g 1。 r 255。其中之一就是從一個(gè)很深的循環(huán)嵌套中跳出去,或者是if邏輯塊,在某人些條件下。許多程序員不贊成使用goto的原因是,無(wú)節(jié)制地使用goto語(yǔ)句很容易產(chǎn)生執(zhí)行流混亂的很難被調(diào)試程序。// 這里是功能不正常的代碼// 這里的代碼永遠(yuǎn)也不會(huì)執(zhí)行}goto在程序中轉(zhuǎn)移程序流到一個(gè)標(biāo)記點(diǎn)語(yǔ)法:label: goto label。 }}return 關(guān)鍵字對(duì)測(cè)試一段代碼很方便,不需“注釋掉”大段的可能是錯(cuò)誤的代碼。 // both forms are valid 參數(shù): value: 任何類型的變量或常量示例://一個(gè)函數(shù),用于對(duì)