《單片機(jī)C語言程序設(shè)計(jì)》課件第三部分 單片機(jī)C語言基礎(chǔ)_第1頁
《單片機(jī)C語言程序設(shè)計(jì)》課件第三部分 單片機(jī)C語言基礎(chǔ)_第2頁
《單片機(jī)C語言程序設(shè)計(jì)》課件第三部分 單片機(jī)C語言基礎(chǔ)_第3頁
《單片機(jī)C語言程序設(shè)計(jì)》課件第三部分 單片機(jī)C語言基礎(chǔ)_第4頁
《單片機(jī)C語言程序設(shè)計(jì)》課件第三部分 單片機(jī)C語言基礎(chǔ)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第三部分單片機(jī)C語言基礎(chǔ)前言

單片機(jī)C語言是人與計(jì)算機(jī)交流的工具,其具有語言簡潔、結(jié)構(gòu)清晰、語法簡練、功能強(qiáng)大、可移植性好、表達(dá)和運(yùn)算能力強(qiáng)等。由于C語言的這些優(yōu)點(diǎn),使C語言應(yīng)用面很廣。本章對單片機(jī)的C語言做一個(gè)簡單的介紹,主要是針對單片機(jī)C語言中常用的知識塊介紹,如C51語言的基礎(chǔ)、運(yùn)算符和表達(dá)式、分支語句、循環(huán)語句、函數(shù)等。3.1C語言基礎(chǔ)3.1.1標(biāo)識符在編程語言中,標(biāo)識符是用戶編程時(shí)使用的名字,對于變量、常量、函數(shù)、語句塊也有名字;我們統(tǒng)統(tǒng)稱之為標(biāo)識符。簡單的說,標(biāo)識符就是一個(gè)名字。在C語言編程里面標(biāo)識符由字母(A-Z,a-z)、數(shù)字(0-9)、下劃線“_”組成,并且首字符不能是數(shù)字,但可以是字母或者下劃線。例如正確的標(biāo)識符:abcd,num1,prj_ts,DSP。C語言中把標(biāo)識符分為三類:關(guān)鍵字,預(yù)定義標(biāo)識符,用戶自定義標(biāo)識符。1、關(guān)鍵字關(guān)鍵字是單片機(jī)C語言編譯系統(tǒng)中已經(jīng)被使用的一批標(biāo)識符,其有固定的代表意義,不能另作它用。C51語言除了支持ANSI標(biāo)準(zhǔn)C語言中的關(guān)鍵字,還根據(jù)單片機(jī)的結(jié)構(gòu)特點(diǎn)擴(kuò)展了部分關(guān)鍵字(如表3.1.1所示)。3.1C語言基礎(chǔ)表3.1.1C51語言中的關(guān)鍵字。關(guān)鍵字用途說明auto存儲(chǔ)種類說明用以說明局部變量,缺省值為此break程序語句

退出當(dāng)前所在循環(huán)體case程序語句switch語句中的選擇項(xiàng)char數(shù)據(jù)類型說明單字節(jié)整型數(shù)或字符型數(shù)據(jù)const存儲(chǔ)類型說明在程序執(zhí)行過程中不可更改的常量值continue程序語句

轉(zhuǎn)向下一次循環(huán)default程序語句switch語句中的失敗選擇項(xiàng)do程序語句構(gòu)成do?while循環(huán)結(jié)構(gòu)double數(shù)據(jù)類型說明雙精度浮點(diǎn)數(shù)else程序語句

構(gòu)成if?else選擇結(jié)構(gòu)enum數(shù)據(jù)類型說明枚舉extern存儲(chǔ)種類說明在其他程序模塊中說明了的全局變量float

數(shù)據(jù)類型說明單精度浮點(diǎn)數(shù)for程序語句構(gòu)成for循環(huán)結(jié)構(gòu)goto程序語句

構(gòu)成goto轉(zhuǎn)移結(jié)構(gòu)if程序語句構(gòu)成if?else選擇結(jié)構(gòu)3.1C語言基礎(chǔ)表3.1.1C51語言中的關(guān)鍵字。關(guān)鍵字用途說明int數(shù)據(jù)類型說明基本整型數(shù)long數(shù)據(jù)類型說明長整型數(shù)register存儲(chǔ)種類說明使用CPU內(nèi)部寄存的變量return程序語句函數(shù)返回short

數(shù)據(jù)類型說明短整型數(shù)signed數(shù)據(jù)類型說明有符號數(shù),二進(jìn)制數(shù)據(jù)的最高位為符號位sizeof運(yùn)算符計(jì)算表達(dá)式或數(shù)據(jù)類型的字節(jié)數(shù)static存儲(chǔ)種類說明靜態(tài)變量struct數(shù)據(jù)類型說明

結(jié)構(gòu)類型數(shù)據(jù)switch程序語句構(gòu)成switch選擇結(jié)構(gòu)typedef數(shù)據(jù)類型說明重新進(jìn)行數(shù)據(jù)類型定義union數(shù)據(jù)類型說明聯(lián)合類型數(shù)據(jù)unsigned數(shù)據(jù)類型說明無符號數(shù)據(jù)void數(shù)據(jù)類型說明

無類型數(shù)據(jù)volatile數(shù)據(jù)類型說明該變量在程序執(zhí)行中可被隱含地改變while程序語句構(gòu)成while和do?while循環(huán)結(jié)構(gòu)bit位標(biāo)量聲明

聲明一個(gè)位標(biāo)量或位類型的函數(shù)sbit位變量聲明聲明一個(gè)可位尋址變量sfr特殊功能寄存器聲明聲明一個(gè)特殊功能寄存器(8位)3.1C語言基礎(chǔ)表3.1.1C51語言中的關(guān)鍵字。sfr16特殊功能寄存器聲明

聲明一個(gè)16位的特殊功能寄存器data存儲(chǔ)器類型說明直接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器bdata存儲(chǔ)器類型說明可位尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器idata存儲(chǔ)器類型說明

