<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                【59.1 #define作用和書寫格式。】 上一節講const的時候,講到了當某個常量在程序中是屬于需要頻繁更改的“閥值”的時候,用const就可以提供“一鍵更改”的快捷服務。本節的#define也具有此功能,而且功能比const更加強大靈活,它除了可以應用在常量,還可以應用在運算式以及函數的“一鍵更改”中。所謂“一鍵更改”,其實是說,#define內含了“替換”的功能,此“替換”跟word辦公軟件的“替換”功能幾乎是一模一樣的。#define的“替換”功能,除了在某些場合起到“一鍵更改”的作用,還可以在某些場合,把一些在字符命名上不方便閱讀理解的常量、運算式或函數先“替換”成容易理解的字符串,讓程序閱讀起來更加清晰更加方便維護。#define的常見三種書寫格式如下: \#define 字符串 常量 //注意,這里后面沒有分號“;” \#define 字符串 運算式 //注意,這里后面沒有分號“;” \#define 字符串 函數 //注意,這里后面沒有分號“;” 具體一點如下: \#define AA 1 //常量 \#define BB (a+b+c) //運算式 \#define C add() //函數 需要注意的時候,#define后面沒有分號“;”,因為它是C語言中的“預處理”的語句,不是單片機運行的程序指令語句。 【59.2 #define的編譯機制。】 \#define是屬于“預編譯”的指令,所謂“預編譯”就是在“編譯”之前就開始的準備工作。編譯器在正式編譯某個源代碼的時候,先進行“預編譯”的準備工作,對于#define語句,編譯器是直接把#define要替換的內容先在“編輯層面”進行機械化替換,這個“機械化替換”純粹是字符串的替換,可以理解成word辦公軟件的“替換”編輯功能。比如以下程序: \#define A 3 \#define B (2+6) //有括號 \#define C 2+6 //無括號 unsigned long x=3; unsigned long a; unsigned long b; unsigned long c; void main() //主函數 { a=x\*A; b=x\*B; c=x\*C; while(1) { } } 經過編譯器“預編譯”的“機械化替換”后,等效于以下代碼: unsigned long x=3; unsigned long a; unsigned long b; unsigned long c; void main() //主函數 { a=x\*3; b=x\*(2+6); c=x\*2+6; while(1) { } } 【59.3 #define在常量上的“一鍵替換”功能。】 上一節講const(或code)的時候,舉了一個“閥值”常量的例子,這個例子可以用#define來替換等效。比如,原來const(或code)的例子如下: code unsigned char Cu8Level=90; //需要調整“閥值”時,只需更改一次這里的“90”這個數值。 unsigned char a; unsigned char b; void main() //主函數 { if(89>=Cu8Level) //大于或者等于閥值,就輸出1。 { a=1; } else //否則輸出0。 { a=0; } if(95>=Cu8Level) //大于或者等于閥值,就輸出1。 { b=1; } else //否則輸出0。 { b=0; } while(1) { } } 上述程序現在用#define來替換,等效如下: \#define Cu8Level 90 //需要調整“閥值”時,只需更改一次這里的“90”這個數值。 unsigned char a; unsigned char b; void main() //主函數 { if(89>=Cu8Level) //大于或者等于閥值,就輸出1。 { a=1; } else //否則輸出0。 { a=0; } if(95>=Cu8Level) //大于或者等于閥值,就輸出1。 { b=1; } else //否則輸出0。 { b=0; } while(1) { } } 【59.4 #define在運算式上的“一鍵替換”功能。】 \#define在運算式上應用的時候,有一個地方要特別注意,就是必須加小括號“()”,否則容易出錯。因為#define的替換是很“機械呆板”的,它只管“字符編輯層面”的機械化替換,舉一個例子如下: \#define B (2+6) //有括號 \#define C 2+6 //無括號 unsigned long x=3; unsigned long b; unsigned long c; void main() //主函數 { b=x\*B; //等效于b=x\*(2+6),最終運算結果b等于24。因為3乘以8(2加上6等于8)。 c=x\*C; //等效于c=x\*2+6, 最終運算結果c等于12。因為3乘以2等于6,6再加6等于12。 while(1) { } } 上述例子中,“有括號”與“沒括號”的運算結果差別很大,第一個是24,第二個是12。具體的分析已經在源代碼的注釋了。 【59.5 #define在函數上的“一鍵替換”功能。】 \#define的應用很廣,也可以應用在函數的“替換”上。例子如下: void add(void); //函數的聲明。 void add(void) //函數的定義。 { a++; } \#define a\_zi\_jia add() //用字符串a\_zi\_jia來替代函數add()。 unsigned long a=1; void main() //主函數 { a\_zi\_jia; //這里相當于調用函數add()。 while(1) { } } 【59.6 #define在常量后面添加U或者L的特殊寫法。】 有些初學者今后可能在工作中遇到#define以下這種寫法: \#define 字符串 常量U \#define 字符串 常量L 具體一點如下: \#define AA 6U \#define BB 6L 常量加后綴“U”或者“L”有什么含義呢?字面上理解,U表示該常量是無符號整型unsigned int;L表示該常量是長整型long。但是在實際應用中這樣“多此一舉”地去強調某個常量的數據類型有什么意義呢?我自己私下也做了一些測試,目前我本人暫時還沒有發現這個秘密的答案。所以對于這個問題,初學者現在只要知道這種寫法在語法上是合法的就可以,至于它背后有什么玄機,有待大家今后更深的發掘。 【59.7 #define省略常量的特殊寫法。】 有些初學者今后在多文件編程中,在某些頭文件.h中,會經常遇到以下這類代碼: \#ifndef \_AAA\_ \#define \_AAA\_ \#endif 其中第2行代碼“#define \_AAA\_”后面居然沒有常量,這樣子的寫法也行,到底是什么意思?在這類寫法中,當字符串“\_AAA\_”后面省略了常量的時候,編譯器默認會給\_AAA\_添加一個“非0”的常量,也許是1或者其它“非0”的值,多說一句,所謂“非0”值就是“肯定不是0”。上述代碼等效于: \#ifndef \_AAA\_ \#define \_AAA\_ 1 //編譯器會在這類默認添加一個1或者其它“非0”的常量 \#endif 這個知識點大家只要先有一個感性的認識即可,暫時不用深入了解。 【59.8 例程練習和分析。】 現在編一個練習程序來熟悉#define的用法。 /\*---C語言學習區域的開始。-----------------------------------------------\*/ //第1個:常量的例子 #define Cu8Level 90 //需要調整“閥值”時,只需更改一次這里的“90”這個數值。 unsigned char a; unsigned char b; //第2個:運算式的例子 \#define C (2+6) //有括號 \#define D 2+6 //無括號 unsigned char x=3; unsigned char c; unsigned char d; //第3個:函數的例子 unsigned char e=1; void add(void); void add(void) { e++; } #define a\_zi\_jia add() //用字符串a\_zi\_jia來替代函數add()。 void main() //主函數 { //第1個:常量的例子 if(89>=Cu8Level) //大于或者等于閥值,就輸出1。 { a=1; } else //否則輸出0。 { a=0; } if(95>=Cu8Level) //大于或者等于閥值,就輸出1。 { b=1; } else //否則輸出0。 { b=0; } //第2個:運算式的例子 c=x\*C; //等效于c=x\*(2+6),最終運算結果c等于24。因為3乘以8(2加上6等于8)。 d=x\*D; //等效于d=x\*2+6, 最終運算結果d等于12。因為3乘以2等于6,6再加6等于12。 //第3個:函數的例子 a\_zi\_jia; //這里相當于調用函數add()。e從1自加到2。 a\_zi\_jia; //這里相當于調用函數add()。e從2自加到3。 View(a); //把第1個數a發送到電腦端的串口助手軟件上觀察。 View(b); //把第2個數b發送到電腦端的串口助手軟件上觀察。 View(c); //把第3個數c發送到電腦端的串口助手軟件上觀察。 View(d); //把第4個數d發送到電腦端的串口助手軟件上觀察。 View(e); //把第5個數e發送到電腦端的串口助手軟件上觀察。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:0 十六進制:0 二進制:0 第2個數 十進制:1 十六進制:1 二進制:1 第3個數 十進制:24 十六進制:18 二進制:11000 第4個數 十進制:12 十六進制:C 二進制:1100 第5個數 十進制:3 十六進制:3 二進制:11 分析: a為0。 b為1。 c為24。 d為12。 e為3。 【59.9 如何在單片機上練習本章節C語言程序?】 直接復制前面章節中第十一節的模板程序,練習代碼時只需要更改“C語言學習區域”的代碼就可以了,其它部分的代碼不要動。編譯后,把程序下載進帶串口的51學習板,通過電腦端的串口助手軟件就可以觀察到不同的變量數值,詳細方法請看第十一節內容。
                  <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>

                              哎呀哎呀视频在线观看