版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言概述1.1C語言的發(fā)展歷程
C語言是國際上廣泛流行的高級語言。C語言的發(fā)展過程可以粗略的分為誕生(1970年—1973年)、發(fā)展(1973年—1988年)和成熟(1988年以后)三個階段。
(1)C語言是在B語言的基礎(chǔ)上發(fā)展起來的。B(BCPL)語言是1970年由美國貝爾實驗室設(shè)計的,并用于編寫了第一個UNIX操作系統(tǒng),在PDP7上實現(xiàn)。優(yōu)點:精練,接近硬件缺點:過于簡單,數(shù)據(jù)無類型。1.1C語言的發(fā)展歷程(2)1973年貝爾實驗室的D.M.Ritchie在B語言的基礎(chǔ)上設(shè)計出了C語言,但僅在貝爾實驗室使用。1975年UNIX第6版發(fā)布,C優(yōu)點突出引起關(guān)注。1977年出現(xiàn)了《可移植C語言編譯程序》。
1978年影響深遠(yuǎn)的名著《TheCProgrammingLanguage》由BrianW.Kernighan和DennisM.Ritchie合著,被稱為標(biāo)準(zhǔn)C。在此之后,C語言風(fēng)靡世界,成為最廣泛的幾種計算機(jī)語言之一。1983年,美國國家標(biāo)準(zhǔn)化協(xié)會(ANSI)根據(jù)C語言各種版本對C的發(fā)展和擴(kuò)充,制定了新的標(biāo)準(zhǔn)ANSIC,比標(biāo)準(zhǔn)C有了很大的發(fā)展。1.1C語言的發(fā)展歷程
(3)1988年K&R按照ANSIC修改了他們的《TheCProgrammingLanguage》。1987年,ANSI公布了新標(biāo)準(zhǔn)——87ANSIC。
1990年,國際標(biāo)準(zhǔn)化組織接受了87ANSIC為ISOC的標(biāo)準(zhǔn)(ISO9899—1990)。
1994年,ISO又修訂了C語言標(biāo)準(zhǔn)。目前流行的C語言編譯系統(tǒng)大多是以ANSIC為基礎(chǔ)進(jìn)行開發(fā)的。
說明:不同版本的C編譯系統(tǒng)所實現(xiàn)的語言功能和語法規(guī)則又略有差別,因此讀者可以參閱有關(guān)手冊,了解所用的C語言編譯系統(tǒng)的特點。本書的敘述基本上以ANSIC為基礎(chǔ)。1.2數(shù)據(jù)在計算機(jī)內(nèi)的存儲形式和表示方法1.2.1內(nèi)存的組織形式1.內(nèi)存儲器RAM(RandomAccessMemory)2.內(nèi)存儲器的組織形式圖1.1內(nèi)存儲器的結(jié)構(gòu)示意圖
1.2數(shù)據(jù)在計算機(jī)內(nèi)的存儲形式和表示方法加法運(yùn)算規(guī)則:0+0=00+1=11+0=11+1=10乘法運(yùn)算規(guī)則:0×0=00×1=01×0=01×1=12.十進(jìn)制數(shù)與二進(jìn)制數(shù)的轉(zhuǎn)換例如:將十進(jìn)制19.45轉(zhuǎn)換為二進(jìn)制數(shù)。19.45的整數(shù)部分為19,其轉(zhuǎn)換的過程如下:1.2數(shù)據(jù)在計算機(jī)內(nèi)的存儲形式和表示方法19.45的小數(shù)部分為0.45(取四位小數(shù)),其轉(zhuǎn)換的過程如下:、0.45×2=0.90取其整數(shù)部分為00.90×2=1.80取其整數(shù)部分為10.80×2=1.60取其整數(shù)部分為10.60×2=1.20取其整數(shù)部分為1……
依次類推。則得到(19.45)10=(10011.0111)2括號外的下標(biāo)10和2,分別表示十進(jìn)制數(shù)和二進(jìn)制數(shù)。由此可以觀察到:19=1×24+0×23+0×22+1×21+1×20。
1.2數(shù)據(jù)在計算機(jī)內(nèi)的存儲形式和表示方法1.2.3八進(jìn)制(octal)數(shù)
1.八進(jìn)制數(shù)的基本特征八進(jìn)制數(shù)由0、1、2、3、4、5、6、7等八個數(shù)字符號表示;基數(shù)為8;按逢8進(jìn)1、借1算8的規(guī)則計數(shù);采用位置記數(shù)法(或帶權(quán)記數(shù)法),權(quán)值為8。其基本運(yùn)算規(guī)則與十進(jìn)制相似。2.二進(jìn)制數(shù)與八進(jìn)制數(shù)的轉(zhuǎn)換
3.八進(jìn)制數(shù)與十進(jìn)制數(shù)的轉(zhuǎn)換1.2數(shù)據(jù)在計算機(jī)內(nèi)的存儲形式和表示方法1.2.4十六進(jìn)制(Hexadecimal)數(shù)1.十六進(jìn)制數(shù)的基本特征十六進(jìn)制數(shù)由0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F等十六個數(shù)字符號表示;基數(shù)為16;按逢16進(jìn)1、借1算16的規(guī)則計數(shù);采用位置記數(shù)法(或帶權(quán)記數(shù)法),權(quán)值為16。十六進(jìn)制數(shù)中的A、B、C、D、E、F分別代表10、11、12、13、14、15。在C語言中,表示十六進(jìn)制數(shù)時,大小寫字母作用相同。2.十六進(jìn)制數(shù)與二進(jìn)制數(shù)間的轉(zhuǎn)換例如:將二進(jìn)制數(shù)1011010101111110轉(zhuǎn)換為十六進(jìn)制數(shù)。二進(jìn)制數(shù)1011010101111110可以寫成1011,0101,0111,1110四組數(shù),再分別用十六進(jìn)制數(shù)碼C、5、7、E表示。即(1011010101111110)2=(C57E)161.2數(shù)據(jù)在計算機(jī)內(nèi)的存儲形式和表示方法表1.1各種進(jìn)位制度的常用數(shù)值轉(zhuǎn)換表
3.十六進(jìn)制數(shù)與十進(jìn)制數(shù)間的轉(zhuǎn)換若將一個十六進(jìn)制整數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),只需把十六進(jìn)制數(shù)按權(quán)展開,累加各項即可。
注意:在進(jìn)行轉(zhuǎn)換時,每位十六進(jìn)制數(shù)都應(yīng)表示為4位二進(jìn)制數(shù),如0應(yīng)表示為0000,而不應(yīng)只寫成0,否則就會丟失某些位。八進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)時,每位八進(jìn)制數(shù)對應(yīng)一個3位的二進(jìn)制數(shù)。
1.2數(shù)據(jù)在計算機(jī)內(nèi)的存儲形式和表示方法1.2.5原碼、反碼和補(bǔ)碼。
在計算機(jī)內(nèi)部,所有的信息都要用二進(jìn)制數(shù)來表示,數(shù)的符號“+”、“-”也必須采用二進(jìn)制數(shù)來表示。通常以0表示正數(shù)的符號,以1表示負(fù)數(shù)的符號,當(dāng)符號和數(shù)值都二進(jìn)制數(shù)0和1表示之后,這樣的數(shù)叫機(jī)器數(shù)或機(jī)器碼。
機(jī)器碼可以采用不同的碼制來表示,常用的有原碼、反碼和補(bǔ)碼三種表示方法。這樣表示的目的是在計算機(jī)內(nèi)部可以讓符號位一道參加數(shù)值運(yùn)算。1.數(shù)的原碼表示原碼通常用最高位表示數(shù)的符號位,數(shù)值部分用二進(jìn)制絕對值表示。即一個正數(shù)的原碼是它本身,一個負(fù)數(shù)的原碼是其符號位加數(shù)值部分。2.數(shù)的反碼表示
一個正數(shù)的反碼與其原碼相同,一個負(fù)數(shù)的反碼是將符號位除外,其他各位逐位取反,即0變1,1變0,參看表1.2。3.補(bǔ)碼表示方法先以日常鐘表的時間表示為例,說明補(bǔ)碼的概念。假設(shè)現(xiàn)在的標(biāo)準(zhǔn)時間為6點整,而有一只指針指向10點,為了校準(zhǔn)時間,可以采取兩種方法:一是將時針退(10-6)=4格;另一種方法是將時針向前撥(12-4)=8格。
這兩種方法都可以將鐘表校準(zhǔn)的正確時間。對于這個問題來說,減4和加8是等價的。由此,可以說(+8)和(-4)是以12為模的補(bǔ)碼。1.2數(shù)據(jù)在計算機(jī)內(nèi)的存儲形式和表示方法說明:在計算機(jī)中,帶符號的數(shù)用補(bǔ)碼表示,此時減法運(yùn)算變?yōu)榧臃ㄟ\(yùn)算,從而簡化了計算機(jī)硬件電路的結(jié)構(gòu)。當(dāng)運(yùn)算的結(jié)果超出補(bǔ)碼表示范圍時,結(jié)果就不正確了,這稱為“溢出”。1.2數(shù)據(jù)在計算機(jī)內(nèi)的存儲形式和表示方法在數(shù)學(xué)上由于-4=-1×12+8,+8=0×12+8稱為同余式。對于同余式中的模,則表示可以棄舍或丟掉的數(shù)值。其結(jié)果是減去4和加上8都可以實現(xiàn)正確時間的校準(zhǔn)。補(bǔ)碼的計算規(guī)則:一個正數(shù)的補(bǔ)碼和其原碼形式相同,一個負(fù)數(shù)的補(bǔ)碼是將其反碼加1,參看表1.2中部分舉例。在計算機(jī)中,負(fù)數(shù)是用其補(bǔ)碼表示的。例如:求-42的補(bǔ)碼。42用二進(jìn)制數(shù)表示是101010,其原碼為10101010,則其反碼為11010101,即其反碼加1即為補(bǔ)碼:11010110。1.3利用計算機(jī)處理問題的基本過程1.計算機(jī)算題的簡單過程2.利用計算機(jī)處理問題的過程(1)需求分析。(2)確定處理方案。
(3)確定操作步驟。(4)編寫源程序。(5)輸入和運(yùn)行程序。(6)整理結(jié)果。
圖1.3計算機(jī)處理一個實際問題的主要過程
1.4最簡單的C程序的構(gòu)成
1.4.1C語言的特點(1)語言簡潔、緊湊,使用方便、靈活。(2)具有豐富的運(yùn)算符和數(shù)據(jù)結(jié)構(gòu)。(3)C語言是完全模塊化和結(jié)構(gòu)化的語言。(4)C語言因為兼有高級和低級語言的特點。(5)與匯編語言相比,可移植性好。(6)生成目標(biāo)代碼質(zhì)量高。1.4最簡單的C程序的構(gòu)成
1.4.2C語言中的字符集
1.字符集字符是組成語言的最基本的元素。C語言字符集由字母、數(shù)字、空格、標(biāo)點和特殊字符組成,具體可以參看附錄1中常用字符與ASCII碼表。具體可以分為如下幾類:(1)字母。小寫英文字母a~z共26個,大寫字母A~Z共26個。
(2)數(shù)字。0~9共10個。
(3)空白符??崭穹?、制表符、換行符等統(tǒng)稱為空白符。
(4)標(biāo)點和特殊字符。1.4最簡單的C程序的構(gòu)成
2.標(biāo)識符
C語言中用來對變量、符號常量、函數(shù)、數(shù)組、自定義類型等數(shù)據(jù)對象命名的有效字符序列統(tǒng)稱為標(biāo)識符(identifier)。簡單地說,標(biāo)識符就是一個名字。
C語言規(guī)定標(biāo)識符只能由字母、數(shù)字和下劃線3種字符組成,且第1個字符必須為字母或下劃線。
下面列出的是合法的標(biāo)識符,可以作為變量名。X1,a,A3,student,abc,kk下面是不合法的標(biāo)識符和變量名M.D.John,¥123,#33,3D64,a>b,3x特別注意:編譯系統(tǒng)將大寫字母和小寫字母認(rèn)為是兩個不同的字符。
1.4最簡單的C程序的構(gòu)成
3.關(guān)鍵字C語言的32個關(guān)鍵字,是C語言編譯系統(tǒng)賦予規(guī)定含義的英文單詞或字母組合,在進(jìn)行C語言的程序設(shè)計時,不能再賦予其新的含義。C語言的關(guān)鍵字分為以下幾類:(1)類型說明符。用于定義變量、函數(shù)或其他數(shù)據(jù)結(jié)構(gòu)的類型。如int、double等。(2)語句定義符。用于表示一個語句的功能。如if、else、while等。(3)預(yù)處理命令字。用于表示一個預(yù)處理命令。如include、define等。C語言的32個關(guān)鍵字,具體功能可以參看附錄Ⅳ。例1.1
輸出一行信息Helloworld!。
#include<stdio.h>void
main(){
printf("Helloworld!
\n");}
1.4最簡單的C程序的構(gòu)成/*文件包含*//*主函數(shù)*//*函數(shù)體開始*//*輸出語句*//*函數(shù)體結(jié)束*/說明
main
主函數(shù)名,每個C程序必須有一個主函數(shù)main,系統(tǒng)執(zhí)行C程序時,從main函數(shù)開始。()是函數(shù)的標(biāo)志。1.4.3C程序的構(gòu)成1.簡單的C程序舉例
1.4最簡單的C程序的構(gòu)成
說明void函數(shù)類型表示此函數(shù)是“空類型”,printf是C編譯系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)庫中的輸出函數(shù)名,
雙引號“”是字符串的定界符,雙引號內(nèi)的字符串按原樣輸出?!埃躰”是換行符,即在輸出“Helloworld!”后回車換行。
{}是函數(shù)開始和結(jié)束的標(biāo)志,不可省每個C語句以分號結(jié)束
#是預(yù)處理命令行起始符號。使用標(biāo)準(zhǔn)庫函數(shù)時應(yīng)在程序開頭一行寫:#includestdio.h>說明:本程序的運(yùn)行結(jié)果:
Helloworld!1.4最簡單的C程序的構(gòu)成例1.2
求兩個整數(shù)之和。#include<stdio.h>voidmain(){inta,b,sum;a=11;b=45;
sum=a+b;
printf(“sumis%d\n”,sum);}
/*求兩數(shù)之和*/
/*變量聲明部分*//*賦值語句*//*輸出函數(shù)*/
本程序的運(yùn)行結(jié)果:sumis561.4最簡單的C程序的構(gòu)成
說明本程序中各行右側(cè)的/*……*/表示注釋。逗號主要用在變量類型說明中分隔各個變量,是分隔符。在C程序中采用的分隔符最常用的有逗號和空格兩種??崭穸嘤糜谡Z句各單詞之間,作分隔符?!癷nta,b,sum;”是函數(shù)體中的聲明部分,定義變量a和b,指定a和b為整型(int)變量?!癮=11;b=45;sum=a+b;”是賦值語句。printf函數(shù)中得“%”是輸入輸出的“格式字符串”,用來指定輸入輸出時的數(shù)據(jù)類型和格式。
1.4最簡單的C程序的構(gòu)成例1.3計算長為l,寬為w,高為h的長方體體積v。
#include<stdio.h>viodmain(){intvolume(intlength,intwidth,inthigh);intl,w,h,v;printf("pleaseinputl,w,h:\n");
scanf("%d,%d,%d",&l,&w,&h);v=volume(l,w,h);
printf("v=%d",v);
return;}intvolume(intlength,intwidth,inthigh)
{intv;v=length*width*high; returnv; }程序運(yùn)行結(jié)果:pleaseinputl,w,h:4,3,2↙
v=241.4最簡單的C程序的構(gòu)成說明:本程序包括main和被調(diào)用函數(shù)volume兩個函數(shù)。max函數(shù)的作用是計算一個長方體的體積。return語句將z的值返回給主調(diào)函數(shù)main。2.C源程序的結(jié)構(gòu)特點(1)C程序是由函數(shù)構(gòu)成的。一個C源程序至少且僅包含一個main函數(shù)。(2)一個C程序總是從main函數(shù)開始執(zhí)行的。(3)C源程序中可以有預(yù)處理命令,預(yù)處理命令通常應(yīng)放在源文件或源程序的最前面。(4)C程序的基本單位是函數(shù)。被調(diào)用的函數(shù)可以是系統(tǒng)提供的庫函數(shù)(如printf和scanf等輸入輸出函數(shù)),也可以是用戶自定義函數(shù)(如volume函數(shù))。
1.4最簡單的C程序的構(gòu)成3.C函數(shù)的組成(1)函數(shù)首部。即函數(shù)的第1行,包括函數(shù)名、函數(shù)類型、函數(shù)屬性、函數(shù)參數(shù)(形式參數(shù)名、參數(shù)類型)。一個函數(shù)名后面必須跟一對圓括號,括號內(nèi)寫函數(shù)的參數(shù)名及其類型。例如,例1.3中的volume函數(shù)的首部為:(2)函數(shù)體。即函數(shù)首部下面的花括號內(nèi)的部分。①聲明部分。定義所用到的變量和對所調(diào)用函數(shù)的聲明。②執(zhí)行部分。由若干個C語句組成。1.4最簡單的C程序的構(gòu)成說明:(1)空函數(shù):有時函數(shù)可以既無聲明部分也無執(zhí)行部分。如:voidexample1(){}它是一個,什么也不做,但這是符合C語言規(guī)則的。(2)C語言本身沒有輸入輸出語句。輸入和輸出的操作是由庫函數(shù)scanf和printf等函數(shù)來完成的。由于輸入輸出操作牽涉具體的計算機(jī)設(shè)備,把輸入輸出操作放在函數(shù)中處理,就可以使C語言本身的規(guī)模較小,編譯程序簡單,很容易在各種機(jī)器上實現(xiàn),程序具有可移植性。(3)不同計算機(jī)系統(tǒng)除了提供標(biāo)準(zhǔn)函數(shù)外,還提供一些專門的函數(shù),因此不同計算機(jī)系統(tǒng)中所提供的函數(shù)個數(shù)和功能是有所不同的。ANSIC提供一百多個庫函數(shù),TurboC則提供三百多個庫函數(shù)。1.4最簡單的C程序的構(gòu)成4.書寫程序時應(yīng)遵循的規(guī)則(1)每個語句和數(shù)據(jù)聲明的最后必須有個分號,分號是C語句的必要組成部分。(2)關(guān)鍵字、標(biāo)識符之間必須至少加一個空格以示間隔。若已有明顯的間隔符如逗號、分號等,也可不再加空格來間隔。(3)C程序書寫格式自由,一行內(nèi)可以寫幾個語句,一個語句可以分寫在多行上。(4)函數(shù)體內(nèi)部用{}括起來的部分,通常表示程序的某一層次結(jié)構(gòu)。在編程時應(yīng)力求遵循這些規(guī)則,以養(yǎng)成良好的編程風(fēng)格。(5)可以用/*……*/對C程序中的任何部分做注釋1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
1.5.1C語言的運(yùn)行環(huán)境選用TurboC++3.0作為學(xué)習(xí)C語言的運(yùn)行環(huán)境。對于熟悉VisualC++的人,可以參考與本書配套的《C程序設(shè)計教程習(xí)題解答與上機(jī)指導(dǎo)》指導(dǎo)書來學(xué)習(xí)。
TurboC++3.0:是一個集成環(huán)境,它具有方便、直觀和易用的界面,雖然它也是DOS環(huán)境下的集成環(huán)境,但是可以把啟動TurboC++3.0集成環(huán)境的DOS執(zhí)行文件tc.exe生成快捷方式,也可以用鼠標(biāo)操作。1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
TurboC++3.0的集成環(huán)境可以通過兩種方法得到TurboC++3.0集成環(huán)境。(1)在DOS環(huán)境下??梢栽贒OS環(huán)境下用鍵盤輸入DOS命令TC即可:D:\TC3.0>TC↙
(2)在Windows環(huán)境下。先通過瀏覽找到TurboC++3.0集成環(huán)境所在的子目錄(如D:\TC3.0),從中找到可執(zhí)行文件tc.exe,創(chuàng)建其快捷方式,并拖曳到Windows桌面上,用一個圖標(biāo)表示。雙擊該圖標(biāo),就可打開的TurboC++3.0集成環(huán)境。圖1.4TurboC++3.0集成環(huán)境
1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
在集成環(huán)境的上部,有一行主菜單,其中包括10個菜單項。用戶可以通過以上菜單來選擇使用集成環(huán)境所提供的TurboC++3.0的各項主要功能。
主菜單,其中包括10個菜單項:
FileEditSearchRunCompileDebugProjectOptionsWindowHelp以上10個菜單項分別代表:文件、編輯、查找、運(yùn)行、編譯、調(diào)試、項目、選項、窗口、幫助。用鼠標(biāo)可以選擇菜單條中所需要的菜單項,單擊此菜單項就會出現(xiàn)一個下拉菜單。
1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
1.5.2C程序的上機(jī)步驟
所謂程序,就是一組計算機(jī)能識別和執(zhí)行的指令。每一條指令使計算機(jī)執(zhí)行特定的操作。用高級語言編寫的程序稱為“源程序(sourceprogram)”。
TurboC++3.0是一個集源程序編輯、編譯、連接、運(yùn)行與調(diào)試于一體、用菜單驅(qū)動的集成軟件環(huán)境。運(yùn)行一個C語言程序的一般過程如圖1.7所示:
編輯編譯源程序f.c有錯?連接執(zhí)行結(jié)果正確?目標(biāo)程序f.0bj無有庫函數(shù)和其他目標(biāo)程序可執(zhí)行程序f.exe是否開始結(jié)束1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
說明:經(jīng)過編輯得到一個源程序文件f.c,然后將源程序文件f.c輸入到計算機(jī)中,經(jīng)過編譯得到目標(biāo)程序文件f.obj,再將目標(biāo)程序f.obj均輸入內(nèi)存,與系統(tǒng)提供的庫函數(shù)等連接,即可得到可執(zhí)行的目標(biāo)程序f.exe,最后把f.exe調(diào)入內(nèi)存并執(zhí)行。即:運(yùn)行C程序的步驟上機(jī)輸入與編輯源程序?qū)υ闯绦蜻M(jìn)行編譯與庫函數(shù)連接運(yùn)行目標(biāo)程序1編輯源文件新建:單擊File菜單下的New1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
修改:選擇File→Open(即單擊“File”的下拉菜單中的Open項,修改已有的源程序。
在編輯(EDIT)狀態(tài)下光標(biāo)表示當(dāng)前進(jìn)行編輯的位置,在此位置可以進(jìn)行插入、刪除或修改,直到自已滿意為止。保存:在完成編輯之后,應(yīng)當(dāng)保存源程序。如果該源程序是已有的,則選擇菜單File
Save命令保存已修改過的源程序。若源程序是新輸入的,則選擇File->Save命令,并在彈出的SaveFileAs對話框中的Name欄中輸入文件路徑和文件名,1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
2.對源程序進(jìn)行編譯
選擇菜單Compile(或“Alt+F9”)對源程序進(jìn)行編譯。AA.C源程序,出現(xiàn)1個錯誤(error),0個警告(warming)。
1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
3將目標(biāo)程序進(jìn)行連接選擇菜單Compile→Link,如果不出現(xiàn)錯誤,會得到一個后綴為.exe的可執(zhí)行文件。4執(zhí)行程序
選菜單Run→Run(或按“Ctrl+F9”鍵)。5退出TurboC++3.0環(huán)境退出TC有兩種方法:1)菜單法:File|Quit(先選擇File主項,再選擇并執(zhí)行Quit子項)2)快捷鍵法:Alt+“X”(先按下Alt鍵并保持,再按字母鍵X,然后同時放開)。1.5C語言的運(yùn)行環(huán)境和上機(jī)步驟
2.1C的數(shù)據(jù)類型C語言提供了以下一些數(shù)據(jù)類型。給變量定義數(shù)據(jù)類型,實際上是為數(shù)據(jù)在內(nèi)存中分配規(guī)定的存儲空間,存儲空間通常用字節(jié)數(shù)的形式表示。數(shù)據(jù)類型構(gòu)造類型指針類型空類型void枚舉類型enum數(shù)組類型結(jié)構(gòu)體類型struct共用體類型
union基本類型整型int字符型char實型(浮點型)單精度float雙精度
double2.2常量與變量3.2.1常量和符號常量在程序運(yùn)行過程中,其值不能被改變的量稱為常量。常量區(qū)分為不同的類型:例如整型100,125,-100,0實型3.14,0.125,-3.789字符型‘a(chǎn)’,‘b’,‘2’字符串‘a(chǎn)’,‘a(chǎn)b’,‘1232’符號常量:用一個標(biāo)識符代表一個常量。符號常量的值在其作用域內(nèi)不能改變,也不能再被賦值。例2.1定義一個符號常量PI,表示圓周率。然后使用符號常量PI計算圓的周長。
#include<stdio.h>
#definePI3.14/*定義符號常量PI,表示3.14*/
voidmain()
{
floatr,l;
r=5.0;
l=2*r*PI;
printf("l=%f\n”,l);
}
程序運(yùn)行結(jié)果為:l=31.400000說明:
程序中用#define命令行定義PI代表常量3.14,此后凡在本文件中出現(xiàn)的PI都代表3.14,可以和常量一樣進(jìn)行運(yùn)算說明:如再用賦值語句給PRICE賦值是錯的如:
PRICE=40;/*錯誤,不能給符號常量賦值2.2常量與變量2.2常量與變量2.2.2變量變量代表內(nèi)存中具有特定屬性的一個存儲單元,它用來存放數(shù)據(jù),這就是變量的值,在程序運(yùn)行期間,這些值是可以改變的。變量名實際上是一個以一個名字對應(yīng)代表一個地址,在對程序編譯連接時由編譯系統(tǒng)給每一個變量名分配對應(yīng)的內(nèi)存地址。從變量中取值,實際上是通過變量名找到相應(yīng)的內(nèi)存地址,從該存儲單元中讀取數(shù)據(jù)。2.2常量與變量
變量名必須是標(biāo)識符
例:sum,_total,month,Stu_name,l_1_2,BC235M.D.John,¥123,3D64,a>b
注意:編譯系統(tǒng)將大寫字母和小寫字母認(rèn)為是兩個不同的字符。在C語言中,要求對所有用到的變量作強(qiáng)制定義,也就是“先定義,后使用”,凡未被事先定義的,C編譯系統(tǒng)不把它認(rèn)作變量名,這就能保證程序中變量名使用得正確。
在選擇變量名和其它標(biāo)識符時,應(yīng)注意做到“見名知意”,即選有含意的英文單詞(或其縮寫)作標(biāo)識符。每一個變量被指定為一個確定類型,在編譯時就能為其分配相應(yīng)的存儲單元。2.3整型數(shù)據(jù)3.3.1整型常量的表示方法整型常量即整常數(shù)。在C語言中,整常數(shù)可用以下三種形式表示:(1)十進(jìn)制整數(shù)。
如:123,-456.4,3.1415926。(2)八進(jìn)制整數(shù)。以0頭的數(shù)是八進(jìn)制數(shù)。
如:0123表示八進(jìn)制數(shù)123,等于十進(jìn)制數(shù)83,-011表示八進(jìn)制數(shù)-11,即十進(jìn)制數(shù)-9。(3)十六進(jìn)制整數(shù)。以0x開頭的數(shù)是16進(jìn)制數(shù)。如:0x123,代表16進(jìn)制數(shù)123,等于十進(jìn)制數(shù)291。-0x12等于十進(jìn)制數(shù)-18。
2.3.2整型變量
1.整型數(shù)據(jù)在內(nèi)存中的存放形式
數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存放的。
如:
inti;/*定義為整型變量*/
i=17;/*給i賦以整數(shù)17*/2.3整型數(shù)據(jù)注意:十進(jìn)制數(shù)17的二進(jìn)制形式為10001,TurboC++3.0為一個整型變量在內(nèi)存中分配2個字節(jié)的存儲單元。數(shù)值是以補(bǔ)碼(complement)表示的。
2.整型變量的分類共六種有符號基本整型有符號短整型有符號長整型無符號基本整型無符號短整型無符號長整型(signed)int(signed)short(int)(signed)long(int)unsignedintunsignedshort(int)unsignedlong(int)
注意:括號表示其中的內(nèi)容是可選的。2.3整型數(shù)據(jù)2.3整型數(shù)據(jù)C語言沒有具體規(guī)定以上各類數(shù)據(jù)所占內(nèi)存的字節(jié)數(shù),只要求long型數(shù)據(jù)長度不短于int型,short型不長于int型。具體如何實現(xiàn),由各計算機(jī)系統(tǒng)自行決定。如在TurboC++3.0中,int型和short型數(shù)據(jù)都是16位(bit),而long型數(shù)據(jù)是32位。以整數(shù)13在TurboC++3.0環(huán)境下,在各種整數(shù)類型的存儲單元中的存儲情況如圖所示。3.整型變量的定義C規(guī)定在程序中所有用到的變量都必須在程序中定義,變量說明的一般形式為:
數(shù)據(jù)類型名變量名表;(變量名之間用逗號分隔)
例如:
inta,b,c(指定變量a、b為整型)
unsignedshortc,d;(指定變量c、d為無符號短整型)
longe,f;(指定變量e、f為長整型)2.3整型數(shù)據(jù)例2.2整型變量的定義與使用。
#include<stdio.h>
voidmain()
{
inta,b,c,d;
unsignedu;
a=15;b=-19;u=17;
c=a+u;d=b+u;
printf(“c=a+u=%d,d=b+u=%d\n”,c,d);
}
說明
可以看到不同種類的整型數(shù)據(jù)可以進(jìn)行算術(shù)運(yùn)算程序運(yùn)行結(jié)果為:c=a+u=32,d=b+u=-22.3整型數(shù)據(jù)例2.3整型數(shù)據(jù)的溢出(見圖)。
#include<stdio.h>
voidmain()
{
inta,b;
a=32767;b=a+1;
printf("\na=%d,a+1=%d\n",a,b);
a=-32768;b=a-1;
printf("\na=%d,a-1=%d\n",a,b);
}
說明:數(shù)值是以補(bǔ)碼表示的。一個整型變量只能容納-32768~32767范圍內(nèi)的數(shù),無法表示大于32767或小于-32768的數(shù)。遇此情況就發(fā)生“溢出”。
程序運(yùn)行結(jié)果為:a=32767,a+1=-32768a=-32768,a-1=327672.3整型數(shù)據(jù)4.整型數(shù)據(jù)的溢出2.3.3整型常量的類型(1)一個整數(shù),如果其值在-32768~+32767范圍內(nèi),認(rèn)為它是int型,它可以賦值給int型和longint型變量。(2)一個整數(shù),如果其值超過了上述范圍,而在-2147483637~+2147483647范圍內(nèi),則認(rèn)為它是為長整型??梢詫⑺x值給一個longint型變量。2.3整型數(shù)據(jù)(3)如果所用的C版本分配給shortint與int型數(shù)據(jù)在內(nèi)存中占據(jù)的長度相同,則它的表數(shù)范圍與int型相同。(4)一個整常量后面加一個字母u或U,認(rèn)為是unsignedint型,如果寫成-12345u,則先將-12345轉(zhuǎn)換成其補(bǔ)碼53191,然后按無符號數(shù)存儲。(5)在一個整常量后面加一個字母l或L,則認(rèn)為是longint型常量。
例如:123l.432L.0L
2.3整型數(shù)據(jù)2.4實型數(shù)據(jù)2.4.1實型常量的表示方法兩種表示形式小數(shù)指數(shù)0.1233e-3注意:字母e(或E)之前必須有數(shù)字,且e后面的指數(shù)必須為整數(shù):1e3、1.8e-3、-123e-6、-.1e-3e3、2.1e3.5、.e3、e
3.4浮點型數(shù)據(jù)規(guī)范化的指數(shù)形式:
在字母e(或E)之前的小數(shù)部分中,小數(shù)點左邊應(yīng)只有一位非零的數(shù)字。在C程序中,一個浮點數(shù)在用指數(shù)形式輸出時,是按規(guī)范化的指數(shù)形式輸出的。
例如:123.456可以表示為:123.456e0,12.3456e1,1.23456e2,0.123456e3,0.0123456e4,0.00123456e
其中的1.23456e3稱為“規(guī)范化的指數(shù)形式”。2.4實型數(shù)據(jù)2.4.2實型變量
1.實型數(shù)據(jù)在內(nèi)存中的存放形式
一個浮點型數(shù)據(jù)一般在內(nèi)存中占4個字節(jié)(32位)。與整型數(shù)據(jù)的存儲方式不同,浮點型數(shù)據(jù)是按照指數(shù)形式存儲的。系統(tǒng)把一個浮點型數(shù)據(jù)分成小數(shù)部分和指數(shù)部分,分別存放。指數(shù)部分采用規(guī)范化的指數(shù)形式。2.4實型數(shù)據(jù)2.實型變量的分類和定義
實型變量分為單精度(float型)、雙精度(double型)和長雙精度型(longdouble)三類形式。表2.2實型數(shù)據(jù)的分類例如:floatx1,x2;(指定x1、x2為單精度浮點數(shù))doubley1;(指定y1為雙精度浮點數(shù))longdoublez1;(指定z1為長雙精度浮點數(shù))
2.4實型數(shù)據(jù)例2.4實型數(shù)據(jù)的舍入誤差。
#include<stdio.h>
voidmain()
{
floatx1,x2;
x1=333333.222E5
x2=x1+30;
printf("x1=%f\n",x1);
printf("x2=%f\n",x2);
}
說明:一個浮點型變量只能保證的有效數(shù)字是7位有效數(shù)字,后面的數(shù)字是無意義的,并不準(zhǔn)確地表示該數(shù)。應(yīng)當(dāng)避免將一個很大的數(shù)和一個很小的數(shù)直接相加或相減,否則就會“丟失”小的數(shù)。與此類似,用計算機(jī)計算1.0/3.0×3.0的結(jié)果不可能等于1.0。程序運(yùn)行結(jié)果為:x1=33333321728.000000x2=33333321728.0000002.4實型數(shù)據(jù)3.實型數(shù)據(jù)的舍入誤差2.4.3實型常量的類型
C編譯系統(tǒng)將浮點型常量作為雙精度來處理。
例如:f=2.45678*4523.65
系統(tǒng)先把2.45678和4523.65作為雙精度數(shù),然后進(jìn)行相乘的運(yùn)算,得到的乘也是一個雙精度數(shù)。最后取其前7位賦給浮點型變量f。如是在數(shù)的后面加字母f或F(如1.65f,654.87F),這樣編譯系統(tǒng)就會把它們按單精度(32位)處理。假如:
floaty;y=1234567.1111;float型變量y只能接收7位有效數(shù)字2.4實型數(shù)據(jù)2.5字符型數(shù)據(jù)2.5.1字符常量(1)字符常量只能用單引號括起來,不能用雙引號或其他括號。(2)字符常量只能是單個字符。(3)字符可以是字符集中任意字符。
(4)C語言還允許用一種特殊形式的字符常量,就是以一個字符“\”開頭的字符序列,稱之為“轉(zhuǎn)義字符”。
表2.3轉(zhuǎn)義字符及其含義
有些以“\”開頭的特殊字符稱為轉(zhuǎn)義字符\n
換行\(zhòng)t
橫向跳格\r
回車\\
反斜杠\dddddd表示1到3位八進(jìn)制數(shù)字\xhhhh表示1到2位十六進(jìn)制數(shù)字2.5字符型數(shù)據(jù)例2.5
轉(zhuǎn)義字符的使用。
#include<stdio.h>
voidmain()
{
inta,b,c;
a=5;b=6;c=7;
printf("%d\n\t%d%d\n%d%d\t\b%d\n",a,b,c,a,b,c);
}
程序運(yùn)行時輸出以下結(jié)果:2.5字符型數(shù)據(jù)2.5.2字符型變量1.字符型變量分類和定義字符型變量用來存放字符常量,注意只能放一個字符。一個字符變量在內(nèi)存中占一個字節(jié)。
字符變量的定義形式如下:charc1,c2;在本函數(shù)中可以用下面語句對c1,c2賦值:
c1=‘a(chǎn)’;c2=‘b’;2.5字符型數(shù)據(jù)2.字符型數(shù)據(jù)在內(nèi)存中的存儲形式及其使用方法字符型數(shù)據(jù)在內(nèi)存中的存儲是將字符的ASCII碼值以二進(jìn)制形式存放,占用1個字節(jié)。也就是說將一個字符型常量放到一個字符變量中,實際上并不是把該字符本身放到內(nèi)存單元中去,而是將該字符的相應(yīng)的ASCII代碼放到存儲單元中。
這樣使字符型數(shù)據(jù)和整型數(shù)據(jù)之間可以通用。一個字符數(shù)據(jù)既可以以字符形式輸出,也可以以整數(shù)形式輸出。2.5字符型數(shù)據(jù)例2.6
向字符型變量賦值。
#include<stdio.h>
voidmain()/*字符'a'的各種表達(dá)方法*/
{
charc1,c2,c3,c4,c5,c6;
c1='a';c2='\x61';c3='\141';
c4=97;c5=0x61;c6=0141;
printf("c1=%c,c2=%c,c3=%c\n",c1,c2,c3);
printf("c4=%c,c5=%c,c6=%c\n",c4,c5,c6);
printf("c1=%d,c2=%d,c3=%d\n",c1,c2,c3);
printf("c4=%d,c5=%d,c6=%d\n",c4,c5,c6);
}
程序運(yùn)行結(jié)果:c1=a,c2=a,c3=ac4=a,c5=a,c6=ac1=97,c2=97,c3=97c4=97,c5=97,c6=972.5字符型數(shù)據(jù)例2.7
字符型數(shù)據(jù)的轉(zhuǎn)換。
#include<stdio.h>
voidmain()
{
charc1,c2,c3;
c1='a';
c2='b';
c1=c1-32;
c2=c2-32;
c3=157;
printf("\nc1=%cc2=%cc3=%c\n",c1,c2,c3);
printf("c1=%dc2=%dc3=%d\n",c1,c2,c3);
}
程序運(yùn)行結(jié)果:c1=Ac2=Bc3=¥
c1=65c2=66c3=-99
2.5字符型數(shù)據(jù)注意:需要進(jìn)一步說明的是有些系統(tǒng)(如TurboC++3.0)將字符變量定義為signedchar型。其存儲單元中的最高位作為符號位,它的取值范圍就是-128~127。
如果在字符變量中存放一個ASCII碼為0~127間的字符,由于字節(jié)中最高位為0,因此用%d輸出字符變量時,輸出的是一個正整數(shù)。如果在字符變量中存放一個ASCII碼為128~255間的字符,由于在字節(jié)中最高位為1,用%d格式符輸出時,就會得到一個負(fù)整數(shù),
2.5字符型數(shù)據(jù)2.5.3字符串常量C語言除了允許使用字符常量外,還允許使用字符串常量。字符串常量是一對雙引號括起來的字符序列。例如:
”ThisisaCprogram.”,”CHINA”,”a”,”a1f3.45”也可以利用printf函數(shù)可以輸出一個字符串。例如:printf("All
alone
in
a
foreign
land.");2.5字符型數(shù)據(jù)設(shè)ch1被指定為字符變量:charch1;ch1=’a’;是正確的。‘a’是字符常量而ch1=”a”;則是錯誤的。”a”是字符串常量C規(guī)定:在每一個字符串常量的結(jié)尾加一個“字符串結(jié)束標(biāo)志”,以便系統(tǒng)據(jù)此判斷字符串是否結(jié)束。C規(guī)定以字符’\0’作為字符串結(jié)束標(biāo)志。2.5字符型數(shù)據(jù)注意:在寫字符串時不必加’\0’,因為’\0’字符是系統(tǒng)自動加上的。在C語言中沒有專門的字符串變量,如果想將一個字符串存放在變量中以便保存,必須使用字符數(shù)組,即用一個字符型數(shù)組來存放一個字符串。2.6變量初始化和變量賦初值
(1)C語言允許在定義變量的同時使變量初始化。如:inta=3;//指定a為整型變量,初值為3
floatf=3.56;//指定f為浮點型變量,初值為3.56
charc=‘a(chǎn)’;//指定c為字符變量,初值為‘a(chǎn)’(2)可以使被定義的變量的一部分賦初值。如:
inta,b,c=5;表示指定a、b、c為整型變量,但只對c初始化,c的初值為5
2.6變量初始化和變量賦初值
(3)如果對幾個變量賦以同一個初值,應(yīng)寫成:inta=3,b=3,c=3;表示a、b、c的初值都是3。不能寫成∶
inta=b=c=3;
注意:初始化不是在編譯階段完成的,而是在程序運(yùn)行時執(zhí)行本函數(shù)時賦初值的,相當(dāng)于有一個賦值語句。2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
2.7.1C語言運(yùn)算符簡介
C的運(yùn)算符有以下幾類:(1)算術(shù)運(yùn)算符(+-*/%)(2)關(guān)系運(yùn)算符(><==>=<=?。剑?3)邏輯運(yùn)算符(?。Γ|)(4)位運(yùn)算符(<<>>~|∧&)(5)賦值運(yùn)算符(=及其擴(kuò)展賦值運(yùn)算符)(6)條件運(yùn)算符(?:)(7)逗號運(yùn)算符(,)(8)指針運(yùn)算符(*和&)(9)求字節(jié)數(shù)運(yùn)算符(sizeof)(10)強(qiáng)制類型轉(zhuǎn)換運(yùn)算符((類型))(11)分量運(yùn)算符(.->)(12)下標(biāo)運(yùn)算符([])(13)其他(如函數(shù)調(diào)用運(yùn)算符())2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
2.7.2基本算術(shù)運(yùn)算符和算術(shù)表達(dá)式1.基本的算術(shù)運(yùn)算符+(加法運(yùn)算符,或正值運(yùn)算符,如:3+5、+3)-(減法運(yùn)算符,或負(fù)值運(yùn)算符,如:5-2、-3)*(乘法運(yùn)算符,如:3*5)/(除法運(yùn)算符,包括整數(shù)除和實數(shù)除,如25/3、4.2/2.0)%(模運(yùn)算符,或稱求余運(yùn)算符,%兩側(cè)均應(yīng)為整型數(shù)據(jù),如:7%4的值為3)。2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
2.算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級與結(jié)合性用算術(shù)運(yùn)算符和括號將運(yùn)算對象(也稱操作數(shù))連接起來的、符合C語法規(guī)則的式子,稱為C算術(shù)表達(dá)式。運(yùn)算對象包括常量、變量、函數(shù)等。例如:
a*b/c-1.5+′a′
是一個合法的表達(dá)式。2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
C語言規(guī)定了運(yùn)算符的優(yōu)先級和結(jié)合性。在表達(dá)式求值時,先按運(yùn)算符的優(yōu)先級別高低次序執(zhí)行,例如先乘除后加減。C規(guī)定了各種運(yùn)算符的結(jié)合方向(結(jié)合性)
算術(shù)運(yùn)算符的結(jié)合方向為“自左至右”,即先左后右。
注意:C語言規(guī)定了各種運(yùn)算符的結(jié)合方向(結(jié)合性),“自左至右的結(jié)合方向’’又稱“左結(jié)合性”,即運(yùn)算對象先與左面的運(yùn)算符結(jié)合。有些運(yùn)算符的結(jié)合方向為“自右至左”(例如,賦值運(yùn)算符)。
在程序運(yùn)行時,系統(tǒng)會自動進(jìn)行結(jié)合性的運(yùn)算的。2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
2.7.3自增、自減運(yùn)算符自增運(yùn)算符記為“++”,其功能是使變量的值自增1。自減1運(yùn)算符記為“--”,其功能是使變量值自減1。如:
++i,--i(在使用i之前,先使i的值加(減)1)i++,i--(在使用i之后,使i的值加(減)1)
2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
說明:一般來說,++i和i++的作用相當(dāng)于i=i+1。但++i和i++不同之處在于++i是先執(zhí)行i=i+1后,再使用i的值;而i++是先使用i的值后,再執(zhí)行i=i+1。--i和i--的作用相當(dāng)于i=i-1。但--i和i--不同之處在于--i是先執(zhí)行i=i-1后,再使用i的值;而i--是先使用i的值后,再執(zhí)行i=i-1。
i++與++i的區(qū)別:
++i是先執(zhí)行i=i+1后,再使用i的值;i++是先使用i的值后,再執(zhí)行i=i+1。例如:①j=++i;
i的值先變成4,再賦給j,j的值均為4②j=i++;先將i的值3賦給j,j的值為3,然后i變?yōu)椋?.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
注意:
(1)自增運(yùn)算符(++),自減運(yùn)算符(--),只能用于變量,而不能用于常量或表達(dá)式,(2)++和--的結(jié)合方向是“自右至左”。如:9++或(a+b)++都是不合法的。
因為9是常量,常量的值不能改變,不可能出現(xiàn)“9=9+1”的形式。
(a+b)++也不可能實現(xiàn),因為自增、自減運(yùn)算還有一種給變量賦值的功能。2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
例2.8變量自增、自減運(yùn)算舉例。#include<stdio.h>voidmain(){inti=7;/*i的初值為7*/printf("%d",++i);/*i加1后輸出故為8*/printf("%d",--i);/*i減1后輸出故為7*/printf("%d",i++);/*輸出i為7之后再加1(為8)*/printf("%d",i--);/*輸出i為8之后再減1(為7)*/printf("%d",-i++);/*輸出-7之后i再加1(為8)*/printf("%d\n",-i--);}/*輸出-8之后i再減1(為7)*/
2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
程序運(yùn)行結(jié)果:8778-7-8例2.9較復(fù)雜的變量自增、自減運(yùn)算舉例。#include<stdio.h>voidmain(){inti=3,j=6,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("p=%dq=%di=%dj=%d\n",p,q,i,j);}2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
程序運(yùn)行結(jié)果:2.7.4有關(guān)算術(shù)表達(dá)式使用中的問題說明(1)ANSIC并沒有具體規(guī)定表達(dá)式的求值順序,允許各編譯系統(tǒng)自己安排。
例如:對表達(dá)式a=f1()+f2()
并不是所有的編譯系統(tǒng)都先調(diào)用f1(),然后調(diào)用f2()。在有的情況下結(jié)果可能不同。有時會出現(xiàn)一些令人容易搞混的問題,因此務(wù)必要小心謹(jǐn)慎。例2.10自增自減運(yùn)算的求值順序。
2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
(2)C編譯系統(tǒng)在處理程序時盡可能多地(自左而右)將若干個字符組成一個運(yùn)算符、標(biāo)識符和關(guān)鍵字。
C語言中有的運(yùn)算符為一個字符,有的運(yùn)算符由兩個字符組成,為避免誤解,最好采取大家都能理解的寫法。例如:不要寫成i+++j的形式,而應(yīng)寫成(i++)+j的形式2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
(3)在調(diào)用函數(shù)時,實參數(shù)的求值順序,C標(biāo)準(zhǔn)并無統(tǒng)一規(guī)定。例如:i的初值為3,如果有下面的函數(shù)調(diào)用:
printf(″%d,%d″,i,i++)
在有的系統(tǒng)中,從左至右求值,輸出“3,3”。在多數(shù)系統(tǒng)中對函數(shù)參數(shù)的求值順序是自右而左,輸出的是“4,3”。以上這種寫法不宜提倡,最好改寫成
j=i++;printf("%d,%d",j,i)
不要寫出別人看不懂的也不知道系統(tǒng)會怎樣執(zhí)行程序2.7算術(shù)運(yùn)算符和算術(shù)表達(dá)式
2.8各種數(shù)值類型數(shù)據(jù)間的轉(zhuǎn)換和運(yùn)算
2.8.1隱式轉(zhuǎn)換整型(包括int,short,long)、浮點型(包括float,double)可以混合運(yùn)算。在進(jìn)行運(yùn)算時,不同類型的數(shù)據(jù)要先轉(zhuǎn)換成同一類型,然后進(jìn)行運(yùn)算。轉(zhuǎn)換的目的是:(1)將短的數(shù)擴(kuò)展成機(jī)器處理的長度。(2)使得運(yùn)算符兩側(cè)的數(shù)據(jù)類型相同。例如:下面式子在C語言中是能夠通過類型轉(zhuǎn)換進(jìn)行計算的。63+’a’-16*8+15.95該類型轉(zhuǎn)換是由系統(tǒng)自動進(jìn)行的,轉(zhuǎn)換的規(guī)則:如圖(3)強(qiáng)制類型轉(zhuǎn)換運(yùn)算符
可以利用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符將一個表達(dá)式轉(zhuǎn)換成所需類型。
一般形式:(類型名)(表達(dá)式)例如:(double)a將a轉(zhuǎn)換成double類型(int)(x+y)將x+y的值轉(zhuǎn)換成整型(float)(5%3)將5%3的值轉(zhuǎn)換成float型2.8各種數(shù)值類型數(shù)據(jù)間的轉(zhuǎn)換和運(yùn)算
2.8各種數(shù)值類型數(shù)據(jù)間的轉(zhuǎn)換和運(yùn)算
說明:需要轉(zhuǎn)換的表達(dá)式應(yīng)該用括號括起來。在強(qiáng)制類型轉(zhuǎn)換時,得到一個所需類型的中間變量,原來變量的類型未發(fā)生變化。
floatx=3.6;inta;a=(int)x;注意:強(qiáng)制類型轉(zhuǎn)換實際上是一種單目運(yùn)算。各種數(shù)據(jù)類型名都可以用來作強(qiáng)制類型換的運(yùn)算符,如(char)、(int)、(float)等。
2.9賦值運(yùn)算符和賦值表達(dá)式
1.賦值運(yùn)算符和賦值表達(dá)式賦值符號“=”就是賦值運(yùn)算符,它的作用是將一個數(shù)據(jù)賦給一個變量。也可以將一個表達(dá)式的值賦給一個變量。
賦值運(yùn)算符按照“自右而左”的結(jié)合順序
賦值表達(dá)式是賦值運(yùn)算符將一個變量和一個表達(dá)式連接起來的式子。它的一般形式為:
<變量><賦值運(yùn)算符><表達(dá)式>下面是賦值表達(dá)式的例子:k=b=c=7k=5+(c=6)k=(b=5)+(c=4)k=(b=8)%(c=3)2.類型轉(zhuǎn)換如果賦值運(yùn)算符兩側(cè)的類型不一致,但都是數(shù)值型或字符型時,在賦值時要進(jìn)行類型轉(zhuǎn)換。
(1)將實型數(shù)據(jù)(單、雙精度)賦給整型變量,舍棄實數(shù)的小數(shù)部分,以整數(shù)形式存儲到變量中。如:i為整型變量,執(zhí)行“i=3.56”的結(jié)果是使i的值為3,以整數(shù)形式存儲在整型變量中。例2.11將實型數(shù)據(jù)賦值給整型變量。
(2)將double型數(shù)據(jù)賦給float型變量時,截取其前面7位有效數(shù)字,存放到float變量的存儲單元中(32bits)。但同樣應(yīng)注意數(shù)值范圍不能溢出。
2.9賦值運(yùn)算符和賦值表達(dá)式
(3)char型數(shù)據(jù)賦給int、short、long型整型變量時,由于字符只占1個字節(jié),而整型變量占2個字節(jié)或4個字節(jié),因此將字符數(shù)據(jù)(8個二進(jìn)制位)放到整型變量存儲單元的低8位中。有兩種情況如下。
①零擴(kuò)展:高位補(bǔ)零。②符號擴(kuò)展:按字符最高位(符號位為0或1)碼補(bǔ)高位。
2.9賦值運(yùn)算符和賦值表達(dá)式
(4)將一個int、short、long型數(shù)據(jù)賦給一個char型變量時,只將其低8位原封不動地送到char型變量(即高位截去)。若將一個long型數(shù)據(jù)賦給一個int型變量,只將long型數(shù)據(jù)中低16位原封不動地送到整型變量(即高位截去)。
例如:longa=32769;intb;b=a;2.9賦值運(yùn)算符和賦值表達(dá)式
(5)將unsignedint型數(shù)據(jù)賦給longint型變量時,不存在符號擴(kuò)展問題,只需將高位補(bǔ)0即可。
說明:不同類型的整型數(shù)據(jù)間的賦值歸根到底就是一條:按存儲單元中的存儲形式直接傳送。
例2.12不同數(shù)據(jù)類型間的賦值。
2.9賦值運(yùn)算符和賦值表達(dá)式
2.9賦值運(yùn)算符和賦值表達(dá)式
類型轉(zhuǎn)換小結(jié)如果表達(dá)式值的類型,與被賦值變量的類型不一致,但都是數(shù)值型或字符型時,系統(tǒng)自動地將表達(dá)式的值轉(zhuǎn)換成被賦值變量的數(shù)據(jù)類型,然后再賦值給變量。float\double
int去掉小數(shù)—>高位截取int
float\double按浮點數(shù)形式存儲double
float增加精度char
inta.高位補(bǔ)0b.符號擴(kuò)展int\short\long
char高位截取int
long符號擴(kuò)展unsignedint
long高位補(bǔ)0非Unsigned
unsigned原樣照賦
3.復(fù)合的賦值運(yùn)算符和賦值表達(dá)式在賦值運(yùn)算符“=”之前加上其他二目運(yùn)算符可構(gòu)成復(fù)合賦值符。即:+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=例如:a+=5等價于a=a+5x*=y+7等價于x=x*(y+7)r%=p等價于r=r%p2.9賦值運(yùn)算符和賦值表達(dá)式
討論1:賦值表達(dá)式也可以包含復(fù)合的賦值運(yùn)算符。
如:a+=a-=a*a分析:此賦值表達(dá)式的求解步驟如下∶①先進(jìn)行“a-=a*a”的運(yùn)算,它相當(dāng)于a=a-a*a,a的值為12-144=-132。②再進(jìn)行“a+=-132”的運(yùn)算,相當(dāng)于a=a+(-132),a的值為-132-132=-264。討論2:賦值表達(dá)式也可以包含復(fù)合的賦值運(yùn)算符。例如:若a為3,求下列表達(dá)式的值:a+=a-=a*=a2.9賦值運(yùn)算符和賦值表達(dá)式
討論3:將賦值表達(dá)式作為表達(dá)式的一種,使賦值操作不僅可以出現(xiàn)在賦值語句中,而且可以以表達(dá)式形式出現(xiàn)在其他語句(如輸出語句、循環(huán)語句等)中。如:printf("%d",a=b);
分析:如果b的值為3,則輸出a的值(也是表達(dá)式a=b的值)為3。在一個語句中完成了賦值和輸出雙重功能。2.9賦值運(yùn)算符和賦值表達(dá)式
2.10位運(yùn)算
運(yùn)算符含義運(yùn)算符含義
&按位與~取反
|按位或<<左移∧按位異或>>右移說明:(1)位運(yùn)算符中除~以外,均為二目(元)運(yùn)算符。(2)運(yùn)算量只能是整型或字符型的數(shù)據(jù),不能為實型數(shù)據(jù)。所謂位運(yùn)算是指進(jìn)行二進(jìn)制位的運(yùn)算。在系統(tǒng)軟件中,常要處理二進(jìn)制位的問題。例如,將一個存儲單元中的各二進(jìn)制位左移或右移一位,兩個數(shù)按位相加等。
C語言提供的位運(yùn)算符有:
2.10.1位運(yùn)算符及其功能
1.“按位與”運(yùn)算符(&)
&運(yùn)算是雙目運(yùn)算,其基本規(guī)則是將參加運(yùn)算的兩個數(shù)據(jù),按二進(jìn)制位進(jìn)行“按位與”運(yùn)算。
即:&0=00&1=01&0=01&1=1
例如:inta1=0x19,a2=0x35,b;b=a1&a2;注意:如果參加&運(yùn)算的是負(fù)數(shù)(如-3&-5),則要以補(bǔ)碼形式表示為二進(jìn)制數(shù),然后再按位進(jìn)行“與”運(yùn)算。2.10位運(yùn)算
按位與有一些特殊的用途:
(1)清零。若想對一個存儲單元清零,即使其全部二進(jìn)制位為0,只要找一個二進(jìn)制數(shù),其中各個位符合以下條件:原來的數(shù)中為1的位,新數(shù)中相應(yīng)位為0。然后使二者進(jìn)行&運(yùn)算,即可達(dá)到清零目的。2.10位運(yùn)算
(2)取一個數(shù)中某些指定位。
如有一個整數(shù)a(2個字節(jié)),想要取其中的低字節(jié),只需將a與8個1按位與即可。0010110010101100abc000000001111111100000000101011002.10位運(yùn)算
2“按位或”運(yùn)算符(|)|運(yùn)算是雙目運(yùn)算,其基本規(guī)則是將參加運(yùn)算的兩個數(shù)據(jù),按二進(jìn)制位進(jìn)行“按位或”運(yùn)算。即0|0=0,0|1=1,1|0=1,1|1=1例如:inta1=0x19,a2=0x35,b;b=a1|a2;2.10位運(yùn)算
“按位或”
運(yùn)算一個的用途示對一個數(shù)據(jù)的某些位定值為13.“按位異或”運(yùn)算符(∧)
∧運(yùn)算的功能是將參加運(yùn)算的兩個數(shù)據(jù),按位異或運(yùn)算,也稱XOR運(yùn)算符。即:
0∧0=00∧1=11∧0=11∧1=0
2.10位運(yùn)算
例如:inta1=0x19,a2=0x35,b;b=a1∧a2;則其運(yùn)算的情況如下:
例如:有01100110,想使其低4位翻轉(zhuǎn),即1變?yōu)?,0變?yōu)???梢詫⑺c0000111l進(jìn)行∧運(yùn)算,即01100110∧0000111l=01101001?!倪\(yùn)算符應(yīng)用:
(1)使特定位翻轉(zhuǎn)與0相∧,保留原值
01100110∧00001111
011010012.10位運(yùn)算
(2)交換兩個值,不用臨時變量。
例如:將a和b兩個整數(shù)的值互換,可以利用如下語句實現(xiàn):inta=0xff00,b=0x88aa;a=a∧b;b=b∧a;a=a∧b;
自己演算一下!4.“按位取反”運(yùn)算符(~)
~是一個單目運(yùn)算符,用來對一個二進(jìn)制數(shù)按位取反,即將0變l,將1變0。
即:
0=1~1=0
例如:(~)0000000000000101(5)1111111111111010(八進(jìn)制數(shù)177752)(-6)2.10位運(yùn)算
5.左移運(yùn)算符(<<)
<<是雙目運(yùn)算,其功能式將一個數(shù)的各個二進(jìn)制位全部左移若干位。其左邊是需要移位的對象,右邊是一個整型表達(dá)式,代表要左移的位數(shù)。移位時右端補(bǔ)0,左端移出的位棄舍。
例如:
inta=128,b;
b=a<<2;
2.10位運(yùn)算
注意:在實際應(yīng)用中,左移比乘法運(yùn)算快得多,有些C編譯程序自動將乘2的運(yùn)算用左移乘2n的冪運(yùn)算處理為左移n位。
例如:左移1位相當(dāng)于該數(shù)乘以2,左移2位相當(dāng)于該數(shù)乘以22=4,15<<2=60,即乘了4。但此結(jié)論只適用于該數(shù)左移時被溢出舍棄的高位中不包含1的情況。假設(shè)以一個字節(jié)(8位)存一個整數(shù),若a為無符號整型變量,則a=64時,左移一位時溢出的是0,而左移2位時,溢出的高位中包含1。2.10位運(yùn)算
6.右移運(yùn)算符(>>)>>是雙目運(yùn)算,其功能式將一個數(shù)的各個二進(jìn)制位全部右移若干位。>>運(yùn)算符左邊是需要移位的對象,右邊是一個整型表達(dá)式,代表要右移的位數(shù)。
移位時右端移出的位棄舍。對于unsigned數(shù)和正數(shù)左端補(bǔ)0,對于負(fù)數(shù)左端補(bǔ)1。注意:右移一位相當(dāng)于除以2右移n位相當(dāng)于除以2n。2.10位運(yùn)算
例如:inta1=9,a2=-8,b1,b2;b1=a1>>2;b2=a2>>2;2.10位運(yùn)算
在右移時,需要注意符號位問題:有的系統(tǒng)移入0,有的系統(tǒng)移入1。移入0的稱為“邏輯右移”,即簡單右移;移入1的稱為“算術(shù)右移”。TurboC++3.0和其他一些C編譯采用的是算術(shù)右移,即對有符號數(shù)右移時,如果符號位原來為1,左面移入高位補(bǔ)1。例如:2.10位運(yùn)算
k的值為十六進(jìn)制數(shù)0xf0f0k:1111000011110000(用二進(jìn)制形式表示)k>>1:0111100001111000(邏輯右移時)k>>l:1111100001111000(算術(shù)右移時)7.位運(yùn)算賦值運(yùn)算符
位運(yùn)算符與賦值運(yùn)算符可以組成復(fù)合賦值運(yùn)算符。例如:&=,|=,>>=,<<=,∧=例:a&=b相當(dāng)于a=a&ba<<=2相當(dāng)于a=a<<22.10位運(yùn)算
8.不同長度的數(shù)據(jù)進(jìn)行位運(yùn)算如果兩個數(shù)據(jù)長度不同(例如long型和int型),進(jìn)行位運(yùn)算時(如a&b,而a為long型,b為int型),系統(tǒng)會將二者按右端對齊。如果b為正數(shù),則左側(cè)16位補(bǔ)滿0;若b為負(fù)數(shù),左端應(yīng)補(bǔ)滿1;如果b為無符號整數(shù)型,則左側(cè)添滿0。2.10位運(yùn)算
2.10.2位運(yùn)算舉例
例2.13右移運(yùn)算符(>>)和按位與(&)位運(yùn)算符舉例。
#include"stdio.h"voidmain(){unsigneda,b;printf("inputanumber:");scanf("%d",&a);b=a>>3; /*a右移3位,將右移后的值賦給b*/printf("a=%d\tb=%d\n",a,b);b=b&9; /*將b和9按位與的值賦給b*/printf("a=%d\tb=%d\n",a,b);}2.10位運(yùn)算
程序運(yùn)行結(jié)果:inputanumber:127a=127b=15a=127b=9例2.14左移(<<)、右移(>>)、按位或(|)、按位與(&)位運(yùn)算符舉例。#include"stdio.h"voidmain(){chara=’a’,b=’b’;intp,c,d;p=a;p=(p<<2)|b;/*將p左移2位然后和b按位與運(yùn)算*/d=p&0xff;/*將p和0xff按位與運(yùn)算*/c=(p&0xff00)>>8;printf("a=%d\tb=%d\nc=%d\td=%d\n",a,b,c,d);}2.10位運(yùn)算
程序運(yùn)行結(jié)果:a=97b=98c=1d=2302.11逗號運(yùn)算符和逗號表達(dá)式
在C語言中“,”也是一種特殊的運(yùn)算符——逗號運(yùn)算符,又稱為“順序求值運(yùn)算符”。用逗號運(yùn)算符將若干個表達(dá)式連接起來的式子稱為逗號表達(dá)式。例如:3+5,a=14,b=4,a+b,r=a+b-2逗號表達(dá)式的一般形式可以擴(kuò)展為:表達(dá)式1,表達(dá)式2,表達(dá)式3,…,表達(dá)式n
逗號表達(dá)式的求解過程是:先求解表達(dá)式1,再求解表達(dá)式2,依次求到表達(dá)式n,表達(dá)式n的值就是整個逗號表達(dá)式的值。a的值為14,b的值為4.12,然后求解a+b,得18。整個逗號表達(dá)式的值為16。優(yōu)先級:逗號運(yùn)算符是所有運(yùn)算符中級別最低的賦值運(yùn)算符的優(yōu)先級別高于逗號運(yùn)算符,逗號運(yùn)算符是所有運(yùn)算符中級別最低的。
例如,下面兩個表達(dá)式的,作用是不同的:x=(a=5,7*3)x=a=8,6*2
前一個是一個賦值表達(dá)式,將一個逗號表達(dá)式的值賦給x,x的值等于21,同時變量a的值為5。后一個是逗號表達(dá)式,包括一個賦值表達(dá)式和一個算術(shù)表達(dá)式,x的值為8,整個逗號表達(dá)式的值為12,變量a的值為8。
2.11逗號運(yùn)算符和逗號表達(dá)式
3.1.1算法概念廣義地說,為解決一個問題而采取的方法和步驟,就稱為“算法”。要進(jìn)行程序設(shè)計,也必須要有進(jìn)行程序設(shè)計的算法。1.程序設(shè)計中的算法著名計算機(jī)科學(xué)家沃思提出一個公式
數(shù)據(jù)結(jié)構(gòu)+算法=程序即:一個程序應(yīng)包括兩個方面的內(nèi)容:對數(shù)據(jù)的描述:數(shù)據(jù)結(jié)構(gòu)(da
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024個人珠寶買賣合同范本
- 2024年度版權(quán)質(zhì)押合同:含版權(quán)內(nèi)容、質(zhì)押價值、質(zhì)權(quán)實現(xiàn)
- 旅游推廣合作合同實例
- 攝影棚居間服務(wù)合同樣本
- 房屋銷售合同模板手冊
- 樂團(tuán)合作合同范本大全
- 電子郵件服務(wù)租用協(xié)議
- 2024家教公司與兼職教師合作合同范本
- 企業(yè)房屋租賃合同范本
- 2024保密合同樣書范文
- 期末測試卷(試題)-2024-2025學(xué)年人教PEP版(2024)英語三年級上冊
- 2024至2030年中國手機(jī)配件產(chǎn)業(yè)需求預(yù)測及發(fā)展趨勢前瞻報告
- 2024年小學(xué)閩教版全冊英語詞匯表
- 課題開題匯報(省級課題)
- 清真食品安全管理制度
- 學(xué)校心理健康教育合作協(xié)議書
- 2024江蘇省沿海開發(fā)集團(tuán)限公司招聘23人(高頻重點提升專題訓(xùn)練)共500題附帶答案詳解
- 2024年初級社會體育指導(dǎo)員(游泳)技能鑒定考試題庫(含答案)
- 湖北省危險廢物監(jiān)管物聯(lián)網(wǎng)系統(tǒng)管理計劃填報說明
- Unit6ADayintheLife教學(xué)設(shè)計2024-2025學(xué)年人教版(2024)英語七年級上冊
- 2024年個人勞務(wù)承包合同書
評論
0/150
提交評論