間接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器pdata存儲(chǔ)器類型說明“分頁”尋址的8051外部數(shù)據(jù)存儲(chǔ)器xdata存儲(chǔ)器類型說明8051外部數(shù)據(jù)存儲(chǔ)器code存儲(chǔ)器類型說明8051程序存儲(chǔ)器interrupt中斷函數(shù)聲明定義一個(gè)中斷函數(shù)reetrant再入函數(shù)聲明定義一個(gè)再入函數(shù)using寄存器組定義定義8051的工作寄存器組3.1C語言基礎(chǔ)2、預(yù)定義標(biāo)識符預(yù)定義標(biāo)識符是指C51語言提供的系統(tǒng)函數(shù)的名字(printf、scanf)和預(yù)編譯處理命令(define、include)。所有的預(yù)處理命令均已#號開頭。例如:#defineN10//宏定義用字符N來代替數(shù)字10,注意后面不需要加分號3、用戶自定義標(biāo)識符當(dāng)用戶在給變量、函數(shù)、數(shù)組和文件等命名時(shí),需要注意一下幾點(diǎn):(1)不能把C語言關(guān)鍵字作為用戶標(biāo)識符,例如if,for,while,int等。(2)標(biāo)識符長度是由機(jī)器上的編譯系統(tǒng)決定的,C51編譯器規(guī)定標(biāo)識符最長可達(dá)255個(gè)字符,但只有前面32個(gè)字符在編譯時(shí)有效,因此在編寫源程序時(shí)標(biāo)識符的長度不要超過32個(gè)字符,這對于一般應(yīng)用程序來說已經(jīng)足夠了。如果要定義一個(gè)名為“顯示”的標(biāo)識符,可以寫作“dis”或者“DIS”表示。(3)標(biāo)識符對大小寫敏感,即嚴(yán)格區(qū)分大小寫。即:“ABC”與“abc”是兩個(gè)不一樣的標(biāo)識符。(4)標(biāo)識符命名應(yīng)做到“見名知意”,例如,長度(length),求和、總計(jì)(sum),圓周率(pi)。3.1C語言基礎(chǔ)3.1.2常量與變量1、常量在程序運(yùn)行過程中其值始終不變的量稱為常量??梢苑譃檎统A?、實(shí)型常量、字符型常量。(1)整數(shù)常量是指直接使用的整型常數(shù),又稱整型常數(shù)或者整數(shù),例如,1,-9等。整數(shù)常量可以是長整型、短整型、符號整型和無符號整型。C51中常用的有十進(jìn)制數(shù)、十六進(jìn)制。A、十進(jìn)制:十進(jìn)制數(shù)是不需要在其面前加前綴的。十進(jìn)制數(shù)中包含的數(shù)字0—9組成。如45、-5等。B、十六進(jìn)制:常量前面使用數(shù)字0和字母X或x作為前綴,表示該常量是用十六進(jìn)制表示。十六進(jìn)制中所包含的數(shù)字由0—9以及字母A—F組成(十六進(jìn)制數(shù)中的字母可以使用A—F大寫形式,也可以使用a—f小寫形式。如0x3a,0XAF等。)(2)實(shí)型常量又稱實(shí)數(shù),由整數(shù)和小數(shù)部分組成,其中用十進(jìn)制的小數(shù)點(diǎn)隔開。表示實(shí)數(shù)的方式由科學(xué)計(jì)數(shù)和指數(shù)方式兩種。A、科學(xué)計(jì)數(shù)方式:使用十進(jìn)制的小數(shù)方法進(jìn)行描述實(shí)型,如0.45、99.123。B、指數(shù)方式:若實(shí)數(shù)非常大或非常小,使用科學(xué)計(jì)數(shù)方式則不利于觀察,此時(shí)可以使用指數(shù)方法顯示實(shí)型變量。使用字母e或者E進(jìn)行指數(shù)顯示,如23e2表示2300,而23e-2表示的是0.23。3.1C語言基礎(chǔ)(3)字符型常量可以分為字符常量和字符串常量。A、字符常量是使用單撇號括起一個(gè)字符。字符常量分為一般字符常量(例如’a’、’3’、’#’)。和轉(zhuǎn)義字符常量(C語言中表示字符的一種特殊形式,其含義是將反斜杠后面的字符轉(zhuǎn)換成另外的意義,如’\n’表示回車換行)。注意:字符常量’0’的ASCII值是48,大寫字母’A’的ASCII值是65,小寫字母’a’的ASCII值是97。B、字符串常量是用一對雙撇號括起來的字符序列。例如:”Howdoyoudo”、”a”。C語言規(guī)定在每一個(gè)字符串常量的結(jié)尾加一個(gè)“字符串結(jié)束標(biāo)志”,以便系統(tǒng)根據(jù)此判斷字符串是否結(jié)束。C規(guī)定以字符’\0’作為字符串結(jié)束標(biāo)志?!痋0’是一個(gè)ASCII碼為0的字符,是一個(gè)空操作字符,也是一個(gè)不可顯示的字符,稱為空字符。因此,字符串”Howdoyoudo”總共有14個(gè)字符,分別是:(’H’、’o’、’w’、空格、’d’、’o’、空格、’y’、’o’、’u’、空格、’d’、’o’、’\0’)。注意,在寫字符串的時(shí)候不用自己加上’\0’,’\0’字符是系統(tǒng)自動(dòng)加上的。字符串”a”實(shí)際上包含了2個(gè)字符:’\a’和’\0’。3.1C語言基礎(chǔ)2、變量變量是一段特定的計(jì)算機(jī)內(nèi)存,由一個(gè)或者多個(gè)連續(xù)的字節(jié)構(gòu)成。每一個(gè)變量有一個(gè)名字,可以用變量名引用這段內(nèi)存,讀取變量里面的數(shù)據(jù),或者往變量里面寫入一個(gè)數(shù)據(jù)。變量在程序運(yùn)行過程中其值是可以改變的量。(1)變量的三個(gè)要素包括變量名、變量的地址、變量的類型。變量名:即變量的名字,使用變量名需要注意一下幾點(diǎn)。必須以字母或者是下劃線“_”開頭,變量名字只能包含字母、數(shù)字和下劃線;并且C語言中變量名字是區(qū)分大小寫;變量名不能與關(guān)鍵字同名;在相同的作用范圍里面不能有兩個(gè)相同的名字。變量的地址:即變量在計(jì)算機(jī)中的物理地址,通常在變量名字前面加“&”符號表示取變量的地址。如:&a表示取變量a的地址。變量的類型:表明變量的數(shù)據(jù)類型。每一種類型都用于存儲(chǔ)一種特定的數(shù)據(jù)。如:inta;表明變量a是整型的數(shù)據(jù)類型,所以變量a只能存儲(chǔ)整型的數(shù)據(jù)。3.1C語言基礎(chǔ)(2)變量的定義與初始化變量的定義格式為:數(shù)據(jù)類型變量名表;數(shù)據(jù)類型必須是C語言關(guān)鍵中中規(guī)定的有效數(shù)據(jù)類型,如int、float、char等;變量名表可由一個(gè)或者多個(gè)變量名組成,當(dāng)有多個(gè)變量名組成時(shí),每個(gè)變量名之間使用逗號隔開,最后語句以分號結(jié)束。變量的初始化:定義變量的同時(shí),系統(tǒng)根據(jù)變量的數(shù)據(jù)類型為變量分配存儲(chǔ)的空間,該空間的值有可能是0,也可能是一個(gè)隨機(jī)數(shù),因此在定義了變量后,應(yīng)給變量初始化,通常給變量初始化為0,初始化的方法有以下2種。方法一:先定義再賦值inta,b;a=100;b=50;方法二:定義的同時(shí)初始化inta=100,b=50;注意:變量的定義也稱變量的聲明,C語言中中沒有字符串型變量,變量的定義要集中放在函數(shù)的開始,不要將定義語句與執(zhí)行語句混放。如下面錯(cuò)誤例子:voidmain(){inta;a=10;intb;b=20;ints;s=a+b;}3.1C語言基礎(chǔ)(3)變量的分類

