




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Arduino 語法手冊摘自:Arduino的程序可以劃分為三個主要部分:結構、變量(變量與常量)、函數。結構部分setup()在Arduino中程序運行時將首先調用 setup() 函數。用于初始化變量、設置針腳的 輸出 輸入類型、配置串口、引入類庫文件等等。每次Arduino 上電或重啟后,setup 函數只運行一次。示例int buttonPin = 3;void setup()Serial.begin(9600);pinMode(buttonPin, INPUT); void 100Po/ .100po在setup()函數中初始化和定義了變量,然后執行100po 函數。顧名思義,該函數
2、在程序運行過程中不斷的循環, 根據一些反饋,相應改變執行情況。通過該函數動 態控制Arduino 主控板。示例int buttonPin = 3;/ setup中初始化串口和按鍵針腳.void setup()beginSeria1(9600);pinMode(buttonPin, INPUT);/ loop中每次都檢查按鈕,如果按鈕被按下,就發送信息到串口void 100Poif (digitalRead(buttonPin) = HIGH)serialWrite('H');elseserialWrite('L');de1ay(1000);結構控制ifif (條
3、件判斷語句)和=、!=、 (比較運算符)if語句與比較運算符一起用于檢測某個條件是否達成,如某輸入值是否在特定值之上等。if語句的語法是:if (someVariable 50)/執行某些語句本程序測試someVariable 變量的值是否大于 50。當大于50時,執行一些語句。換句話說,只要if 后面括號里的結果(稱之為測試表達式)為真,則執行大括號中的語句(稱之為執行語句塊);若為假,則跳過大括號中的語句。if 語句后的大括號可以省略。若省略大括號,則只有一條語句(以分號結尾)成為執行語句。if (x > 120) digitalWrite(LEDpin, HIGH);if (x &
4、gt; 120)digitalWrite(LEDpin, HIGH);if (x > 120) digitalWrite(LEDpin, HIGH); if (x > 120)digitalWrite(LEDpin1, HIGH);digitalWrite(LEDpin2, HIGH);/以上所有書寫方式都正確在小括號里求值的表達式,需要以下操作符:比較運算操作符:x = y (x 等于 y )x != y (x不等于y )x < y (x 小于 y)x > y (x 大于 y )x <= y (x小于等于y )x >= y (x大于等于y )警告:注意使用
5、賦值的值設為10 (將值10放入x變量的內存中)。兩個“二”表示的是 比較運算符運算符的情況(如 if (x = 10)。一個“二”表示的是賦值運算符,作 用是將x (如if (x = 10),用于測試x和10是否相等。后面這個語句只有 x 是10時才為真,而前面賦值的那個語句則永遠為真。這是因為C語言按以下規則進行運算if (x=10) : 10賦值給x (只要非0的數賦 值的語句,其賦值表達式的值永遠為真),因此 x現在值為100此時if 的測試 表達式值為10,該值永遠為真,因為非 0值永遠為真。所以,if (x = 10) 將永 遠為真,這就不是我們運行if 所期待的結果。另外,x被賦
6、值為10,這也不是我 們所期待的結果。if的另外一種分支條件控制結構是if.else 形式。ifelseif/else 是比if更為高級的流程控制語句,它可以進行多次條件測試。比如,檢測 模擬輸入的值,當它小于 500時該執行哪些操作,大于或等于500時執行另外的操作。代碼如下:if (pinFiveInput < 500)/ 執行A操作else/ 執行B操作else可以進行額外的if檢測,所以多個互斥的條件可以同時進行檢測。測試將一個一個進行下去,直到某個測試結果為真,此時該測試相關的執行語句塊將被運行,然后程序就跳過剩下的檢測,直接執行到if/else 的下一條語句。當所有檢測都為假
7、時,若存在 else語句塊,將執行默認的 else語句塊。注意else if 語句塊可以沒有else語句塊。else if分支語句的數量無限制if (pinFiveInput < 500)/ 執行A操作else if (pinFiveInput >= 1000)/ 執行B操作else/ 執行C操作另外一種進行多種條件分支判斷的語句是switch case 語句for描述for語句用于重復執行一段在花括號之內的代碼。通常使用一個增量計數器計數并終止循環。for語句用于重復性的操作非常有效,通常與數組結合起來使用來操作數據、引腳。for循環開頭有3個部分:(初始化;條件;增量計數)/語
8、句“初始化”只在循環開始執行一次。每次循環,都會檢測一次條件;如果條件為真, 則執行語句和“增量計數”,之后再檢測條件。當條件為假時,循環終止。例子/用PWMI腳將LED變暗int PWMpin = 10; 將一個LED與47Q電阻串聯接在 10腳void setup()/無需設置void 100Pofor (int i=0; i <= 255; i+)analogWrite(PWMpin, i);delay(10);編程提示C語言的for循環語句比BASIC和其他電腦編程語言的for語句更靈活。除了分號 以外,其他3個元素都能省略。同時,初始化,條件,增量計算可以是任何包括無 關變量的
9、有效C語句,任何C數據類型包括float 。這些不尋常的for語句可能會 解決一些困難的編程問題。例如,在增量計數中使用乘法可以得到一個等比數列:for(int x = 2; x < 100; x = x * 1.5)println(x);生成:2,3,4,6,9,13,19,28,42,63,94另一個例子,使用for循環使LED產生漸亮漸滅的效果:void 100Point x = 1;for (int i = 0; i > -1; i = i + x)ana1ogWrite(PWMpin, i);if (i = 255) x = -1;/在峰值轉變方向de1ay(10);sw
10、itch case和if語句相同,switch case通過程序員設定的在不同條件下執行的代碼控制程 序的流程。特別地,switch語句將變量值和case語句中設定的值進行比較。當一 個case語句中的設定值與變量值相同時,這條case語句將被執行。關鍵字break可用于退出switch語句,通常每條case語句都以break結尾。如果 沒有break語句,switch語句將會一直執行接下來的語句(一直向下)直到遇見一個break ,或者直到switch語句結尾。例子switch (var) case 1/當var等于1時,執行一些語句break;case 2/當var等于2時,執行一些語句b
11、reak;default:/如果沒有任何匹配,執行 default/default可有可不有語法switch (var) case label:/ 聲明break;case label:/ 聲明break;default:/ 聲明參數var:用于與下面的case中的標簽進行比較的變量值label:與變量進行比較的值while描述while循環會無限的循環,直到括號內的判斷語句變為假。必須要有能改變判斷語 句的東西,要不然 while循環將永遠不會結束。這在您的代碼表現為一個遞增的變 量,或一個外部條件,如傳感器的返回值。語法while(表達)/ 語句參數表達:為真或為假的一個計算結果例子var
12、 = 0;while(var < 200)/重復一件事200遍var+do. whiledo - while循環與while循環運行的方式是相近的,不過它的條件判斷是在每個循 環的最后,所以這個語句至少會被運行一次,然后才被結束。do/語句while (測試條件);例子dodelay (50) ;/等待傳感器穩定X = readSensors () ;/檢查傳感器取值while (X <100) ; / 當x小于100時,繼續運行breakbreak用于退出do, for , while循環,能繞過一般的判斷條件。它也能夠用于退出switch 語句 0例子for(x = 0; x
13、< 255; x +)digitalWrite(PWMpin, x);sens = analogRead(sensorPin);超出探測范圍if (sens > threshold) /x = 0;break;delay(50);continuecontinue語句跳過當前循環中剩余的迭代部分( do , for或while )。它通過檢 查循環條件表達式,并繼續進行任何后續迭代。例子for (x = 0; x < 255; x +)if (x > 40 && x < 120)/當x在40與120之間時,跳過后面兩句,即迭代。continue;di
14、gitalWrite(PWMpin, x);delay(50);return終止一個函數,如有返回值,將從此函數返回給調用函數語法:return;return value; /兩種形式均可參數value :任何變量或常量的類型例子:一個比較傳感器輸入閾值的函數int checkSensor()if (analogRead(O) > 400) return 1;elsereturn 0;return關鍵字可以很方便的測試一段代碼,而無需" comment out(注釋掉)”大段 的可能存在bug的代碼。void 100Po/寫入漂亮的代碼來測試這里。return;/剩下的功能異常
15、的程序/return后的代碼永遠不會被執行goto程序將會從程序中已有的標記點開始運行語法label:goto label; / 從label處開始運行提示不要在C語言中使用goto編程,某些C編程作者認為goto語句永遠是不必要的,但用得好,它可以簡化某些特定的程序。許多程序員不同意使用goto的原因是,??通過毫無節制地使用goto語句,很容易創建一個程序,這種程序擁有不確定的運行 流程,因而無法進行調試。的確在有的實例中goto語句可以派上用場,并簡化代碼。例如在一定的條件用if語句來跳出高度嵌入的for循環。例子for(byte r = 0; r < 255; r+)for(by
16、te g = 255; g > -1; g-)for(byte b = 0; b < 255; b+)if (analogRead(0) > 250)goto bailout;/ 更多的語句bailout:擴展語法;(分號)用于表示一句代碼的結束。例子:int a = 13;提示在每一行忘記使用分號作為結尾,將導致一個編譯錯誤。錯誤提示可能會清晰的指 向缺少分號的那行,也可能不會。如果彈出一個令人費解或看似不合邏輯的編譯器 錯誤,第一件事就是在錯誤附近檢查是否缺少分號。(花括號)大括號(也稱為“括號”或“大括號”)是C編程語言中的一個重要組成部分。它們被用來區分幾個不同的結構
17、,下面列出的,有時可能使初學者混亂。左大括號“ ”必須與一個右大括號“ ”形成閉合。這是一個常常被稱為括號平衡 的條件。在Arduino IDE (集成開發環境)中有一個方便的功能來檢查大括號是否 平衡。只需選擇一個括號,甚至單擊緊接括號的插入點,就能知道這個括號的“伴 侶括號”。目前此功能稍微有些錯誤,因為IDE會經常會認為在注釋中的括號是不正確的。對于初學者,以及由BASIC語言轉向學習C語言的程序員,經常不清楚如何使用括 號。畢竟,大括號還會在“return函數”、“ endif條件句”以及“loop函數”中被使用到。由于大括號被用在不同的地方,這有一種很好的編程習慣以避免錯誤:輸入一個
18、大 括號后,同時也輸入另一個大括號以達到平衡。然后在你的括號之間輸入回車,然 后再插入語句。這樣一來,你的括號就不會變得不平衡了。不平衡的括號常可導致許多錯誤,比如令人費解的編譯器錯誤,有時很難在一個程序找到這個錯誤。由于其不同的用法,括號也是一個程序中非常重要的語法,如果括號發生錯誤,往往會極大地影響了程序的意義。大括號中的主要用途功能void myfunction(datatype argument)statements(s)循環while (boolean expression)statement(s)dostatement(s)while (boolean expression);fo
19、r (initialisation; termination condition; incrementing expr)statement(s)條件語句if (boolean expression)statement(s)else if (boolean expression)statement(s)elsestatement(s)/ (單行注釋)Comments (注釋)注釋用于提醒自己或他人程序是如何工作的。它們會被編譯器忽略掉,也不會傳送給處理器,所以它們在Atmega芯片上不占用體積。注釋的唯一作用就是使你自己理解或幫你回憶你的程序是怎么工作的或提醒他人你的程序是如何工作的。編寫注釋
20、有兩種寫法:例子x = 5; 這是一條注釋斜杠后面本行內的所有東西是注釋/*這是多行注釋-用于注釋一段代碼if (gwb = 0) /在多行注釋內可使用單行注釋x = 3;/*但不允許使用新的多行注釋-這是無效的/別忘了注釋的結尾符號-它們是成對出現的!*/小提示當測試代碼的時候,注釋掉一段可能有問題的代碼是非常有效的方法。這能使這段 代碼成為注釋而保留在程序中,而編譯器能忽略它們。這個方法用于尋找問題代碼 或當編譯器提示出錯或錯誤很隱蔽時很有效。/* */ (多行注釋)Comments (注釋)注釋用于提醒自己或他人程序是如何工作的。它們會被編譯器忽略掉,也不會傳送 給處理器,所以它們在At
21、mega芯片上不占用體積。注釋的唯一作用就是使你自己理 解或幫你回憶你的程序是怎么工作的或提醒他人你的程序是如何工作的。編寫注釋 有兩種寫法:例子x = 5; 這是一條注釋斜杠后面本行內的所有東西是注釋/*這是多行注釋-用于注釋一段代碼if (gwb = 0) /在多行注釋內可使用單行注釋x = 3;/*但不允許使用新的多行注釋-這是無效的/別忘了注釋的結尾符號-它們是成對出現的!*/小提示當測試代碼的時候,注釋掉一段可能有問題的代碼是非常有效的方法。這能使這段 代碼成為注釋而保留在程序中,而編譯器能忽略它們。這個方法用于尋找問題代碼 或當編譯器提示出錯或錯誤很隱蔽時很有效。#define#d
22、efine是一個很有用的C語法,它允許程序員在程序編譯之前給常量命名。在 Arduino中,定義的常量不會占用芯片上的任何程序內存空間。在編譯時編譯器會 用事先定義的值來取代這些常量。然而這樣做會產生一些副作用,例如,一個已被定義的常量名已經包含在了其他常 量名或者變量名中。在這種情況下,文本將被# defined定義的數字或文本所取代。通常情況下,優先考慮使用const關鍵字替代#define 來定義常量。Arduino擁有和C相同的語法規范:語法#define 常量名 常量值注意,#是必須的。例子#define ledPin 3/在編譯時,編譯器將使用數值3取代任何用到ledPin 的地方
23、。提示在#6仙6聲明后不能有分號。如果存在分號,編譯器會拋出語義不明的錯誤,甚 至關閉頁面。#define ledPin 3; /這是一種錯誤寫法類似的,在#define聲明中包含等號也會產生語義不明的編譯錯誤從而導致關閉頁 面。#define ledPin = 3 /這是一種錯誤寫法#include#include用于調用程序以外的庫。這使得程序能夠訪問大量標準C庫,也能訪問用于arduino的庫。AVR C庫(Arduino基于AVR標準語法)語法手冊請點擊這里。注意#include和#6的6 一樣,不能在結尾加分號,如果你加了分號編譯器將會報錯。例子此例包含了一個庫,用于將數據存放在fl
24、ash空間內而不是ram內。這為動態內存節約了空間,大型表格查表更容易實現#include <avr/pgmspace.h>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語言中,單等號被稱為賦值運算符,它與數學上的等號含義不同,賦值運算符告訴單片機,將等號的右邊的數值或計算表達式的結果,存儲在等號左邊的變量中。例
25、子:int sensVal; 聲明一個名為sensVal的整型變量senVal = analogRead (0) ; / 將模擬引腳0的輸入電壓存儲在 SensVal變量中編程技巧:要確保賦值運算符(=符號)左側的變量能夠儲存右邊的數值。如果沒有大到足以容 納右邊的值,存儲在變量中的值將會發生錯誤。不要混淆賦值運算符=(單等號)與比較運算符=(雙等號),認為這兩個表達 式是相等的。+ (加)-(減)* (乘)/ (除)加,減,乘,除描述這些運算符返回兩個操作數的和,差,乘積,商.這些運算是根據操作數的數據類型來計算的,比如9和4都是int類型,所以9 / 4 結果是2.這也就代表如果運算結果比
26、數據類型所能容納的范圍要大的話,就會出現溢出.(例如.1加上一個整數int類型32,767結果變成-32,768). 如果操作數是不同類型的,結果是“更大”的那種 數據類型.如果操作數中的其中一個是 float類型或者double類型,就變成了浮 點數運算.例子y = y + 3;x = x - 7;i = j * 6;r = r / 5;Syntaxresult = valuel + value2;result = value1 - value2;result = value1 * value2;result = valuel / value2;Parameters:valuel: 任何常量
27、或者變量 value2:任何常量或者變量編程小提示:整型常量的默認值是int類型,所以一些整型常量(定義中)的計算會導致溢出.(比 如:60 * 1000會得到一個負數結果.那么if(60*1000 > 0) ,if得到的是一個false 值.在選擇變量的數據類型時,一定要保證變量類型的范圍要足夠大,以至于能容納下你 的運算結果.要知道你的變量在哪個點會“翻身”,兩個方向上都得注意.如:(0 - 1) 或(0 -32768)一些數學上的分數處理,要用浮點數,但其缺點是:占用字節長度大,運算速度慢.使用類型轉換符,例如(int)myFloat將一個變量強制轉換為int類型.% (模)描述一
28、個整數除以另一個數,其余數稱為模。它有助于保持一個變量在一個特定的范圍(例如數組的大小)0語法結果=被除數%除數參數被除數:一個被除的數字除數:一個數字用于除以其他數返回余數(模)舉例X = 7%5; X 為 2X = 9% 5 ; X 為 4X = 5% 5 ; X 為 0X = 4 %5; / X 為 4示例代碼/*通過循環計算1到10的模*/int values10;int i = 0;void setup () void 100Povalues i = analogRead (0);i =(i + 1 ) %10; 取模運算提示模運算符對浮點數不起作用。比較運算符=(等于)!=(不等于
29、)> (小于)> (大于)> =(小于等于)> =(大于等于)if (條件判斷語句)和=、!=、<、> (比較運算符)if語句與比較運算符一起用于檢測某個條件是否達成,如某輸入值是否在特定值之上等。if語句的語法是:if (someVariable > 50)/ 執行某些語句本程序測試someVariable 變量的值是否大于 50。當大于50時,執行一些語句。換句話說,只要if 后面括號里的結果(稱之為測試表達式)為真,則執行大括號中的語句(稱之為執行語句塊);若為假,則跳過大括號中的語句。if 語句后的大括號可以省略。若省略大括號,則只有一條語句(
30、以分號結尾)成為執行語句。if (x > 120) digitalWrite(LEDpin, HIGH);if (x > 120)digitalWrite(LEDpin, HIGH);if (x > 120) digitalWrite(LEDpin, HIGH); if (x > 120)digitalWrite(LEDpin1, HIGH);digitalWrite(LEDpin2, HIGH);/以上所有書寫方式都正確在小括號里求值的表達式,需要以下操作符:比較運算操作符:x = y (x 等于 y )x != y (x不等于y )x < y (x 小于 y
31、)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現在值為100此時if 的測試 表達式值為10,該值永遠為真
32、,因為非 0值永遠為真。所以,if (x = 10) 將永 遠為真,這就不是我們運行if 所期待的結果。另外,x被賦值為10,這也不是我 們所期待的結果。if的另外一種分支條件控制結構是if.else 形式。布爾運算符&& (與)| (或)!(非)這些運算符可以用于if條件句中。&& (邏輯與)只有兩個運算對象為“真”,才為“真”,如:讀取兩個開關if (digitalRead(2) = HIGH && digitalRead(3) = HIGH) /的電平/ .如果當兩個輸入都為高電平,則為“真”。| (邏輯或)只要一個運算對象為“真”,就為“
33、真”,如:if (x > 0 | y > 0) / .如果x或y是大于0,則為“真”。!(邏輯非)如果運算對象為“假”,則為“真”,例如if (!x) / .如果x為“假”,則為真(即如果 x等于0) o警告千萬不要誤以為,符號為&(單符號)的位運算符"與“就是布爾運算符的“與”符號為&& (雙符號)。他們是完全不同的符號。同樣,不要混淆布爾運算符| (雙豎)與位運算符“或"符號為| (單豎)。位運算符?(波浪號)看起來與布爾運算符not有很大的差別!(正如程序員說:“驚 嘆號”或“ bang”),但你還是要確定哪一個運算符是你想要的。舉
34、例if (a >= 10 && a <= 20) /如果a的值在10至20之間,則為“真”指針運算符*取消引用運算符&引用運算符指針運算符& (取地址)and * ( 取地址所指的值)指針對C語言初學者來說是一個比較復雜的內容,但是編寫大部分arduino代碼時可以不用涉及到指針。然而,操作某些數據結構時,使用指針能夠簡化代碼,但是指針的操作知識很難在工具書中找到。位運算符& (bitwise and)| (bitwise or)A (bitwise xor)Bitwise AND (&), Bitwise OR (|), Bitwi
35、se XOR)按位與(&)按位操作符對變量進行位級別的計算。它們能解決很多常見的編程問題。下面的材料大多來自這個非常棒的按位運算指導。說明和語法下面是所有的運算符的說明和語法。進一步的詳細資料,可參考教程。按位與(&)位操作符與在C + +中是一個&符,用在兩個整型變量之間。按位與運算符對兩側的變量的每一位都進行運算,規則是:如果兩個運算元都是1,則結果為1,否則輸出0.另一種表達方式:0 0 11 運算元10 1 01 運算元20 0 0 1(運算元1&運算元2)-返回結果在Arduino中,int類型為16位,所以在兩個int表達式之間使用 娛進行16個并行
36、按位與計算。代碼片段就像這樣:int a = 92; /二進制:0000000001011100int b = 101; /二進制:0000000001100101int c = a & b; /結果:0000000001000100,或 10 進制的 68a和b的16位每位都進行按位與計算,計算結果存在c中,二進制結果是01000100, 十進制結果是68.按位與最常見的作用是從整型變量中選取特定的位,也就是屏蔽。見下方的例子。按位或(| ) 按位或操作符在C+”是。和&操作符類似,|操作符對兩個變量的為一位都進行運 算,只是運算規則不同。按位或規則:只要兩個位有一個為1則結
37、果為1,否則為0 換句話說:0 0 11 運算元10 1 01 運算元20 1 1 1 (運算元1 |運算元2)-返回的結果這里是一個按位或運算在C + +代碼片段:int a = 92; /int b = 101; /int c = a | b; /示例程序二進制:0000000001011100二進制:0000000001100101結果:0000000001111101,或十進制的125按位與和按位或運算常用于端口的讀取-修改-寫入。在微控制器中,一個端口是一個8位數字,它用于表示引腳狀態。對端口進行寫入能同時操作所有引腳。PORT遢一個內置的常數,是指 0,1,2,3,4,5,6,7數
38、字引腳的輸出狀態。如果某一位為1,著對應管腳為HIGH (此引腳需要先用pinMode()命令設置為輸出)因此 如果我們這樣寫,PORTD=B00110001則弓I腳2、3、7狀態為HIGH這里有個小陷阱,我們可能同時更改了引腳 0、1的狀態,引腳0、1是Arduino串行通信端口, 因此我們可能會干擾通信。我們的算法的程序是:讀取PORTf用按位與清除我們想要控制的引腳用按位或對PORT歸口新的值進行運算int i; / 計數器int j;void setup()DDRD = DDRD |; / 設置引腳 27 的方向,0、1 腳不變(xx|00=xx)/效果和pinMode(pin,OUT
39、PUT)設置27腳為輸出一樣serial.begin(9600);void loop () for (i=0; i<64; i+)PORTD = PORTD & B00000011; / 清除 27 位,0、1 保持不變(xx & 11 = xx )j = (i << 2);/將變量左移為 27腳,避免0、1腳PORTD = PORTD | j;/將新狀態和原端口狀態結合以控制 LED腳輸出掩蓋以便調試Serial.println(PORTD, BIN); delay(100);按位異或(八)位異或操作符用A'C+”有一個不常見的操作符叫按位異或,也叫
40、做XOR(通常讀作" eks-or ”)。按表示。此操作符和按位或(| )很相似,區別是如果兩個位都為1則結果為0:運算元1運算元2(運算元1八運算元2)-返回的結果按位異或的另一種解釋是如果兩個位值相同則結果為0,否則為1。F面是一個簡單的代碼示例:int x =二 12;/二進制:1100int y =二 10;/二進制:1010int z =二 X A y; /二進制:0110, 或十進制6/ Blink_Pin_5/演示“異或”void setup()DDRD = DDRD | B00100000; / / 設置數字腳 5設置為輸出serial.begin(9600);voi
41、d loop () PORTD = PORTD A B00100000; / 反轉第5位(數字腳5),其他保持不變 delay(100);(bitwise not)按位取反()按位取反在C+ +語言中是波浪號。與& (按位與)和| (按位或)不同,按位取反使用在一個操作數的右側。按位取反將操作數改變為它的“反面”:0變為1, 1變成0o例如:0 1 operandl1 0 operandlint a = 103; /二進制:0000000001100111你可能會驚訝地看到結果為像-104這樣的數字。這是因為整數型變量的最高位,即 所謂的符號位。如果最高位是1,這個數字將變為負數。這個
42、正數和負數的編碼被稱為補。想了解更多信息,請參考 Wikipedia文章two's complement.順便說一句,有趣的是,要注意對于任何整數型操作數X, ?X和-X-1是相同的。有時,對帶有符號的整數型操作數進行位操作可以造成一些不必要的意外。<< (bitshift left)>> (bitshift right)bitshift left (<<), bitshift right (>>)描述出自Playground的The Bitmath Tutorial 在C+鋪言中有兩個移位運算符:左移 位運算符(?)和右移運算符(?)。
43、這些操作符可使左運算元中的某些位移動右運 算元中指定的位數。想了解有關位的更多信息可以點擊這里。語法variable ? number_of_bits variable ? number_of_bits參數variable - (byte, int, long) number_of_bits integer ? 32例子int a = 5;/int b = a << 3; /int c = b >> 3; /二進制數:0000000000000101二進制數:0000000000101000, 或十進制數:40二進制數:0000000000000101, 或者說回到開始
44、時的 5當你將x左移y位時(x?y) , x中最左邊的y位會逐個逐個的丟失:int a = 5;/二進制:0000000000000101int b = a << 14;如果你確定位移不會引起數據溢出,你可以簡單的把左移運算當做對左運算元進行2的右運算元次方的操作。例如,要產生 2的次方,可使用下面的方式:1 << 0 = 11 << 1 = 21 << 2 = 41 << 3 = 8 1 << 8 = 2561 << 9 = 51210 << 1 = 1024 當你將x右移y位(x?y),如果x最
45、高位是1,位移結果將取決于x的數據類型。如 果x是int類型,最高位為符號位,確定是否x是負數或不是,正如我們上面的討論。如果x類型為int ,則最高位是符號位,正如我們以前討論過,符號位表示 x 是正還是負。在這種情況下,由于深奧的歷史原因,符號位被復制到較低位:X = -16;Y = X >> 3這種結果,被稱為符號擴展,往往不是你想要的行為。你可能希望左邊被移入的數 是00右移操作對無符號整型來說會有不同結果,你可以通過數據強制轉換改變從 左邊移入的數據:X = -16;int y = (unsigned int)x >> 3;如果你能小心的避免符號擴展問題,你可以將右移操作當做對數據除2運算。例如:INT = 1000;Y = X >> 3; 8 1000 /1000 整除 8,使 y=125復合運算符+ (increment)(decrement)+ (increment) /
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 挖掘教育大數據的潛力洞悉學生內心世界與成長軌跡
- 教育資源均衡分配的新思路在線教育的應用與實踐
- 智慧城市的網絡空間安全與隱私保護研究
- 幼兒教育中游戲化教育的策略與技巧
- 空壓機油培訓課件
- 抖音商戶直播樣品展示順序管理制度
- 抖音商戶商品拍攝燈光布設執行制度
- BRD4-ligand-7-生命科學試劑-MCE
- 廣西貴港市平南縣2025屆化學九上期末達標檢測試題含解析
- 2024-2025學年廣東省陽江市東平中學化學九年級第一學期期末經典試題含解析
- 淹溺診療規范內科學診療規范診療指南2023版
- PremiereProCC視頻剪輯基礎教程PPT完整版全套教學課件
- 新教材北師大版高中英語選擇性必修第一冊全冊各單元學案(單詞短語句型寫作等知識點匯總)
- 鍍鋅板國家新標準規定
- 《電工學》“課程思政”教學設計案例
- 數字時代的商務英語寫作知到章節答案智慧樹2023年對外經濟貿易大學
- 檢驗科溝通技巧及其它
- 2022年安徽大學科研助理(校聘)招聘60人筆試備考題庫及答案解析
- 四年級閱讀訓練概括文章主要內容(完美)
- YY/T 0995-2015人類輔助生殖技術用醫療器械術語和定義
- GB/T 19352.1-2003熱噴涂熱噴涂結構的質量要求第1部分:選擇和使用指南
評論
0/150
提交評論