在程序運(yùn)轉(zhuǎn)進(jìn)程中,其值不克不及被改動(dòng)的量稱之為常量。常量分為分歧的類型,有整型常量如 1、2、3、100;浮點(diǎn)型常量 3.14、0.56、-4.8;字符型常量a、b、0;字符串常量“a”、“abc”、“1234”、“1234abcd”等。
仔細(xì)的同窗會(huì)發(fā)現(xiàn),整型和浮點(diǎn)型常量我們直接寫的數(shù)字,而字符型常量用單引號(hào)來表現(xiàn)一個(gè)字符,用雙引號(hào)來表現(xiàn)一個(gè)字符串,特別人人要留意a和“a”是紛歧樣的,這個(gè)等會(huì)我們要具體引見。
常量普通有兩種表示方式:
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供隆陽企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、H5建站、小程序制作等業(yè)務(wù)。10年已為隆陽眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
直接常量:直接以值的方式表現(xiàn)的常量稱之為直接常量。上述舉例這些多是直接常量,直接寫出來了。
符號(hào)常量:用標(biāo)識(shí)符定名的常量稱之為符號(hào)常量,就是為下面的直接常量再取一個(gè)名字。運(yùn)用符號(hào)常量一是便利了解,進(jìn)步程序可讀性,更主要的是便利程序的后續(xù)保護(hù),習(xí)氣上符號(hào)常量我們都用大寫字母和下劃線來定名。
比方,我們可以把 3.14 取名為 PI(即π)。再比方,我們上節(jié)課的串口程序,我們用的波特率是 9600,假如用符號(hào)常量來停止提早聲明的話,那我們要修正成其它速度的話,就不必在程序中找 9600 修正了,直接修正聲明處就可以了,兩種辦法舉例闡明。用 const 聲明。比方我們?cè)诔绦蜷_端地位界說一個(gè)符號(hào)常量 BAUD。
界說方式是:
const 類型 符號(hào)常量名字=常量值;
如
const unsigned int BAUD = 9600; /*留意開頭有個(gè)分號(hào)*/
我們就可以在程序中直接把 9600 改成 BAUD,如許我們假如要改波特率的話,直接在程序掃尾地位改一下這個(gè)值就可以了。用預(yù)處置敕令#define 來完成,預(yù)處置敕令我們先來看法#define。
界說方式是:
#define 符號(hào)常量名 常量值
如
#define BAUD 9600 /*留意開頭沒有分號(hào)*/
如許界說今后,只需在程序中呈現(xiàn) BAUD 的話,意思就是完整替代了后邊的 9600 這個(gè)數(shù)字。
不知人人能否記得,我們之前界說數(shù)碼管真值表的時(shí)分,用了一個(gè) code 癥結(jié)字。
unsigned char code LedChar[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };
我們事先說加了 code 之后,這個(gè)真值表的數(shù)據(jù)只能被運(yùn)用,不克不及被改動(dòng),假如我們直接寫 LedChar[0] = 1;如許就錯(cuò)了。實(shí)踐上 code 這個(gè)癥結(jié)字是 51 單片機(jī)特有的,假如是其它類型的單片機(jī)我們只需求寫成 const unsigned char LedChar[]={}就可以了,主動(dòng)保管到 FLASH里,而 51 單片機(jī)只用 const 而不加 code 的話,這個(gè)數(shù)組會(huì)保管到 RAM 中,而不會(huì)保管到FLAHS 中,鑒于此,在 51 這集體系下,const 反倒變得不那么主要了,它的感化被 code 代替了,這里人人曉得這么回事即可。
我們來對(duì)各類類型的常量做進(jìn)一步闡明。
整型常量和浮點(diǎn)型常量就沒若干可說的了,之前我們使用的都很純熟了,整型直接寫數(shù)字就是十進(jìn)制如 128,前邊 0x 掃尾的表現(xiàn)是十六進(jìn)制 0x80,浮點(diǎn)型直接寫帶小數(shù)點(diǎn)的數(shù)據(jù)就可以了。
字符型常量是由一對(duì)單引號(hào)括起來的單個(gè)字符。它分為兩種方式,一種是通俗字符,一種是本義字符。
通俗字符就是那些我們可以直接書寫直接看到的無形的字符,比方阿拉伯?dāng)?shù)字 0~9,英文字符 A~z,以及標(biāo)點(diǎn)符號(hào)等。它們多是 ASCII 碼表中的字符,而它們?cè)趩纹瑱C(jī)中都占用一個(gè)字節(jié)的空間,其值就是對(duì)應(yīng)的 ASCII 碼值。比方a的值是 97,A的值是 65,0的值是48,假如界說一個(gè)變量 unsigned char a = a,那么變量 a 的值就是 97。
除了上述這些字符以外,還有一些特別字符,它們一些是有形的,像回車符、換行符這些多是看不到的,還有一些像\”這類字符它們?cè)?jīng)有特別用處了,想象一下假如寫 '''認(rèn)為編譯器會(huì)怎樣去說明呢。針對(duì)這些特別符號(hào),為了可以讓它們正常進(jìn)入到我們的程序代碼中,C 言語就規(guī)則了本義字符,它是以反斜杠(\)掃尾的特定字符序列,讓它們來表現(xiàn)這些特別字符,比方我們用\n 來代表換行。我們用一個(gè)復(fù)雜表格來闡明一下常用的本義字符的意思,如表 12-2 所示。
表 12-2 常用本義字符及寄義
字符方式 | 寄義 |
---|---|
\n | 換行 |
\t | 橫向跳格(相當(dāng)于 Tab) |
\v | 豎向跳格 |
\b | 退格 |
\r | 光標(biāo)移到行首 |
\\ | 反斜杠字符\ |
\ | 單引號(hào)字符 |
\” | 雙引號(hào)字符 |
\f | 走紙換頁 |
\0 | 空值 |
表格不需求人人記住,用到了,過去查就可以了。
字符串常量是用雙引號(hào)括起來的字符序列,普通我們都稱之字符串。如“a”、“1234”、“welcome to www.kingst.org”等多是字符串常量。字符串常量在內(nèi)存中按次序逐一存儲(chǔ)字符串中的字符的 ASCII 碼值,而且特殊留意,最初還有一個(gè)字符\0,\0字符的 ASCII 碼值是 0,它是字符串完畢標(biāo)記,在寫字符串的時(shí)分,這個(gè)\0是隱蔽的,我們看不到,然則實(shí)踐倒是存在的。所以“a”就比a多了一個(gè) \0,“a”的就占了 2 個(gè)字節(jié),而 a只占一個(gè)字節(jié)。
還有一 個(gè)地 方要注 意, 就是字 符串 中的空 格, 也是一 個(gè)字 符,比 如 “welcome to www.kingst.org”一共占了 26 個(gè)字節(jié)的空間。個(gè)中 21 個(gè)字母,2 個(gè).,2 個(gè) (空格字符)以及一個(gè)\0。
為了比照字符串、字符數(shù)組、常量數(shù)組的差別,我們寫個(gè)了復(fù)雜的演示程序,界說了 4個(gè)數(shù)組辨別是:
unsigned char array1[] = "1-Hello!\r\n"; unsigned char array2[] = {'2', '-', 'H', 'e', 'l', 'l', 'o', '!', '\r', '\n'}; unsigned char array3[] = {51, 45, 72, 101, 108, 108, 111, 33, 13, 10}; unsigned char array4[] = "4-Hello!\r\n";
在串口調(diào)試助手下,發(fā)送十六進(jìn)制的 1、2、3、4,運(yùn)用字符方式顯示的話,會(huì)辨別往電腦上送這 4 個(gè)數(shù)組中對(duì)應(yīng)的誰人數(shù)組。我們只是在肇端地位做了辨別,其它均沒有差別。人人可以比擬一下后果。
此外還要闡明一點(diǎn),數(shù)組 1 和數(shù)組 4,數(shù)組 1 我們是發(fā)完好的字符串,而數(shù)組 4 我們僅僅發(fā)送數(shù)組中的字符,沒有發(fā)完畢符號(hào)。串口調(diào)試助手用字符方式顯示是沒有差別的,然則人人假如改用十六進(jìn)制顯示,人人會(huì)發(fā)現(xiàn)數(shù)組 1 比數(shù)組 4 多了一個(gè)字節(jié) \0 的 ASCII 值 00。
#includebit cmdArrived = 0; //敕令抵達(dá)標(biāo)記,即接納到上位機(jī)下發(fā)的敕令 unsigned char cmdIndex = 0; //敕令索引,即與上位機(jī)商定好的數(shù)組編號(hào) unsigned char cntTxd = 0; //串口發(fā)送計(jì)數(shù)器 unsigned char *ptrTxd; //串口發(fā)送指針 unsigned char array1[] = "1-Hello!\r\n"; unsigned char array2[] = {'2', '-', 'H', 'e', 'l', 'l', 'o', '!', '\r', '\n'}; unsigned char array3[] = {51, 45, 72, 101, 108, 108, 111, 33, 13, 10}; unsigned char array4[] = "4-Hello!\r\n"; void ConfigUART(unsigned int baud); void main(){ EA = 1; //開總中綴 ConfigUART(9600); //設(shè)置裝備擺設(shè)波特率為 9600 while (1){ if (cmdArrived){ cmdArrived = 0; switch (cmdIndex){ case 1: ptrTxd = array1; //數(shù)組 1 的首地址賦值給發(fā)送指針 cntTxd = sizeof(array1); //數(shù)組 1 的長(zhǎng)度賦值給發(fā)送計(jì)數(shù)器 TI = 1; //手動(dòng)方法啟動(dòng)發(fā)送中綴,處置數(shù)據(jù)發(fā)送 break; case 2: ptrTxd = array2; cntTxd = sizeof(array2); TI = 1; break; case 3: ptrTxd = array3; cntTxd = sizeof(array3); TI = 1; break; case 4: ptrTxd = array4; cntTxd = sizeof(array4) - 1; //字符串實(shí)踐長(zhǎng)度為數(shù)組長(zhǎng)度減 1 TI = 1; break; default: break; } } } } /* 串口設(shè)置裝備擺設(shè)函數(shù),baud-通訊波特率 */ void ConfigUART(unsigned int baud){ SCON = 0x50; //設(shè)置裝備擺設(shè)串口為形式 1 TMOD &= 0x0F; //清零 T1 的掌握位 TMOD |= 0x20; //設(shè)置裝備擺設(shè) T1 為形式 2 TH1 = 256 - (11059200/12/32)/baud; //盤算 T1 重載值 TL1 = TH1; //初值等于重載值 ET1 = 0; //制止 T1 中綴 ES = 1; //使能串口中綴 TR1 = 1; //啟動(dòng) T1 } /* UART 中綴效勞函數(shù) */ void InterruptUART() interrupt 4{ if (RI){ //接納到字節(jié) RI = 0; //清零接納中綴標(biāo)記位 cmdIndex = SBUF; //接納到的數(shù)據(jù)保管到敕令索引中 cmdArrived = 1; //設(shè)置敕令抵達(dá)標(biāo)記 } if (TI){ //字節(jié)發(fā)送終了 TI = 0; //清零發(fā)送中綴標(biāo)記位 if (cntTxd > 0){ //有待發(fā)送數(shù)據(jù)時(shí),持續(xù)發(fā)送后續(xù)字節(jié) SBUF = *ptrTxd; //收回指針指向的數(shù)據(jù) cntTxd--; //發(fā)送計(jì)數(shù)器遞加 ptrTxd++; //發(fā)送指針遞增 } } }