從變量作用域的角度,變量可分為局部變量與全局變量。變量的作用域是指的變量的使用范圍,即變量在程序的哪些部分是可用的。局部變量:在函數(shù)或者復(fù)合語句內(nèi)部定義的變量。局部變量只在本函數(shù)或者復(fù)合語句里面有效。全局變量:在函數(shù)體外面定義的變量。全局變量在定義行開始到整個(gè)程序的結(jié)束有效。注意:如果全局變量的作用域與同名局部變量的作用域重疊,那么在重疊的范圍內(nèi),該全局變量無效。3.1C語言基礎(chǔ)3.1.3數(shù)據(jù)類型數(shù)據(jù)類型是指變量在內(nèi)存的存儲(chǔ)方式,即存儲(chǔ)變量所需的字節(jié)數(shù)以及變量的取值范圍。不同的編譯環(huán)境下數(shù)據(jù)類型的字節(jié)數(shù)不一樣,在C51語言中基本數(shù)據(jù)類型見下表3.1.3。數(shù)據(jù)類型占用的字節(jié)數(shù)取值范圍unsignedchar單字節(jié)0~255char單字節(jié)-128~+127unsignedint雙字節(jié)0~65535int雙字節(jié)-32768~+32767

unsignedlong四字節(jié)

0~4294967295long四字節(jié)

-2147483648~+212147483647float四字節(jié)

±1.175494E-38~±3.402823E+38bit1位

0或1sbit1位

0或1sfr單字節(jié)

0~255sfr16雙字節(jié)字節(jié)0~65535

