<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 第十二節:變量的定義和賦值 ## 【12.1 學習 C 語言的建議和方法】 先提一些學 C 語言的建議和方法,幫大家刪繁就簡,去掉一些初學者常見的思想包袱。現階段我們的學習是使用單片機,把單片機當做一個成品,把單片機當做一個忠誠的士兵,學習 C 語言就是學習如何使用單片機,如何命令單片機,如何讓單片機聽懂我們的話并且聽我們指揮。單片機內部太細節的構造原理暫時不用過多去關注,只要知道跟我們使用相關的幾個特征就可以,這樣初學者的學習包袱就沒有那么重,就可以把重點放在使用上的,而不是好奇于根本原理的死磕到底。學 C 語言跟學習英語的性質是一樣的,都是在學習一門外語,只是 C 語言比英語的語法要簡單很多,非常容易上手,詞匯量也沒有英語那么多,C 語言常用單詞才幾十個而已。學習任何一門語言的秘訣在于練習,學習 C 語言的秘訣是多在單片機上練習編程。本教程后面幾乎每個章節都有例程,這個例程很重要,初學者即使看懂了,我也強烈建議要把 “C 語言學習區域” 的那部分代碼親自上機敲鍵盤練習一遍,并且看看實驗現象是否如你所愿。 ## 【12.2 變量定義和賦值的感性認識】 這些年我用過很多單片機,比如 51,PIC,LPC17 系列,STM8,STM32 等單片機。盡管各類單片機有一些差異,但是在選單片機時有 3 個參數我們一定會關注的,它們分別是:工作頻率,數據存儲器 RAM,程序存儲器 ROM。工作頻率跟晶振和倍頻有關,決定了每條指令所要損耗的時間,從而決定了運算速度。RAM 跟代碼里所定義變量的數量有關。ROM 跟程序代碼量的大小有關。程序是什么?程序就是由對象和行為兩者構成的。對象就是變量,就是變量的定義,就是 RAM,RAM 的大小決定了一個程序允許的對象數量。行為就是賦值,判斷,跳轉,運算等語法,就是 ROM,ROM 的大小決定了一個程序允許的行為程度。本節的標題是 “變量的定義和賦值”,其中 “定義” 就是對象,“賦值” 就是行為。 ## 【12.3 變量的定義】 變量的定義。一個程序最大允許有多少個對象,是由 RAM 的字節數決定的 (字節是一種單位,后面章節會講到)。本教程的編譯環境是以 AT89C52 芯片為準,AT89C52 這個單片機有 256 個字節的 RAM,但是并不意味著程序就一定要全部占用這些 RAM。程序需要占用多少 RAM,完全是根據程序的實際情況來決定,需要多少就申請多少。這里的 “對象” 就是變量,這里的 “申請” 就是變量的定義。 定義變量的關鍵字。常用有 3 種容量的變量,每種變量的取值范圍不一樣。第一種是 `unsigned char` 變量,取值范圍從 0 到 255,占用 RAM 一個字節,比喻成一房一廳。第二種是`unsigned int` 變量,取值范圍從 0 到 65535,占用 RAM 兩個字節,比喻成兩房一廳。第三種是 `unsigned long` 變量,取值范圍從 0 到 4294967295,占用 RAM 四個字節,比喻成四房一廳。`unsigned char`, `unsigned int` 和 `unsigned long` 都是定義變量的關鍵字,所謂關鍵字也可以看成是某門外語的單詞,需要大家記憶的,當然不用死記硬背,只要多上機練習就自然熟記于心,出口成章。多說一句,上述的變量范圍是針對本教程所用的單片機,當針對不同的單片機時上述變量的范圍可能會有一些小差異,比如在 STM32 單片機中,`unsigned int` 的字節數就不是兩個字節,而是四個字節,這些都是由所選的編譯器決定的,大家暫時有個初步了解就可以。 定義變量的語法格式。定義變量的語法格式由 3 部分組成:關鍵字、變量名、分號。比如: ` unsigned char a; ` 其中 unsigned char 就是關鍵字,a 就是變量名,分號 `;` 就是一條語句的結束符號。 變量名的命名規則。變量名的第一個字符不能是數字,必須是字母或者下劃線,字母或者下劃線后面可以帶數字,一個變量名之間的字符不能帶空格,兩個獨立變量名之間也不能用空格隔開(但是兩個獨立變量名之間可以用逗號隔開)。變量名不能跟編譯器已征用的關鍵字重名,不能跟函數名重名,這個現象跟古代要求臣民避諱皇帝的名字有點像。哪些名字是合法的,哪些名字是不合法的?現在舉一些例子說明: ```c unsigned char 3a; // 不合法,第一個字符不能是數字。 unsigned char char; // 不合法,char 是編譯器已征用的關鍵字。 unsigned char a b; // 不合法,ab 是一個變量名,a 與 b 的中間不能有空格。 unsigned char a,b; // 合法,a 和 b 分別是一個獨立的變量名,a 與 b 的中間可以用逗號隔開。 unsigned char a; // 合法。 unsigned char abc; // 合法。 unsigned char _ab; // 合法。 unsigned char _3ab; // 合法。 unsigned char a123; // 合法。 unsigned char a12ced; // 合法。 ``` 定義變量與 RAM 的內在關系。當我們定義一個變量時,相當于向單片機申請了一個 RAM 空間。C 編譯器會自動為這個變量名分配一個 RAM 空間,每個字節的 RAM 空間都有一個固定唯一的地址。把每個字節的 RAM 空間比喻成房間,這個地址就是房號。地址是純數字編號,不利于我們記憶,C 語言編譯器為了降低我們的工作難度,不用我們記每個變量的地址,只需要記住這個變量的名稱就可以了。操作某個變量名,就相當于操作某個對應地址的 RAM 空間。變量名與對應地址 RAM 空間的映射關系是 C 編譯器暗中悄悄幫我們分配好的。比如: ```c unsigned char a; //a 占用一個字節的 RAM 空間,這個空間的地址由 C 編譯自動分配。 unsigned char b; //b 占用一個字節的 RAM 空間,這個空間的地址由 C 編譯自動分配。 unsigned char c; //c 占用一個字節的 RAM 空間,這個空間的地址由 C 編譯自動分配。 ``` 上述 a,b,c 三個變量各自占用一個字節的 RAM 空間,同時被 C 編譯器分配了 3 個不同的 RAM 空間地址。 變量定義的初始化。變量定義之后,等于被 C 編譯器分配了一個 RAM 空間,那么這個空間里面存儲的數據是什么?如果沒有刻意給它初始化,RAM 空間里面存儲的數據是不太確定的,是默認的。有些場合,需要在給變量分配 RAM 空間時就給它一個固定的初始值,這就是變量定義的初始化。變量初始化的語法格式由 3 部分組成:關鍵字,變量名賦值,分號。比如: ```c unsigned char a=9; ``` 其中 unsigned char 就是關鍵字。 其中 a = 9 就是變量名賦值。a 從被 C 編譯器分配 RAM 空間那一刻起,就默認是預存了一個 9 的數據。 分號 `;` 就是一條語句的結束符號。 ## 【12.4 變量的賦值】 賦值語句的含義。把右邊對象的內容復制一份給左邊對象。賦值語句有一個很重要的特性,就是覆蓋性,左邊對象原來的內容會被右邊對象復制過來的新內容所覆蓋。比如,左邊對象是變量 a,假設原來 a 里面存的數據是 3,右邊對象是數據 6,執行賦值語句后,會把右邊的 6 賦值給了對象 a,那么 a 原來的數據 3 就被覆蓋丟失了,變成了 6。 賦值語句的格式。賦值語句的語法格式由 4 部分組成:左邊對象,關鍵字,右邊對象,分號。比如: `a = b;` 其中 a 就是左邊對象。 其中 `=` 就是關鍵字。寫法跟我們平時用的等于號是一樣,但是在 C 語言里不是等于的意思,而是代表賦值的意思,它是代表中文含義的 “給”,而不是用于判斷的 “等于”,跟等于號是兩碼事(C 語言的等于號是 “==”,這個后面章節會講到)。 其中 b 就是右邊對象。 其中分號 `;` 代表一條語句的結束符。 賦值語句與 ROM 的關系。賦值語句是行為的一種,所以編譯會把賦值這個行為翻譯成對應的指令,這些指令在下載程序時最終也是以數據的形式存儲在 ROM 里,指令也是以字節為單位 (字節是一種單位,后面章節會講到)。本教程的編譯環境是以 AT89C52 芯片為準,AT89C52 這個單片機有 8K 的 ROM 容量,也就是有 8192 個字節的 ROM(8 乘以 1024 等于 8192),但是并不意味著程序就一定要全部占用這些 ROM。程序需要占用多少 ROM,完全是根據程序的行為程度決定,也就是通常所說的你的程序容量有多大,有多少行代碼。多說一句,在單片機或者我們常說的計算機領域里,存儲容量是以字節為單位,而每 K 之間的進制不是我們日常所用的 1000,而是 1024,所以剛才所說的 8K 不是 8000,而是 8192,這個是初學者很容易迷惑的地方。剛才提到,賦值語句是行為,凡是程序的行為指令都存儲在單片機的 ROM 區。C 編譯器會把一條賦值語句翻譯成對應的一條或者幾條機器碼,機器碼指令也是以字節為單位的。下載程序的時候,這些機器碼就會被下載進單片機的 ROM 區。比如以下這行賦值語句: ```c unsigned char a; unsigned char b = 3; a = b; ``` 經過 C 編譯器編譯后會生成以字節為單位的機器碼。這些機器碼記錄著這些信息:變量 a 的 RAM 地址,變量 b 的 RAM 地址和初始化時的預存數據 3,以及把 b 變量的內容賦值給 a 變量的這個行為。所有這些信息,不管是 “數據” 還是 “行為”,本質都是以 “數據”(或稱數字,數碼都可以)的形式存儲記錄的,單位是字節。 ## 【12.5 例程的分析和練習】 接下來練習一個程序實例。直接復制前面章節中第十一節的模板程序,練習代碼時只需要更改 “C 語言學習區域” 的代碼就可以了,其它部分的代碼不要動。編譯后,把程序下載進帶串口的 51 學習板,通過電腦端的串口助手軟件就可以觀察到不同的變量數值,詳細方法請看第十一節內容。本章節在 “C 語言學習區域” 練習的代碼如下: ```c /*---C語言學習區域的開始。-----------------------------------------------*/ void main() //主函數 { unsigned char a; //定義的變量a被分配了一個字節的RAM空間,保存的數據是不確定的默認值。 unsigned char b; //定義的變量b被分配了一個字節的RAM空間,保存的數據是不確定的默認值。 unsigned char c; //定義的變量c被分配了一個字節的RAM空間,保存的數據是不確定的默認值。 unsigned char d=9; //定義的變量d被分配了一個字節的RAM空間,保存的數據被初始化成9. b=3; //把3賦值給變量b,b由原來不確定的默認數據變成了3。 c=b; //把變量b的內容復制一份賦值給左邊的變量c,c從不確定的默認值變成了3。 View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 View(b); //把第2個數b發送到電腦端的串口助手軟件上觀察。 View(c); //把第3個數c發送到電腦端的串口助手軟件上觀察。 View(d); //把第4個數d發送到電腦端的串口助手軟件上觀察。 while(1) { } } /*---C語言學習區域的結束。-----------------------------------------------*/ ``` 在電腦串口助手軟件上觀察到的程序執行現象如下: > 開始... > 第1個數 > 十進制:255 > 十六進制:FF > 二進制:11111111 > 第2個數 > 十進制:3 > 十六進制:3 > 二進制:11 > 第3個數 > 十進制:3 > 十六進制:3 > 二進制:11 > 第4個數 > 十進制:9 > 十六進制:9 > 二進制:1001 分析: 第 1 個數 a 居然是 255,這個 255 從哪來?因為 a 我們一直沒有給它初始值,也沒有給它賦值,所以它是不確定的默認值,這個 255 就是所謂的不確定的默認值,是編譯器在定義變量 a 時分配的,帶有不確定的隨機性,不同的編譯器可能分配的默認值都會存在差異。根據我的經驗,unsigned char 類型定義的默認值往往是 0 或者 255(255 是十六進制的 0xff,十六進制的內容后續章節會講到)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看