表3.1.3C51語言中基本數(shù)據(jù)類型3.1C語言基礎(chǔ)1、數(shù)據(jù)類型轉(zhuǎn)換當(dāng)在一個(gè)表達(dá)式中出現(xiàn)不同數(shù)據(jù)類型的變量時(shí),必須進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。C51語言中數(shù)據(jù)類型的轉(zhuǎn)換有兩種方式:自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換。(1)自動(dòng)類型轉(zhuǎn)換。不同數(shù)據(jù)類型的變量在運(yùn)算時(shí),由編譯系統(tǒng)自動(dòng)將它們轉(zhuǎn)換成同一數(shù)據(jù)類型,再進(jìn)行運(yùn)算。自動(dòng)轉(zhuǎn)換規(guī)則如下:bit→char→int→long→floatsigned→unsigned即參加運(yùn)算的各個(gè)變量都會(huì)轉(zhuǎn)換為它們之中數(shù)據(jù)最長的數(shù)據(jù)類型。當(dāng)賦值運(yùn)算符左右兩側(cè)類型不一致時(shí),編譯系統(tǒng)會(huì)按上述規(guī)則,自動(dòng)把右側(cè)表達(dá)式的類型轉(zhuǎn)換成左側(cè)變量的類型,再賦值。例如:ints;charb=10;floata=5.5;s=a+b;即運(yùn)算a+b時(shí),先將b的數(shù)據(jù)類型轉(zhuǎn)換為float,a+b等于15.5,然后將15.5賦值給整型的變量s,賦值的時(shí)候,會(huì)先將15.5轉(zhuǎn)換為整型,即得到15,最終s得到的值為15。3.1C語言基礎(chǔ)(2)強(qiáng)制類型轉(zhuǎn)換。根據(jù)程序設(shè)計(jì)的需要,可以進(jìn)行強(qiáng)制類型轉(zhuǎn)換。強(qiáng)制類型轉(zhuǎn)換是利用強(qiáng)制類型轉(zhuǎn)換符將一個(gè)表達(dá)式強(qiáng)制轉(zhuǎn)換成所需要的類型。其格式如下:例如:floata=7.5; (int)a;其中(int)a的值為7。注意:a的值還是7.5,強(qiáng)制類型轉(zhuǎn)換不會(huì)改變變量本身的數(shù)據(jù)類型和值。3.1C語言基礎(chǔ)2、C51中常用的新增數(shù)據(jù)類型有bit和sbitbit位標(biāo)量bit位標(biāo)量是C51編譯器的一種擴(kuò)充數(shù)據(jù)類型,利用它可定義一個(gè)位標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,不是0就是1。bit和int、char等的使用方法差不多,只不過char是8位二進(jìn)制數(shù)據(jù),bit是1位二進(jìn)制數(shù)而已,都是變量。如:bita=1;定義了一個(gè)位變量a并賦值1,此變量a的值只能為1或者是0;sbit特殊功能寄存器位定義sbit為定義特殊功能寄存器的某一個(gè)位用的,利用它可以訪問芯片內(nèi)部的RAM中的可尋址位或特殊功能寄存器中的可尋址位。在單片機(jī)中,常用sbit定義單片機(jī)某一個(gè)引腳。格式:sbit(位變量名)=SFR地址值(或變量名)^位變量地址值如:sbitP1_1=P1^1;//P1_1為P1中的P1.1引腳相當(dāng)于我們?yōu)镻1^1引腳另外取了一個(gè)名字叫做P1_1,這樣我們在以后的程序語句中就可以用P1_1來對P1.1引腳進(jìn)行讀寫操作了。3.1C語言基礎(chǔ)3.1.4C語言基礎(chǔ)小結(jié)自定義標(biāo)識符由字母、數(shù)字、下劃線組成,首字符必須是字母或者是下劃線。定義變量的時(shí)候必須注意數(shù)據(jù)類型的使用范圍,常用的數(shù)據(jù)類型有:unsignedchar(0-255),unsignedint(0-65535)。變量有分為局部變量和全局變量,局部變量的使用范圍是在函數(shù)里面或者是復(fù)合語句里面使用,全局變量的使用范圍是從定義開始到整個(gè)程序結(jié)束。強(qiáng)制類型轉(zhuǎn)換的格式為:(數(shù)據(jù)類型)表達(dá)式,強(qiáng)制類型并不會(huì)改變表達(dá)式原本的數(shù)據(jù)類型,它只是對表達(dá)式的數(shù)值做強(qiáng)制類型轉(zhuǎn)換。區(qū)分bit和sbit的使用,bit是定義一個(gè)位變量使用,而sbit可以簡單的認(rèn)為是定義單片機(jī)的引腳用。3.2運(yùn)算符與表達(dá)式在C51語言中,對常量或者是變量的處理是通過運(yùn)算符來實(shí)現(xiàn),表達(dá)式是由運(yùn)算符和運(yùn)算對象組成,它是語句的一個(gè)重要的組成因素。C51語言提供的運(yùn)算符很多,構(gòu)成表達(dá)式的種類也很多,下表中列出了部分常用的運(yùn)算符。運(yùn)算符類型中的“目”是指運(yùn)算的對象。如運(yùn)算的對象只有一個(gè)的時(shí)候,稱為單目運(yùn)算符;運(yùn)算的對象有兩個(gè)的時(shí)候,稱為雙目運(yùn)算符;運(yùn)算的對象有三個(gè)的時(shí)候,稱為三目運(yùn)算符。如: 乘以(*),加號(+)等屬于雙目運(yùn)算符當(dāng)一個(gè)表達(dá)式中出現(xiàn)了多個(gè)不同的運(yùn)算符或者相同的運(yùn)算符時(shí),運(yùn)算的先后順序先按照運(yùn)算符的優(yōu)先級分,如果級別一樣的運(yùn)算符,再按照運(yùn)算符的結(jié)合性分。(1)優(yōu)先級:運(yùn)算符的優(yōu)先級共有15個(gè)級別,見表3.2.1

當(dāng)運(yùn)算符級別不一樣時(shí),優(yōu)先級別高的運(yùn)算符先運(yùn)算,級別1為最高。當(dāng)運(yùn)算符級別一樣時(shí),按照運(yùn)算符的結(jié)合性決定運(yùn)算的先后。(2)結(jié)合性:分為從左至右,從右至左兩種。3.2運(yùn)算符與表達(dá)式3.2運(yùn)算符與表達(dá)式在C51語言中,對常量或者是變量的處理是通過運(yùn)算符來實(shí)現(xiàn),表達(dá)式是由運(yùn)算符和運(yùn)算對象組成,它是語句的一個(gè)重要的組成因素。C51語言提供的運(yùn)算符很多,構(gòu)成表達(dá)式的種類也很多,下表中列出了部分常用的運(yùn)算符。運(yùn)算符類型中的“目”是指運(yùn)算的對象。如運(yùn)算的對象只有一個(gè)的時(shí)候,稱為單目運(yùn)算符;運(yùn)算的對象有兩個(gè)的時(shí)候,稱為雙目運(yùn)算符;運(yùn)算的對象有三個(gè)的時(shí)候,稱為三目運(yùn)算符。如: 乘以(*),加號(+)等屬于雙目運(yùn)算符當(dāng)一個(gè)表達(dá)式中出現(xiàn)了多個(gè)不同的運(yùn)算符或者相同的運(yùn)算符時(shí),運(yùn)算的先后順序先按照運(yùn)算符的優(yōu)先級分,如果級別一樣的運(yùn)算符,再按照運(yùn)算符的結(jié)合性分。(1)優(yōu)先級:運(yùn)算符的優(yōu)先級共有15個(gè)級別,見表3.2.1當(dāng)運(yùn)算符級別不一樣時(shí),優(yōu)先級別高的運(yùn)算符先運(yùn)算,級別1為最高。當(dāng)運(yùn)算符級別一樣時(shí),按照運(yùn)算符的結(jié)合性決定運(yùn)算的先后。(2)結(jié)合性:分為從左至右,從右至左兩種。3.2運(yùn)算符與表達(dá)式表3.2.1運(yùn)算符的優(yōu)先級別與結(jié)合性優(yōu)先級別運(yùn)算符功能結(jié)合性1()[]圓括號、函數(shù)參數(shù)表數(shù)組元素下標(biāo)從左至右2!~++、--+-*&(類型名)sizeof邏輯非按位取反自增1、自減1求正求負(fù)間接運(yùn)算符求地址運(yùn)算符強(qiáng)制類型轉(zhuǎn)換求所占字節(jié)數(shù)從右至左3*、/、%乘、除、整數(shù)求余從左至右4+、-加、減5<<、>>向左移位、向右移位6<、<=、>、>=小于、小于等于、大于、大于等于7==、!=恒等于、不等于8&按位與9^按位異或10|按位或11&&邏輯與12||邏輯或13?:條件運(yùn)算從右至左14=

、+=、-=、*=、/=、%=、&=、|=簡單賦值復(fù)合賦值15,逗號運(yùn)算符從左至右3.2運(yùn)算符與表達(dá)式3.2.1算術(shù)運(yùn)算算術(shù)運(yùn)算符共有8個(gè),分別是:+、-、*、/、%、++、--、-(取負(fù)數(shù))。其中前五個(gè)是雙目算術(shù)運(yùn)算符,后三個(gè)是單目算術(shù)運(yùn)算符。1、雙目算術(shù)運(yùn)算符(+、-、*、/、%)在使用*,/,%的時(shí)候需要注意以下幾點(diǎn)。(1)在乘法運(yùn)算的時(shí)候“*”不能省,也不能寫成“.”和“×”。(2)除法運(yùn)算符號為“/”,不能寫成“\”。當(dāng)運(yùn)算對象都為整數(shù)時(shí),結(jié)果也為整數(shù);當(dāng)運(yùn)算對象中有一個(gè)是小數(shù)時(shí),運(yùn)算結(jié)果也為小數(shù)。(3)求余運(yùn)算符“%”的操作數(shù)必須為整型或者字符型數(shù)據(jù)。求余運(yùn)算符的結(jié)果符號與被除數(shù)相同。例如:7%5//結(jié)果為2(-7)%5//結(jié)果為-27%(-5)//結(jié)果為23.2運(yùn)算符與表達(dá)式2、單目算術(shù)運(yùn)算符(++、--)單目算術(shù)運(yùn)算符“++”、“--”為自加一自減一運(yùn)算符,“-”為取負(fù)運(yùn)算符。++、--運(yùn)算的對象可以是整型、實(shí)型變量,不能是常量或者是表達(dá)式。++、--可用作前綴運(yùn)算符,也可用作后綴運(yùn)算符。運(yùn)算符放于操作數(shù)前面表示先自加一自減一后引用,運(yùn)算符放于操作數(shù)后面表示先引用后自加一自減一。例如:if(i++){a=-a;}//后綴,先判斷i的值為真為假,后將i的值自加1if(++i){a=-a;}//前綴,先將i的值自加1,后判斷i的值為真為假建議:不要在一個(gè)表達(dá)式中對同一個(gè)變量進(jìn)行多次自加一或自減一運(yùn)算,免得出錯(cuò)。例如:(++i)*(i++)*(--i)*(i--)這種表達(dá)式可讀性差,容易出錯(cuò),且在不同的編譯環(huán)境下,運(yùn)算的結(jié)果也有可能不一樣,所以不建議這種編程格式的書寫。3.2運(yùn)算符與表達(dá)式3.2.2賦值語句賦值運(yùn)算符有兩種:賦值運(yùn)算符(=)和復(fù)合賦值運(yùn)算符(+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=)。結(jié)合性都是從右至左。1、賦值運(yùn)算符在C51語言中,符號“=”稱為賦值運(yùn)算符。該運(yùn)算符的功能是是將“=”右邊表達(dá)式的值賦值給左邊的變量,其一般形式:變量=表達(dá)式例如:a=5;//將5賦值給變量aa=b+c;//將b加c的結(jié)果賦值給變量a使用賦值運(yùn)算符的時(shí)候應(yīng)注意一下幾點(diǎn):(1)“=”右邊只能是一個(gè)變量,不能是常量和表達(dá)式。例如:5=a//錯(cuò)誤a+b=c//錯(cuò)誤(1)賦值表達(dá)式的值等于“=”左邊變量的值。例如:a=b=6+1;//等同于a=(b=(6+1)),表達(dá)式b=(6+1)的值等于b//的值,也就是7,所以a的值也等于73.2運(yùn)算符與表達(dá)式2、復(fù)合運(yùn)算符其他運(yùn)算符如+、-*、/、%、&、|、^等和賦值運(yùn)算符“=”結(jié)合起來,形成復(fù)合賦值運(yùn)算符。如+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=等,注意,兩個(gè)符號之間不允許有空格。復(fù)合賦值運(yùn)算符的作用是先將復(fù)合運(yùn)算符右邊表達(dá)式的結(jié)果與左邊的變量進(jìn)行運(yùn)算,然后再將最終結(jié)果賦予左邊的變量。例如:a+=3+1;//等價(jià)于a=a+(3+1)a-=3+1;//等價(jià)于a=a-(3+1)a*=3+1;//等價(jià)于a=a*(3+1)a%=3+1;//等價(jià)于a=a%(3+1)需注意:(1)復(fù)合運(yùn)算符左邊必須是變量。(2)復(fù)合運(yùn)算符右邊的表達(dá)式計(jì)算完成后才參與復(fù)合賦值運(yùn)算。(3)復(fù)合賦值運(yùn)算的優(yōu)先級符合C語言運(yùn)算符的優(yōu)先級表,結(jié)合方向?yàn)閺挠业阶蟆?/p>

3、賦值中的數(shù)據(jù)類型轉(zhuǎn)換如果賦值號兩邊的數(shù)據(jù)類型不一樣,系統(tǒng)會(huì)自動(dòng)將等號后邊表達(dá)式的值的類型轉(zhuǎn)換為左邊變量的類型,然后再賦值。例如:inta;floatb=5.5;a=b;//a是一個(gè)整型變量,系統(tǒng)會(huì)自動(dòng)將5.5的小數(shù)部分去掉,再賦值給a,a得到53.2運(yùn)算符與表達(dá)式3.2.3關(guān)系運(yùn)算符與邏輯運(yùn)算符關(guān)系運(yùn)算符是判斷兩個(gè)運(yùn)算對象的關(guān)系是否成立,成立就為真,不成立就為假。邏輯運(yùn)算符是判斷兩個(gè)運(yùn)算對象的邏輯是對的還是錯(cuò)的,如果對的就為真,錯(cuò)的就為假。在C51中規(guī)定,邏輯為真,值就為1;邏輯為假,值就為0。當(dāng)表達(dá)式的值為零,則表達(dá)式為假;表達(dá)式的值為非零,則表達(dá)式為真。1、關(guān)系運(yùn)算符關(guān)系運(yùn)算符有6種關(guān)系,分別為小于(<)、小于等于(<=)、大于(>)、大于等于(>=)、等于(==)、不等于(!=)。注意:有兩個(gè)符號連接起來的運(yùn)算符,兩個(gè)符號之間不能有空格。用關(guān)系運(yùn)算符連接起來的兩個(gè)表達(dá)式稱為關(guān)系表達(dá)式,其一般的形式為:表達(dá)式1關(guān)系運(yùn)算符表達(dá)式2如:若a=1,b=2,c=2,則a>b//關(guān)系不成立,則為假,a>b的值等于0b<=c//關(guān)系成立,則為真,b<=c的等于1b!=c//關(guān)系不成立,則為假,b!=c的值等于03.2運(yùn)算符與表達(dá)式2、邏輯運(yùn)算符邏輯運(yùn)算符有3個(gè),分別是邏輯與(&&)、邏輯或(||)、邏輯非(!)。用邏輯運(yùn)算符連接的表達(dá)式稱為稱為邏輯表達(dá)式。邏輯表達(dá)式的結(jié)果只有真或者假,真就等于1,假就等于0。&&、||都是先計(jì)算左邊表達(dá)式的值,當(dāng)左邊表達(dá)式的值能確定整個(gè)表達(dá)式的值時(shí),就不再計(jì)算右邊表達(dá)式的值。如:a=0&&b;//&&運(yùn)算符的左邊位0,則右邊表達(dá)式b就不再判斷。a=1||b;//||運(yùn)算符的左邊位1,則右邊表達(dá)式b就不再判斷。注意:數(shù)學(xué)中的表達(dá)式a≥x≥b,用C51語言描述應(yīng)該是x大于或者等于b,而且x小魚或者等于a。正確寫法:x>=b&&x<=a錯(cuò)誤寫法:a>=x>=b例:如果要判斷一個(gè)整型變量是不大于20的偶數(shù),則該表達(dá)式該如何寫?3.2運(yùn)算符與表達(dá)式3.2.4條件運(yùn)算符條件運(yùn)算符“?:”是C51語言中唯一的一個(gè)三目運(yùn)算符,有三個(gè)運(yùn)算對象,由條件運(yùn)算符組成的式子稱為條件表達(dá)式,其一般的形式為:表達(dá)式1?表達(dá)式2:表達(dá)式3條件表達(dá)式的執(zhí)行過程為:先計(jì)算表達(dá)式1的值,如果表達(dá)式1的值為非零(即真),則整個(gè)條件表達(dá)式的值等于表達(dá)式2的值,否則,為表達(dá)式3的值。如:a=2,b=3則max=a>b?a:b;//a>b不成立,則條件表達(dá)式的值等于b,所以max得到3注意:條件運(yùn)算符是一對運(yùn)算符,不能分開單獨(dú)使用。3.2運(yùn)算符與表達(dá)式3.2.5表達(dá)式小結(jié)++、--做為前綴,為先執(zhí)行自加自減后引用值;++、--做為后綴,為先引用值后執(zhí)行自加自減。整數(shù)除以整數(shù),結(jié)果還是整數(shù)。賦值運(yùn)算是級別很低的運(yùn)算符,所以先求賦值運(yùn)算符后邊的表達(dá)式的值,再賦值給左邊的變量,賦值運(yùn)算符左邊不能是常量、表達(dá)式。邏輯表達(dá)式中邏輯與(&&)先計(jì)算運(yùn)算符左邊表達(dá)式的值,如果為假則右邊的表達(dá)式的值不需要再計(jì)算,整個(gè)表達(dá)式為假;邏輯或(||)的先計(jì)算運(yùn)算符左邊表達(dá)式的值,如果為真則右邊的表達(dá)式的值不需要再計(jì)算,整個(gè)表達(dá)式為真。3.3C51語言流程控制語句C51里面提供了豐富的、靈活的控制流程語句,程序主要的控制結(jié)構(gòu)有:順序、選擇、循環(huán)三種基本結(jié)構(gòu)。3.3.1順序結(jié)構(gòu)順序結(jié)構(gòu)是程序中最常見的語句,主要包括了一下幾種語句。1、賦值語句在一條合法的賦值表達(dá)式后面加上一個(gè)分號(;),這條表達(dá)式就變成了一個(gè)賦值語句。賦值語句的格式:變量=表達(dá)式;例如:a=a++;//將a自加一,然后賦值給a賦值語句可以出現(xiàn)在程序中任意一個(gè)可以放合法語句的地方。2、函數(shù)調(diào)用語句C51語句中,函數(shù)調(diào)用也算是一條合法的語句,函數(shù)調(diào)用的時(shí)候需要將函數(shù)的頭部全部寫,括號里面寫上實(shí)際參數(shù)值,然后在括號后面加上一個(gè)分號,作為這條語句的結(jié)束的標(biāo)志。其一般的形式為:函數(shù)名(實(shí)際參數(shù));如:Delay(10);Display(8,5);注:函數(shù)的實(shí)際參數(shù)如果有多個(gè),參數(shù)之間用逗號隔開。3.3C51語言流程控制語句3、復(fù)合語句C51語言中,把多條語句用一對大括號括起來組成的語句稱為復(fù)合語句。其一般的形式為:{語句1;語句2;…;語句n;}如:

{a=1;a++;b=a;}復(fù)合語句雖然后多條語句組成,單仍把復(fù)合語句當(dāng)成一條語句來看。在任何一個(gè)可以寫一條語句的地方都可以使用復(fù)合語句。在復(fù)合語句里面定義的變量,只能在復(fù)合語句里面使用。注意:復(fù)合語句后面不需要寫分號。

4、空語句一條語句結(jié)束的結(jié)束符“;”也是一條語句,稱作空語句;空語句在執(zhí)行的時(shí)候不產(chǎn)生任何的動(dòng)作,經(jīng)常用空語句去消耗CPU的執(zhí)行時(shí)間,什么事情都不做,從而達(dá)到延時(shí)的作用。執(zhí)行一條空語句需要一個(gè)機(jī)器周期。3.3C51語言流程控制語句3.3.2分支語句C51語言中的分支語句主要有if語句、if-else語句、switch語句。1、if語句if語句主要有兩種形式:if單分支、if-else雙分支(1)if單分支if語句的一般形式:if(表達(dá)式)語句;if語句的執(zhí)行過程為:先計(jì)算表達(dá)式的值,如果表達(dá)式的值為真,則執(zhí)行if后面的語句;如果表達(dá)式的值為假,則不執(zhí)行if后面的語句。if語句的執(zhí)行流程圖如圖3.3.1所示:如:if(a>10)a=10;//如果a大于10,則執(zhí)行a=10,如果a不大于1,//則不執(zhí)行a=10圖3.3.13.3C51語言流程控制語句(2)if-else雙分支if-else語句的一般形式:if(表達(dá)式)語句1else語句2if-else語句的執(zhí)行過程:先計(jì)算表達(dá)式的值,如果表達(dá)式的值為真,則執(zhí)行語句1,然后if-else語句結(jié)束。如果表達(dá)式的值為假,則執(zhí)行語句2,然后if-else語句結(jié)束。if-else語句的執(zhí)行流程圖如下圖3.3.2所示:例如:if(a>10)b=1;//如果表達(dá)式a>10為真,則執(zhí)行b=1elseb=2;//如果表達(dá)式a>10為假,則執(zhí)行b=2圖3.3.23.3C51語言流程控制語句在使用if選擇語句的時(shí)候應(yīng)注意:(1)如果if后面的語句只有一條,可以不加大括號,如果有兩條或者兩條以上的語句,必須用大括號把這些語句括起來。為了增加程序的可讀性,就算語句只有一條,也要用大括號括起來。(2)if-else是一對組合,不能只有else而沒有if。else總是和離它最近的一個(gè)缺少了else配對的if進(jìn)行配對。(3)if-else語句中如果在else后面的語句繼續(xù)加if-else語句,可形成多分支語句。下面是錯(cuò)誤例子:if(a>10);b=1;c=1;elseb=2;錯(cuò)誤例子分析:if后面的語句有三條,分別是空語句;、賦值語句b=1和c=1,從而導(dǎo)致else不能和if配對,所以錯(cuò)誤。修改正確后的程序:if(a>10){b=1;c=1;}else{b=2;}3.3C51語言流程控制語句2、switch語句switch語句的一般形式為:switch(表達(dá)式){ case常量1:語句1;break; case常量2:語句2;break; case常量3:語句3;break;…case常量n:語句n;break;default:語句;break;}switch語句執(zhí)行的過程:先計(jì)算表達(dá)式的值,并逐個(gè)比較case后面常量的值,當(dāng)與某個(gè)常量的值相等的時(shí)候,就執(zhí)行對應(yīng)該常量后面的語句,語句執(zhí)行后遇到break語句,就跳出switch語句。如果表達(dá)式的值與所有的case后面的常量的值均不相等時(shí),則執(zhí)行default后面的語句。3.3C51語言流程控制語句使用switch語句需要注意一下幾點(diǎn):(1)case與常量之間至少要空一格,卻每個(gè)case后面的常量的值不能有相同的,否則會(huì)出錯(cuò)。(2)遇到break語句,可以跳出當(dāng)前的switch語句,如果在某一個(gè)case后面沒有break語句,程序?qū)⒗^續(xù)往下執(zhí)行,直到遇到break語句或者是switch結(jié)束才可以跳出switch語句。(3)default語句也可以缺省。例如:a=P1;switch(a){case0xfe:key=1;break;case0xfd:key=2;break;case0xfb:key=3;break;case0xf7:key=4;break;case0xef:key=5;break;case0xdf:key=6;break;case0xbf:key=7;break;case0x7f:key=8;break;}3.3C51語言流程控制語句3.3.3循環(huán)結(jié)構(gòu)1、for語句for循環(huán)是一種計(jì)數(shù)型循環(huán),適用于循環(huán)次數(shù)已知情況下的循環(huán)結(jié)構(gòu),它采用循環(huán)控制變量來自動(dòng)控制循環(huán)的次數(shù)。for語句的一般形式為:for(表達(dá)式1;表達(dá)式2;表達(dá)式3){語句;}for語句執(zhí)行的過程:(1)執(zhí)行表達(dá)式1;(2)執(zhí)行表達(dá)式2,若表達(dá)式2為真,則執(zhí)行循環(huán)體里面的語句;若表達(dá)式2為假,則退出for循環(huán);(3)執(zhí)行表達(dá)式3;(4)重復(fù)過程(2)、(3)。其執(zhí)行的流程圖如圖3.3.1所示。表達(dá)式2表達(dá)式1真表達(dá)式3假圖3.3.1例如:for(i=1;i<=100;i++)//先執(zhí)行i=1,再執(zhí)行i<=100是真的,則執(zhí)行循環(huán)體的語句{ //sum=sum+i,然后執(zhí)行i++,再繼續(xù)i<=100表達(dá)式為真為假。sum=sum+i;//因此總共要執(zhí)行循環(huán)體100次。}for語句也可以簡單的理解為如下形式:

for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增量)循環(huán)變量賦初值總是一個(gè)賦值語句,它用來給循環(huán)控制變量賦初值;循環(huán)條件是一個(gè)關(guān)系表達(dá)式,它決定什么時(shí)候退出循環(huán);循環(huán)變量增量,定義循環(huán)控制變量每循環(huán)一次后按什么方式變化。這三個(gè)部分之間用“;”分開。3.3C51語言流程控制語句使用for語句應(yīng)該注意以下幾點(diǎn):(1)for循環(huán)中的“表達(dá)式1(循環(huán)變量賦初值)”、“表達(dá)式2(循環(huán)條件)”和“表達(dá)式3(循環(huán)變量增量)”都是選擇項(xiàng),即可以缺省,但“;”不能缺省。(2)省略了“表達(dá)式1(循環(huán)變量賦初值)”,表示不對循環(huán)控制變量賦初值。(3)省略了“表達(dá)式2(循環(huán)條件)”,認(rèn)為表達(dá)式2總是為真的,如不做其它處理時(shí)便成為死循環(huán)。3.3C51語言流程控制語句2、while語句while循環(huán)是一種條件型循環(huán),適用于循環(huán)次數(shù)未知情況下的循環(huán)結(jié)構(gòu)。while的一般形式為:while(表達(dá)式){語句;}while語句執(zhí)行過程:(1)先執(zhí)行表達(dá)式;(2)如果表達(dá)式為真,則執(zhí)行循環(huán)體里的語句;如果表達(dá)式為假,則退出while語句;(3)重復(fù)步驟(1)和(2)其執(zhí)行的流程圖如圖3.3.2所示表達(dá)式語句真假圖3.3.2例如:求一個(gè)無符號整型變量的各個(gè)位數(shù)字之和;while(a>0){ sum=sum+a%10; a=a/10;}3.3C51語言流程控制語句使用while語句需要注意以下幾點(diǎn):(1)while語句中的表達(dá)式一般是關(guān)系表達(dá)或邏輯表達(dá)式,只要表達(dá)式的值為真(非0)即可繼續(xù)循環(huán)。(2)循環(huán)體如包括有一條以上的語句,則必須用{}括起來,組成復(fù)合語句。(3)為了提高程序的可讀性,循環(huán)體如果只有一條語句,也應(yīng)加上{}括起來。3.3C51語言流程控制語句3、do-while語句do-while語句與while語句使用差不多。While語句是先判斷真假,為真再執(zhí)行。do-while是先執(zhí)行后判斷真假,為真就繼續(xù)執(zhí)行。do-while的一般形式為:do{ 語句}while(表達(dá)式);do-while語句的執(zhí)行過程:(1)先執(zhí)行do后面的語句;(2)執(zhí)行表達(dá)式,如果表達(dá)式為假,則退出do-while語句;如果表達(dá)式為真,則回到(1)繼續(xù)執(zhí)行。do-while語句執(zhí)行的流程圖如圖3.3.3所示:圖3.3.3例如:do{i++; }while(i<100);語句表達(dá)式真假3.3C51語言流程控制語句使用do-while語句要注意以下兩點(diǎn):(1)do-while語句的表達(dá)式后面必須加分號;(2)do-while語句是先執(zhí)行,后判斷語句;3.3.4C51語言流程控制語句小結(jié)順序結(jié)構(gòu)包括:賦值語句、函數(shù)調(diào)用語句、復(fù)合語句、空語句;分支語句包括:if語句、if-else語句、switch語句;循環(huán)語句包括:for循環(huán)語句、while循環(huán)語句。輔助語句:break語句、continue語句。3.4函數(shù)

函數(shù)是C語言程序中最基本的組成單位,每個(gè)程序都是由函數(shù)組成。main()也算是一個(gè)函數(shù),只不過它比較特殊,編譯時(shí)以它做為程序的開始段。函數(shù)體現(xiàn)了C語言模塊化的優(yōu)點(diǎn),一般功能較多的程序,會(huì)在編寫程序時(shí)把每項(xiàng)單獨(dú)的功能分成數(shù)個(gè)子程序模塊,每個(gè)子程序就能用函數(shù)來實(shí)現(xiàn)。函數(shù)還能被反復(fù)的調(diào)用,因此一些常用的函數(shù)能做成函數(shù)庫以供在編寫程序時(shí)直接調(diào)用,從而更好的實(shí)現(xiàn)模塊化的設(shè)計(jì),大大提高編程工作的效率。

3.4.1函數(shù)的定義通常C語言的編譯器會(huì)自帶標(biāo)準(zhǔn)的函數(shù)庫,這些都是一些常用的函數(shù),Keiluv[這是什么?請作者介紹補(bǔ)充或者刪去。]中也不例外。標(biāo)準(zhǔn)函數(shù)已由編譯器軟件商編寫定義,使用者直接調(diào)用就能了,而無需定義。但是標(biāo)準(zhǔn)的函數(shù)不足以滿足使用者的特殊要求,因此C語言允許使用者根據(jù)需要編寫特定功能的函數(shù),要調(diào)用它必須要先對其進(jìn)行定義。定義的形式如下:函數(shù)類型函數(shù)名稱(形式參數(shù)表){函數(shù)體}3.4函數(shù)

說明:

(1)函數(shù)的類型是函數(shù)執(zhí)行后返回?cái)?shù)值的類型,函數(shù)類型是說明所定義函數(shù)返回值的類型。返回值如果是一個(gè)變量,只要按變量類型來定義函數(shù)類型就行了。如函數(shù)不需要返回值函數(shù)類型,寫作“void”表示該函數(shù)沒有返回值。注意的是函數(shù)體返回值的類型一定要和函數(shù)類型一致,不然會(huì)造成錯(cuò)誤。

(2)函數(shù)名稱的定義在遵循C語言變量命名規(guī)則的同時(shí),不能在同一程序中定義同名的函數(shù)這將會(huì)造成編譯錯(cuò)誤(同一程序中是允許有同名變量的,因?yàn)樽兞坑腥趾途植孔兞恐?。

(3)形式參數(shù)是指調(diào)用函數(shù)時(shí)要傳入到函數(shù)體內(nèi)參與運(yùn)算的變量,它能有一個(gè)、幾個(gè)或沒有,當(dāng)不需要形式參數(shù)也就是無參函數(shù),括號內(nèi)能為空或?qū)懭搿皏oid”表示,但括號不能少。

(4)函數(shù)體中一般包含有局部變量的定義和程序語句,如函數(shù)要返回運(yùn)算值則要使用return語句進(jìn)行返回。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論