



版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言初學者入門講座我們已經看到程序中使用的各種變量都應預先加以說明,即先說明,后使用。對變量的說明可以包括三個方面:數據類型存儲類型作用域在本講中,我們只介紹數據類型說明。其它說明在以后陸續介紹。所謂數據類型是按被說明量的性質,表示形式,占據存儲空間的多少,構造特點來劃分的。在C語言中,數據類型可分為:基本數據類型,構造數據類型,指針類型,空類型四大類。.基本數據類型基本數據類型最主要的特點是,其值不可以再分解為其它類型。也就是說,基本數據類型是自我說明的。.構造數據類型構造數據類型是根據已定義的一個或多個數據類型用構造的方法來定義的。也就是說,一個構造類型的值可以分解成若干個“成員”或“元素”。每個“成員”都是ー個基本數據類型或又是ー個構造類型。在c語言中,構造類型有以下幾種:數組類型結構類型聯合類型.指針類型指針是ー種特殊的,同時又是具有重要作用的數據類型。其值用來表示某個量在內存儲器中的地址。雖然指針變量的取值類似于整型量,但這是兩個類型完全不同的量,因此不能混為ー談。4.空類型在調用函數值時,通常應向調用者返回一個函數值。這個返回的函數值是具有一定的數據類型的,應在函數定義及函數說明中給以說明,例如在例題中給出的max函數定義中,函數頭為:出111?武山1ホ畝113);其中“1而”類型說明符即表示該函數的返回值為整型量。又如在例題中,使用了庫函數sin,由于系統規定其函數返回值為雙精度浮點型,因此在賦值語句s=sin(x);中,s也必須是雙精度浮點型,以便與sin函數的返回值一致。所以在說明部分,把s說明為雙精度浮點型。但是,也有一類函數,調用后并不需要向調用者返回函數值,這種函數可以定義為‘‘空類型"。其類型說明符為void。在本講中,我們先介紹基本數據類型中的整型、浮點型和字符型。其余類型在以后各講中陸續介紹。對于基本數據類型量,按其取值是否可改變又分為常量和變量兩種。在程序執行過程中,其值不發生改變的量稱為常量,取值可變的量稱為變量。它們可與數據類型結合起來分類。例如,可分為整型常量、整型變量、浮點常量、浮點變量、字符常量、字符變量、枚舉常量、枚舉變量。在程序中,常量是可以不經說明而直接引用的,而變量則必須先說明后使用。整型量整型量包括整型常量、整型變量。整型常量就是整常數。在C語言中,使用的整常數有ハ進制、十六進制和十進制三種。整型常量.ハ進制整常數八進制整常數必須以〇開頭,即以〇作為ハ進制數的前綴。數碼取值為〇?7。ハ進制數通常是無符號數。以下各數是合法的ハ進制數:015(十進制為13)0101(十進制為65)0177777(十進制為65535)以下各數不是合法的ハ進制數:256(無前綴0)03a2(包含了非ハ進制數碼)-0127(出現了負號).十六進制整常數十六進制整常數的前綴為Ox或Ox。其數碼取值為0?9,a?f或a?f。以下各數是合法的十六進制整常數:0x2a(卜進制為42) OxaO(十進制為160) Oxflfff(十進制為65535)以下各數不是合法的卜六進制整常數:5a(無前綴Ox) Ox3h(含有非十六進制數碼).I—進制整常數卜進制整常數沒有前綴。其數碼為〇?9。以下各數是合法的十進制整常數:237-568655351627以下各數不是合法的卜進制整常數:023(不能有前導0)23d(含有非十進制數碼)在程序中是根據前綴來區分各種進制數的。因此在書寫常數時不耍把前綴弄錯造成結果不正確。4.整型常數的后綴在16位字長的機器上,基本整型的長度也為16位,因此表示的數的范圍也是有限定的。十進制無符號整常數的范圍為〇?65535,有符號數為ー32768?+32767。ハ進制無符號數的表示范圍為0?0177777。十六進制無符號數的表示范圍為Ox〇?OxffTF或Ox〇?OxfHT。如果使用的數超過了上述范圍,就必須用長整型數來表示。長整型數是用后綴“ド或“1”來表示的。例如:十進制長整常數1581(十進制為158)3580001(十進制為ー358000)ハ進制長整常數0121(十進制為10)0771(十進制為63)02000001(十進制為65536)十六進制長整常數0x151(十進制為21)Oxa51(十進制為165)0x100001(十進制為65536)長整數1581和基本整常數158在數值上并無區別。但對1581,因為是長整型量,c編譯系統將為它分配4個字節存儲空間。而對158,因為是基本整型,只分配2個字節的存儲空間。因此在運算和輸出格式上要予以注意,避免出錯。無符號數也可用后綴表示,整型常數的無符號數的后綴為“u”或"u”。例如:358u,0x38au,2351u均為無符號數。前綴,后綴可同時使用以表示各種類型的數。如0xa51u表示十六進制無符號長整數a5,其十進制為165。顯示程序運行結果oflongx,y;inta,b,c,d;c=x+a;d=y+b;從程序中可以看到:x,y是長整型變量,a,b是基本整型變量。它們之間允許進行運算,運算結果為長整型。但c,d被定義為基本整型,因此最后結果為基本整型。本例說明,不同類型的量可以參與運算并相互賦值。其中的類型轉換是山編譯系統自動完成的。有關類型轉換的規則將在以后介紹。實型量實型常量實型也稱為浮點型。實型常量也稱為實數或者浮點數。在c語言中,實數只采用卜進制。它有二種形式:十進制數形式指數形式.十進制數形式由數碼〇?9和小數點組成。例如:0.01.25,5.789,0.13,5.0,300.,-267.8230等均為合法的實數。.指數形式由十進制數,加階碼標志“e”或"e”以及階碼(只能為整數,可以帶符號)組成。其一般形式為aen(a為十進制數,n為十進制整數)其值為a*10,n如:2.1e5(等于21?10,5),3.7e-2(等于3.7*10,)-2*)0.5e7(等于0.5*10,7),-2.8e-2(等于ー2.8*10,)-2*)以下不是合法的實數345(無小數點)e7(階碼標志e之前無數字)-5(無階碼標志)53.せ3(負號位置不對)2.7e(無階碼)標準c允許浮點數使用后綴。后綴為“f”或"f”即表示該數為浮點數。如356f和356.是等價的。例2.2說明了這種情況:voidmain()printf("%f\n%f\n",356.,356f);void指明main不返回任何值利用printf顯示結果結束實型變量實型變量分為兩類:單精度型和雙精度型,其類型說明符為float單精度說明符,double雙精度說明符。在turboc中單精度型占4個字節(32位)內存空間,其數值范圍為3.4e-38?3.4e+38,只能提供七位有效數字。雙精度型占8個字節(64位)內存空間,其數值范圍為1.7e-308~1.7e+308,可提供16位有效數字。實型變量說明的格式和書寫規則與整型相同。例如:floatx,y;(x,y為單精度實型量)doublea,b,c;(a,b,c為雙精度實型量)實型常數不分單、雙精度,都按雙精度double型處理。voidmain(){floata;doubleb;a=33333.33333;b=33333.33333333333333;printf(,,%f\n%f\n",a,b);此程序說明floatxdouble的不同a■■■■b■■■■■■■■a<—33333.33333b<—33333.33333333333;;顯示程序結果此程序說明float、double的不同floata;doubleb;a=33333.33333;b=33333.33333333333333;從本例可以看出,由于a是單精度浮點型,有效位數只有七位。而整數已占五位,故小數二位后之后均為無效數字。b是雙精度型,有效位為十六位。但turboc規定小數后最多保留六位,其余部分四舍五入。[practice]//floatinta=32;floatb;doubled;b=12345678;d=b*100;d=d+a;d=d+58.123456;?vtablea,2,32b,4,0.0d,8,0.0ofvtable?vupdate1,322,03,02,12345678.000003,12345678003,12345678323,1234567890.123456ofvupdateofpractice[practice]//linta=543;floatb;b=123.123962+a;b=b-100;a=b;~vtablea,2,543b,4,0.0ofvtable-vupdate1,5432,0.02,123.1239622,23.1239621,23ofvupdateofpractice字符型量字符型量包括字符常量和字符變量。字符常量字符常量是用單引號括起來的一"個字符。例如?,~?''?都是合法字符常量。在c語言中,字符常量有以下特點:.字符常量只能用單引號括起來,不能用雙引號或其它括號。.字符常量只能是單個字符,不能是字符串。.字符可以是字符集中任意字符。但數字被定義為字符型之后就不能參與數值運算。如~5?和5是不同的。~5ー是字符常量,不能參與運算。轉義字符轉義字符是ー種特殊的字符常量。轉義字符以反斜線‘へ"開頭,后跟ー個或幾個字符。轉義字符具有特定的含義,不同于字符原有的意義,故稱“轉義”字符。例如,在前面各例題printf函數的格式串中用到的“\n”就是ー個轉義字符,其意義是“回車換行”。轉義字符主要用來表示那些用一般字符不便于表示的控制代碼。常用的轉義字符及其含義轉義字符的意義\n回車換行\t橫向跳到卜.ー制表位置豎向跳格\b回車走紙換頁反斜線符"'"單引號符\a鳴鈴\ddd1?3位ハ進制數所代表的字符\xhh1?2位十六進制數所代表的字符廣義地講,c語言字符集中的任何ー個字符均可用轉義字符來表示。表2.2中的、ddd和\xhh正是為此而提出的。ddd和hh分別為ハ進制和十六進制的ascii代碼。如、101表示字?quot;a",\102表示字母"b",\134表示反斜線,\xoa表示換行等。轉義字符的使用。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);c調用printf顯示程序運行結果:printf("%d\n\t%d%d\n%d%d\t\b%d\n",a,b,c,a,b,c);程序在第一列輸出a值5之后就是“\n”,故回車換行;接著又是“\t”,于是跳到下一制表位置(設制表位置間隔為8),再輸出b值6:空二格再輸出c值7后又是"'n",因此再回車換行;再空二格之后又輸出a值5;再空三格又輸出b的值6;再次后"'t"跳到下ー制表位置(與上一行的6對齊),但下ー轉義字符“'b”又使退回一格,故緊挨著6再輸出c值70字符變量字符變量的取值是字符常量,即單個字符。字符變量的類型說明符是char。字符變量類型說明的格式和書寫規則都與整型變量相同。例如:chara,b;每個字符變量被分配ー個字節的內存空間,因此只能存放ー個字符。字符值是以ascii碼的形式存放在變量的內存單元之中的。如x的十進制ascii碼是120,y的十進制ascii碼是!2I0對字符變量a,b賦予?x?和?y?值:a=~x?;b=~y?;實際上是在a,b兩個單元內存放120和!21的二進制代碼:a01111000b01111001所以也可以把它們看成是整型量。c語言允許對整型變量賦以字符值,也允許對字符變量賦以整型值。在輸出時,允許把字符變量按整型量輸出,也允許把整型量按字符量輸出。整型量為二字節量,字符量為單字節量,當整型量按字符型量處理時,只有低八位字節參與處理。main(){chara,b;a=120;b=121;printf("%c,%c\n%d,%d\n,,,a,b,a,b);}a■b■a<-120b<—121顯示程序結果chara,b;a=120;b=121;本程序中說明a,b為字符型,但在賦值語句中賦以整型值。從結果看,a,b值的輸出形式取決于printf函數格式串中的格式符,當格式符為"c"時,對應輸出的變量值為字符,當格式符為"d"時,對應輸出的變量值為整數。voidmain(){chara,b;a=~x?;b=^y?;a=a-32;b=b-32;printfi[H%c,%c\n%d,%d\n",a,b,a,b);a,b被說明為字符變量并賦予字符值把小寫字母換成大寫字母以整型和字符型輸出本例中,a,b被說明為字符變量并賦予字符值,c語言允許字符變量參與數值運算,即用字符的ascii碼參與運算。山于大小寫字母的ascii碼相差32,因此運算后把小寫字母換成大寫字母。然后分別以整型和字符型輸出。[practice]//charinta=49;charb;chard;b=a+10;d=a+b;?vtablea,2,49b,l,隨機d,l,隨機ofvtable-vupdate1,492,隨機3,隨機2,?;?3,?1?ofvupdateofpractice[practice]//charcl,c2;c1=a~;c2-b~;c1=c1-32;c2=c2?32;?vtablec1,1,隨機c2,l,隨機ofvtable?vupdate1,隨機;2,隨機1,?a?;2,?b~1,?a?;2,?b~ofvupdateofpractice字符串常量字符串常量是由一對雙引號括起的字符序列。例如:"china","cprogram:,"$12.5"等都是合法的字符串常量。字符串常量和字符常量是不同的量。它們之間主要有以ド區別:.字符常量由單引號括起來,字符串常量山雙引號括起來。.字符常量只能是單個字符,字符串常量則可以含一個或多個字符。.可以把一個字符常量賦予ー個字符變量,但不能把一個字符串常量賦予ー個字符變量。在c語言中沒有相應的字符串變量。這是與basic語言不同的。但是可以用一個字符數組來存放ー個字符串常量。在數組ー章內予以介紹。4.字符常量占ー個字節的內存空間。字符串常量占的內存字節數等于字符串中字節數加1。增加的一個字節中存放字符"'0"(ascii碼為0)。這是字符串結束的標志。例如,字符串"cprogram"在內存中所占的字節為:cprogram、。。字符常量?a?和字符串常量"a"雖然都只有一個字符,但在內存中的情況是不同的。?a?在內存中占ー個字節,可表示為:a"a"在內存中占二個字節,可表示為:a\0符號常量符號常量在c語言中,可以用一個標識符來表示一個常量,稱之為符號常量。符號常量在使用之前必須先定義,其一般形式為:#define標識符常量其中#deRne也是一條預處理命令(預處理命令都?quot;#"開頭),稱為宏定義命令(在第九章預處理程序中將進ー步介紹),其功能是把該標識符定義為其后的常量值。ー經定義,以后在程序中所有出現該標識符的地方均代之以該常量值。習慣上符號常量的標識符用大寫字母,變量標識符用小寫字母,以示區別。#definepi3.14159voidmain(){floats,r;r=5;s=pi*r*r;printfi(Hs=%f\n",s);顯示程序結果floats,r;r=5;s=pi*r*r;本程序在主函數之前由宏定義命令定義pi為3.14159?在程序中即以該值代替pi。s=pi*r*r等效于s=3.14159*r*i?0應該注意的是,符號常量不是變量,它所代表的值在整個作用域內不能再改變。也就是說,在程序中,不能再用賦值語句對它重新賦值。變量的初值和類型轉換變量賦初值在程序中常常需要對變量賦初值,以便使用變量。語言程序中可有多種方法,在定義時賦以初值的方法,這種方法稱為初始化。在變量說明中賦初值的一般形式為:類型說明符變量1=值1,變量2=值2,……;例如:inta=b=c=5;floatx=3.2,y=3f,z=0.75;charch1=~k?,ch2=~p?;應注意,在說明中不允許連續賦值,如a=b=c=5是不合法的。voidmain(){inta=3,b,c=5;b=a+c;printf("a=%d,b=%d,c=%d\n,,,a,b,c);a<—3,b<ー〇,c<—5b<—a+c顯示程序運行結果變量類型的轉換變量的數據類型是可以轉換的。轉換的方法有兩種,ー種是自動轉換,一?種是強制轉換。自動轉換自動轉換發生在不同數據類型的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則:.若參與運算量的類型不同,則先轉換成同一類型,然后進行運算。.轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型后再進行運算。.所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再作運算。.char型和short型參與運算時,必須先轉換成int型。.在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四舍五入向前舍入。ド面程序段表示了類型自動轉換的規則。voidmain(){floatpi=3.14159;ints,r=5;s=r*r*pi;printf(Ms=%d\n,,,s);}pi<-3.14159s<-0,r<-5顯示程序運行結果:floatpi=3.14159;ints,r=5;s=r*r*pi;本例程序中,pi為實型;s,r為整型。在執行s=r*r*pi語句時,r和pi都轉換成double型計算,結果也為double型。但由于s為整型,故賦值結果仍為整型,舍去了小數部分。強制類型轉換強制類型轉換是通過類型轉換運算來實現的。其一般形式為:(類型說明符)(表達式)其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。例如:(float)a把a轉換為實型(int)(x+y)把x+y的結果轉換為整型在使用強制轉換時應注意以下問題:.類型說明符和表達式都必須加括號(單個變量可以不加括號),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之后再與y相加了。.無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變量的數據長度進行的臨時性轉換,而不改變數據說明時對該變量定義的類型。main(){floatf=5.75;printfC(im)q%d戶長ー5.75將floatf強制轉換成intffloat^5.75;printf("(int)f^%d,f=%f\n",(int)^f);本例表明,f雖強制轉為int型,但只在運算中起作用,是臨時的,而f本身的類型并不改變。因此,(int)f的值為5(刪去了小數)而f的值仍為5.75〇)、小于(=)、小于等于(<=)和不等于。=)六種。.邏輯運算符用于邏輯運算。包括與(&&)、或(||)、非(D三種。.位操作運算符參與運算的量,按二進制位進行運算。包括位與(&)、位或(|)、位非。)、位異或ビ)、左移(ラ*=)三類共十一種。.條件運算符這是ー個三目運算符,用于條件求值(?:)。.逗號運算符用于把若干-表達式組合成一個表達式(,)。.指針運算符用于取內容(*)和取地址(&)二種運算。.求字節數運算符用于計算數據類型所占的字節數(sizeof)。.特殊運算符有括號0,下標。,成員(一,.)等幾種。優先級和結合性c語言中,運算符的運算優先級共分為15級。1級最高,15級最低。在表達式中,優先級較高的先于優先級較低的進行運算。而在一個運算量兩側的運算符優先級相同時,則按運算符的結合性所規定的結合方向處理。C語言中各運算符的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算符的結合性是自左至右,即先左后右。如有表達式x-y+z則y應先與號結合,執行x-y運算,然后再執行+z的運算。這種自左至右的結合方向就稱為“左結合性”。而自右至左的結合方向稱為“右結合性”。最典型的右結合性運算符是賦值運算符。如x=y=z,由于“=”的右結合性,應先執行y=z再執行x=(y=z)運算。c語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。算術運算符和算術表達式基本的算術運算符.加法運算符“+”加法運算符為雙目運算符,即應有兩個量參與加法運算。如a+b,4+8等。具有右結合性。.減法運算符“-”減法運算符為雙目運算符。但“-”也可作負值運算符,此時為單目運算,如ーx,-5等具有左結合性。.乘法運算符“*”雙目運算,具有左結合性。.除法運算符“/”雙目運算具有左結合性。參與運算量均為整型時,結果也為整型,舍去小數。如果運算量中有一個是實型,則結果為雙精度實型。voidmain(){printf("\n\n%d,%d\n",20/7,-20/7);printfl["%f,%f?",20.0/7,-20.0/7);雙目運算具有左結合性。參與運算量均為整型時,結果也為整型,舍去小數。如果運算量中有一個是實型,則結果為雙精度實型。printf("\n\n%d,%d\n",20/7,-20/7);printf("%f;%f\n",20.0/7,-20.0/7);本例中,20/7,-20/7的結果均為整型,小數全部舍去。而20.0/7和-20.0/7由于有實數參與運算,因此結果也為實型。.求余運算符(模運算符)“%”雙目運算,具有左結合性。要求參與運算的量均為整型。求余運算的結果等于兩數相除后的余數。voidmain(){printグ%d\n”,100%3);雙目運算,具有左結合性。求余運算符%要求參與運算的量均為整型。本例輸出100除以3所得的余數k自增1,自減1運算符自增1運算符記為其功能是使變量的值自增1。自減1運算符記為“??”,其功能是使變量值自減1。自增1,自減1運算符均為單目運算,都具有右結合性。可有以下幾種形式:Hii自增1后再參與其它運算。--ii自減1后再參與其它運算。i—i參與運算后,i的值再自增1〇i-i參與運算后,i的值再自減1。在理解和使用上容易出錯的是計+和i-〇特別是當它們出在較復雜的表達式或語句中時,常常難于弄清,因此應仔細分析。voidmain(){inti=8;printf(M%d\nM,++i);printf(M%d\n",-i);printf(M%d\n,,,i++);printfC%d\n”,i??);printfC%d\n”,-i++);printf(M%d\n",-i-);}i<-8i<—i+li<—i+1i<-i-li<—i+li<—i-1inti=8;printf("%d\n",++i);printf("%d\n",-i);printf("%d\n",i++);printf("%d\n",i-);printf("%d\n",-i++);printf("%d\n",-i-);i的初值為8第2行i加1后輸出故為9;第3行減1后輸出故為8;第4行輸出i為8之后再加1(為9);第5行輸出i為9之后再減1(為8);第6行輸出ー8之后再加1(為9);第7行輸出ー9之后再減1(為8)voidmain(){inti=5j=5,p,q;p=(i++>Hi++)+(i++);q=(++j)+(++j)+(++j);printf("%d,%d,%d,%d",p,q,i,j);)i<-5,j<-5,p<-O,qqinti=5j=5,p,q;p=(i++)+(i++)+(i++);q=(+4毋(++j)+(++j);這個程序中,對尸(i++)+(i++)+(i++)應理解為三個1相加,故p值為15。然后i再自增1三次相當于加3故i的最后值為8。而對于q的值則不然,q=(++j)+(+tj)+(++j)應理解為q先自增1,再參與運算,由于q自增1三次后值為8,三個8相加的和為24,j的最后值仍為8。算術表達式表達式是由常量、變量、函數和運算符組合起來的式子。一個表達式有ー個值及其類型,它們等于計算表達式所得結果的值和類型。表達式求值按運算符的優先級和結合性規定的順序進行。単個的常量、變量、函數可以看作是表達式的特例。算術表達式是由算術運算符和括號連接起來的式子,以下是算術表達式的例子:a+b(a*2)/c(x+r)*8-(a+b)/7 ++isin(x)+sin(y)(++i)-(j++)+(k-)賦值運算符和賦值表達式簡單賦值運算符和表達式,簡單賦值運算符記為“="。由“=”連接的式子稱為賦值表達式。其一般形式為:變量=表達式例如:x=a+bw=sin(a)+sin(b)y=i+++-j賦值表達式的功能是計算表達式的值再賦予左邊的變量。賦值運算符具有右結合性。因此:a=b=c=5可理解為a=(b=(c=5))在其它高級語言中,賦值構成了一個語句,稱為賦值語句。而在c中,把“=”定義為運算符,從而組成賦值表達式。凡是表達式可以出現的地方均可出現賦值表達式。例如,式子x=(a=5)+(b=8)是合法的。它的意義是把5賦予a,8賦予b,再把a,b相加,和賦予x,故x應等于13。在c語言中也可以組成賦值語句,按照c語言規定,任何表達式在其未尾加上分號就構成為語句。因此如x=8;a=b=c=5;都是賦值語句,在前面各例中我們已大量使用過了。如果賦值運算符兩邊的數據類型不相同,系統將自動進行類型轉換,即把賦值號右邊的類型換成左邊的類型。具體規定如下:.實型賦予整型,舍去小數部分。前面的例2.9已經說明了這種情況。.整型賦ア實型,數值不變,但將以浮點形式存放,即增加小數部分(小數部分的值為0)o.字符型賦予整型,由于字符型為ー個字節,而整型為二個字節,故將字符的ascii碼值放到整型量的低八位中,高八位為〇。.整型賦予字符型,只把低八位賦予字符量。voidmain(){inta,b=322;floatx,y=8.88;charcl=~k~,c2;a=y;x=b;a=cl;c2=b;printfi[H%d,%f>%d,%c",a,x,a,c2);}inta,b=322;floatx,y=8.88;charcl-k~,c2;pr血ff%d,%f,%d,%c”,a=y,x=b,a=cl,c2=b);本例表明了上述賦值運算中類型轉換的規則。a為整型,賦予實型量y值888后只取整數8。x為實型,賦予整型量b值322,后增加了小數部分。字符型量c!賦予a變為整型,整型量b賦予c2后取其低八位成為字符型(b的低八位為01000010,即十進制66,按ascii碼對應于字符b)。復合賦值符及表達式在賦值符“=”之前加上其它二目運算符可構成復合賦值符。如+=,=,*=,/=,%=,=,&=,ハ=ノ=。構成復合賦值表達式的一般形式為:變量雙目運算符=表達式它等效于變量=變量運算符表達式例如:a+=5等價于a=a+5x*=y+7等價于x=x*(y+7)r%=p等價于r=r%p復合賦值符這種寫法,對初學者可能不習慣,但十分有利于編譯處理,能提高編譯效率并產生質量較高的目標代碼。逗號運算符和逗號表達式在逗號運算符C語言中逗號'‘,"也是一種運算符,稱為逗號運算符。其功能是把兩個表達式連接起來組成一個表達式,稱為逗號表達式。其一般形式為:表達式1,表達式2其求值過程是分別求兩個表達式的值,并以表達式2的值作為整個逗號表達式的值。voidmain(){inta=2,b=4,c=6,x,y;y=(x=a+b),(b+c);printf("尸%d,x=%d",y,x);a<—2,b<—4,c<—6,x<—0,y<—0x<—a+b,y<…b+c本例中,y等于整個逗號表達式的值,也就是表達式2的值,x是第一個表達式的值。對于逗號表達式還要說明兩點:.逗號表達式一般形式中的表達式1和表達式2也可以又是逗號表達式。例如:表達式1,(表達式2,表達式3)形成了嵌套情形。因此可以把逗號表達式擴展為以下形式:表達式1,表達式2,…表達式n整個逗號表達式的值等于表達式n的值。.程序中使用逗號表達式,通常是要分別求逗號表達式內各表達式的值,并不一定要求整個逗號表達式的值。.并不是在所有出現逗號的地方都組成逗號表達式,如在變量說明中,函數參數表中逗號只是用作各變量之間的間隔符。[practice]//arithmeticinta,b,c;floatd;a=ll;b=235;c=a+b-a*b;d=(float)c/(float)a;a=c/a;~vtablea,2,0b,2,0c,2,0d,4,0.0ofvtable-vupdatel,0;2,0;3,04,0.0UI2,2353,-23394,-212.6363681,-212ofvupdateofpractice[practice]//linta,b,cl,c2;a=25;b=3243;cl=b/a;c2=b%a;?vtablea,2,0b,2,0cl,2,0c2,2,0ofvtable~vupdatel,0;2,0;3,0;4,01,252,32433,1294,18ofvupdateofpractice[practice]//linta,b,c;a=25;b=40;c=a+b,c+35;-vtablea,2,0b,2,0c,2,0ofvtable?vupdatel,0;2,0;3,01,252,403,65ofvupdateofpractice小結.c的數據類型基本類型,構造類型,指針類型,空類型.基本類型的分類及特點類型說明符字節數值范圍字符型char1c字符集基本整型int■32768?32767短整型shortint■32768?32767長整型!ongint-214783648?214783647無符號型unsigned〇?65535無符號長整型unsignedlong〇?4294967295單精度實型float3/4e-38?3/4e+38雙精度實型doublel/7e-308-l/7e+3083.常量后綴1或1長整型u或u無符號數f或f浮點數整數,長整數,無符號數,浮點數,字符,字符串,符號常數,轉義字符。.數據類型轉換,自動轉換在不同類型數據的混合運算中,由系統自動實現轉換,由少字節類型向多字節類型轉換。不同類型的量相互賦值時也由系統自動進行轉換,把賦值號右邊的類型轉換為左邊的類型。?強制轉換由強制轉換運算符完成轉換。.運算符優先級和結合性一般而言,單目運算符優先級較高,賦值運算符優先級低。算術運算符優先級較高,關系和邏輯運算符優先級較低。多數運算符具有左結合性,單目運算符、三目運算符、賦值.表達式表達式是由運算符連接常量、變量、函數所組成的式子。每個表達式都有一個值和類型。表達式求值按運算符的優先級和結合性所規定的順序進行。從程序流程的角度來看,程序可以分為三種基本結構,即順序結構、分支結構、循環結構。這三種基本結構可以組成所有的各種復雜程序。c語言提供了多種語句來實現這些程序結構。本文將介紹這些基本語句及其應用,使讀者對c程序有一個初步的認識,為以后的學習打下基礎。C程序的語句C程序的執行部分是由語句組成的。程序的功能也是由執行語句實現的。C語句可分為以下五類:.表達式語句.函數調用語句.控制語句.復合語句.空語句.表達式語句表達式語句由表達式加上分號“;”組成。其一般形式為:表達式;執行表達式語句就是計算表達式的值。例如:x=y+z;賦值語句y+z;加法運算語句,但計算結果不能保留,無實際意義i++;自增1語句,i值增1.函數調用語句由函數名、實際參數加上分號“;”組成。其一般形式為;函數名(實際參數表);執行函數語句就是調用函數體并把實際參數賦予函數定義中的形式參數,然后執行被調函數體中的語句,求取函數值。(在第五章函數中再詳細介紹)例如printf("cprogram");調用庫函數,輸出字符串。.控制語句控制語句用于控制程序的流程,以實現程序的各種結構方式。它們由特定的語句定義符組成。c語言有九種控制語句。可分成以下三類:(1)條件判斷語句if語句,switch語句(2)循環執行語句dowhile語句,while語句,fbr語句(3)轉向語句break語句,goto語句,continue語句,return語句.復合語句把多個語句用括號{}括起來組成的一個語句稱復合語句。在程序中應把復合語句看成是單條語句,而不是多條語句,例如a=b+c;printfif"%d%d”,x,a);}0)z=x;因為=丫+5;是語句,不能出現在表達式中。運算符的種類、優先級和結合性c語言中運算符和表達式數量之多,在高級語言中是少見的。正是豐富的運算符和表達式使c語言功能十分完善。這也是c語言的主要特點之一。)、小于(=)、小于等于(<=)和不等于(!=)六種。.邏輯運算符用于邏輯運算。包括與(&&)、或(||)、非。)三種。.位操作運算符參與運算的量,按二進制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(八)、左移(=,?=)三類共十一種。.條件運算符這是ー個三目運算符,用于條件求值(?:)。.逗號運算符用于把若干表達式組合成一個表達式(,)。.指針運算符用于取內容(*)和取地址(&)二種運算。.求字節數運算符用于計算數據類型所占的字節數(sizeof)。有括號〇,下標口,成員(f,.)等幾種。優先級和結合性c語言中,運算符的運算優先級共分為15級。1級最高,15級最低。在表達式中,優先級較高的先于優先級較低的進行運算。而在一個運算量兩側的運算符優先級相同時,則按運算符的結合性所規定的結合方向處理。c語言中各運算符的結合性分為兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算符的結合性是自左至右,即先左后右。如有表達式x-y+z則y應先與號結合,執行x-y運算,然后再執行+z的運算。這種自左至右的結合方向就稱為“左結合性”。而自右至左的結合方向稱為“右結合性”。最典型的右結合性運算符是賦值運算符。如xチz,由于''=”的右結合性,應先執行y=z再執行x=(y=z)運算。c語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。算術運算符和算術表達式基本的算術運算符.加法運算符“+”加法運算符為雙目運算符,即應有兩個量參與加法運算。如a+b,4+8等。具有右結合性。.減法運算符減法運算符為雙目運算符。但也可作負值運算符,此時為單目運算,如ーX,-5等具有左結合性。.乘法運算符"*”雙目運算,具有左結合性。.除法運算符“/”雙目運算具有左結合性。參與運算量均為整型時,結果也為整型,舍去小數。如果運算量中有一個是實型,則結果為雙精度實型。voidmain(){printfCMi^d^dWgO。,.2。々);printfCM%f;%f\nw,20.0/7,-20.0/7);雙目運算具有左結合性。參與運算量均為整型時,結果也為整型,舍去小數。如果運算量中有一個是實型,則結果為雙精度實型。printf("\n\n%d,%d\n",20/7,-20/7);printf("%f,%f\n",20.0/7,-20.0/7);本例中,20/7,-20/7的結果均為整型,小數全部舍去。而20.0/7和-20.0/7由于有實數參與運算,因此結果也為實型。.求余運算符(模運算符)“%”雙目運算,具有左結合性。要求參與運算的量均為整型。求余運算的結果等于兩數相除后的余數。voidmain(){printf(M%d\n,,,100%3);雙目運算,具有左結合性。求余運算符%要求參與運算的量均為整型。本例輸出100除以3所得的余數!o自增1,自減1運算符自增1運算符記為其功能是使變量的值自增1。自減1運算符記為“-”,其功能是使變量值自減1。自增I,自減1運算符均為單目運算,都具有右結合性。可有以下幾種形式:++ii自增1后再參與其它運算。-ii自減1后再參與其它運算。i++i參與運算后,i的值再自增1。i-i參與運算后,i的值再自減1。在理解和使用上容易出錯的是i++和iー。特別是當它們出在較復雜的表達式或語句中時,常常難于弄清,因此應仔細分析。voidmain(){inti=8;printf(M%d\nM,++i);pr血f("%d\n”,??i);printグ%d\n”,i++);printf(M%d\n",i-);printfC%d\n”,-i++);printfi(,,%d\n,,,-i-);}i<-8i<—i+1i<-i-li<—i+1i<-i+li<—i-1inti=8;printf(M%d\n",++i);printf(M%d\n",-i);printf(n%d\n",i++);printfi(,,%d\n",i-);pHntf("%d\n”,?i++);printグ%dH■一);i的初值為8第2行i加1后輸出故為9;第3行減1后輸出故為8:第4行輸出i為8之后再加1(為9);第5行輸出i為9之后再減1(為8);第6行輸出ー8之后再加1(為9);第7行輸出ー9之后再減1(為8)voidmain(){inti=5j=5,p,q;p=(i++)+(i-H-)+(i-H-);q=(zj)+(++j)+(++j);printfl["%d,%d,%d,%d",p,q,ij);i<-5j<-5,p<--O,qqinti=5j=5,p,q;p=(i-H-)+(i++)+(i++);q=(++j)+(++j)+(++j);這個程序中,對p=(i++)+(i++)+(i++)應理解為三個i相加,故p值為15。然后i再自增1三次相當于加3故i的最后值為8。而對于q的值則不然,q=(++j)+(+ザ)+(++j)應理解為q先自增1,再參與運算,由于q自增1三次后值為8,三個8相加的和為24,j的最后值仍為8?算術表達式表達式是由常量、變量、函數和運算符組合起來的式子。一個表達式有ー個值及其類型,它們等于計算表達式所得結果的值和類型。表達式求值按運算符的優先級和結合性規定的順序進行。單個的常量、變量、函數可以看作是表達式的特例。是由算術運算符和括號連接起來的式子,以下是算術表達式的例子:a+b(a*2)/c(x+r)*8-(a+b)/7 ++isin(x)+sin(y)(++i)-(j-H-)+(k-)賦值運算符和賦值表達式簡單賦值運算符和表達式,簡単賦值運算符記為“="。由“=”連接的式子稱為賦值表達式。其一般形式為:變量=表達式例如:x=a+bw=sin(a)+sin(b)y=i+++-j賦值表達式的功能是計算表達式的值再賦予左邊的變量。賦值運算符具有右結合性。因此a=b=c=5可理解為a=(b=(c=5))在其它高級語言中,賦值構成了一個語句,稱為賦值語句。而在c中,把“=”定義為運算符,從而組成賦值表達式。凡是表達式可以出現的地方均可出現賦值表達式。例如,式子x=(a=5)+(b=8)是合法的。它的意義是把5賦アa,8賦予b,再把a,b相加,和賦予x,故x應等于13。在c語言中也可以組成賦值語句,按照c語言規定,任何表達式在其未尾加上分號就構成為語句。因此如x=8;a=b=c=5:都是賦值語句,在前面各例中我們已大量使用過了。如果賦值運算符兩邊的數據類型不相同,系統將自動進行類型轉換,即把賦值號右邊的類型換成左邊的類型。具體規定如下:.實型賦予整型,舍去小數部分。前面的例2.9已經說明了這種情況。.整型賦予實型,數值不變,但將以浮點形式存放,即增加小數部分(小數部分的值為0),.字符型賦予整型,由于字符型為ー個字節,而整型為二個字節,故將字符的ascii碼值放到整型量的低八位中,高八位為〇。.整型賦予字符型,只把低八位賦予字符量。voidmain(){inta,b=322;floatx,y=8.88;charcl=~k~,c2;a=y;x=b;a=cl;c2=b;printfi(M%d,%f;%d,%c",a,x,a,c2);)inta,b=322;floatx,y=8.88;charcl=k-,c2;printfi(,,%d,%f,%d,%c,,,a=y,x=b,a=c1,c2=b);本例表明了上述賦值運算中類型轉換的規則。a為整型,賦予實型量y值888后只取整數8。x為實型,賦予整型量b值322,后增加了小數部分。字符型量cl賦予a變為整型,整型量b賦予c2后取其低八位成為字符型(b的低八位為01000010,即十進制66,按ascii碼對應于字符b)?復合賦值符及表達式在賦值符“="之前加上其它二目運算符可構成復合賦值符。如+=,-=,*=,/=,%=,=,&=,A=,|=O構成復合賦值表達式的一般形式為:變量雙目運算符=表達式它等效于變量=變量運算符表達式例如:a+=5等價于a=a+5x*=y+7等價于x=x*(y+7)r%=p等價于r=r%p復合賦值符這種寫法,對初學者可能不習慣,但十分有利于編譯處理,能提高編譯效率并產生質量較高的目標代碼。逗號運算符和逗號表達式在逗號運算符c語言中逗號“,”也是ー種運算符,稱為逗號運算符。其功能是把兩個表達式連接起來組成一個表達式,稱為逗號表達式。其一般形式為:表達式1,表達式2其求值過程是分別求兩個表達式的值,并以表達式2的值作為整個逗號表達式的值。voidmain(){inta=2,b=4,c=6,x,y;y=(x=a+b),(b+c);printf("產%d,x=%d",y,x);)a<-2,b<—4,c<—6,x<—0,y<—0x<—a+b,y<b+c本例中,y等于整個逗號表達式的值,也就是表達式2的值,x是第一個表達式的值。對于逗號表達式還要說明兩點:.逗號表達式一般形式中的表達式1和表達式2也可以又是逗號表達式。例如:表達式1,(表達式2,表達式3)形成了嵌套情形。因此可以把逗號表達式擴展為以下形式:表達式1,表達式2,…表達式n整個逗號表達式的值等于表達式n的值。.程序中使用逗號表達式,通常是要分別求逗號表達式內各表達式的值,并不一定要求整個逗號表達式的值。.并不是在所有出現逗號的地方都組成逗號表達式,如在變量說明中,函數參數表中逗號只是用作各變量之間的間隔符。數據輸出語句本小節介紹的是向標準輸出設備顯示器輸出數據的語句。在c語言中,所有的數據輸入/輸出都是由庫函數完成的。因此都是函數語句。本小節先介紹printf函數和putchar函數。printf函數printf函數稱為格式輸出函數,其關鍵字最末一個字母f即為“格式"(format)之意。其功能是按用戶指定的格式,把指定的數據顯示到顯示器屏幕上。在前面的例題中我們已多次使用過這個函數。ー、printf函數調用的一般形式printf函數是ー個標準庫函數,它的函數原型在頭文件“stdio.h”中。但作為ー個特例,不要求在使用printf函數之前必須包含stdio.h文件。printf函數調用的一般形式為:printf(“格式控制字符串”,輸出表列)其中格式控制字符串用于指定輸出格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。如“%d”表示按十進制整型輸出,“%Id”表示按十進制長整型輸出,“%c”表示按字符型輸出等。后面將專門給予討論。非格式字符串在輸出時原樣照印,在顯示中起提示作用。輸出表列中給出了各個輸出項,要求格式字符串和各輸出項在數量和類型上應該ーー對應。voidmain()(inta=88,b=89;printf("%d%d\nH,a,b);printf(M%d,%d\nM,a,b);primfV'%c,%c\n”,a,b);printf(Ma=%d,b=%dM,a,b);)a<-8,b<-89printグ%d%d\nH,a,b);printf(M%d,%d\nM,a,b);printf(,,%c,%c\n",a,b);printf("a=%d,b=%dn,a,b);本例中四次輸出了a,b的值,但由于格式控制串不同,輸出的結果也不相同。第四行的輸出語句格式控制串中,兩格式串%d之間加了一個空格(非格式字符),所以輸出的a,b值之間有一個空格。第五行的printf語句格式控制串中加入的是非格式字符逗號,因此輸出的a,b值之間加了一個逗號。第六行的格式串要求按字符型輸出a,b值。第七行中為了提示輸出結果又增加了非格式字符串二、格式字符串在turboc中格式字符串的一般形式為:[標志][輸出最小寬度兒精度][長度]類型其中方括號口中的項為可選項。各項的意義介紹如下:1.類型類型字符用以表示輸出數據的類型,其格式符和意義下表所示:表示輸出類型的格式字符格式字符意義d以十進制形式輸出帶符號整數(正數不輸出符號)〇以八進制形式輸出無符號整數(不輸出前綴〇)x以十六進制形式輸出無符號整數(不輸出前綴ox)u以十進制形式輸出無符號整數f以小數形式輸出單、雙精度實數e以指數形式輸出單、雙精度實數g以%f%e中較短的輸出寬度輸出單、雙精度實數c輸出單個字符 s輸出字符串2標志標志字符為ー、+、#、空格四種,其意義下表所示:標志格式字符標志意義ー結果左對齊,右邊填空格+輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號#對c,s,d,u類無影響:對。類,在輸出時加前綴。對x類,在輸出時加前綴Ox:對e,g,f類當結果有小數時オ給出小數點.輸出最小寬度用十進制整數來表示輸出的最少位數。若實際位數多于定義的寬度,則按實際位數輸出,若實際位數少于定義的寬度則補以空格或0。.精度精度格式符以開頭,后跟十進制整數。本項的意義是:如果輸出數字,則表示小數的位數;如果輸出的是字符,則表示輸出字符的個數;若實際位數大于所定義的精度數,則截去超過的部分。5.長度長度格式符為h,l兩種,h表示按短整型量輸出,1表示按長整型量輸出。voidmain(){inta=15;floatb=138.3576278;double¢=35648256.3645687;chard-p~;printf(,,a=%d,%5d,%o,%x\n,,,a,a,a,a);printf(Hb=%f,%lf,%5.41f,%e\nH,b,b,b,b);printfCc=%lf,%f,%8.41f^M,c,c,c);printf(,,d=%c,%8c\nH,d,d);}a<-15b<-138.3576278¢<-35648256.3645687d<-p?main(){inta=29;floatb=1243.2341;double¢=24212345.24232;¢harc=~h~printf('la=%d,%5d,%o,%x\n",a,a,a,a);printfi[Mb=%f,%lf,%5.41f,%e\n,,,b,b,b,b);printf(k=%lf,%f,%8.41f\nbcc);printf("d=%g%8dn”,d,d);}本例第七行中以四種格式輸出整型變量a的值,其中“%5d”要求輸出寬度為5,而a值為15只有兩位故補三個空格。第ハ行中以四種格式輸出實型量b的值。其中“%f”和“%lf”格式的輸出相同,說明“1”符對“f”類型無影響。’'%5.41f”指定輸岀寬度為5,精度為4,由于實際長度超過5故應該按實際位數輸出,小數位數超過4位部分被截去。第九行輸出雙精度實數,''%8.41f”由于指定精度為4位故截去了超過4位的部分。第十行輸出字符量d,其中“%bc”指定輸出寬度為8故在輸出字符p之前補加7個空格。使用printf函數時還要注意一個問題,那就是輸出表列中的求值順序。不同的編譯系統不一定相同,可以從左到右,也可從右到左。turboc是按從右到左進行的。如把例2.13改寫如下述形式;voidmain(){inti=8;printfi["%d\n%d\n%d\n%d\n%d\n%d\n",++i,-i,i-,i-H-,-i-);i<-8這個程序與例2.13相比只是把多個printf語句改ー個printf語句輸出。但從結果可以看出是不同的。為什么結果會不同呢?就是因為printf函數對輸出表中各量求值的順序是自右至左進行的。在式中,先對最后一項“メー”求值,結果為ー8,然后i自減1后為7。再對“-i++”項求值得一7,然后i自增1后為8。再對“i-”項求值得8,然后i再自減1后為?〇再求‘‘i++”項得7,然后i再自增1后為8。再求''-i”項,i先自減1后輸出,輸出值為7。最后オ求輸出表列中的第一項“++i”,此時i自增1后輸出8。但是必須注意,求值順序雖是自右至左,但是輸出順序還是從左至右,因此得到的結果是上述輸出結果。字符輸出函數putchar函數putchar函數是字符輸出函數,其功能是在顯示器上輸出單個字符。其一般形式為:putchar(字符變量)例如:putchar(-a-);輸出大寫字母aputchar(x);輸出字符變量x的值putchar(?\n~);換行對控制字符則執行控制功能,不在屛幕上顯示。使用木函數前必須要用文件包含命令:#include#includevoidmain(){chara=~b~,b=~o~,c=~k~;putchar(a);putchar(b);putchar(b);putchar(c);putchar(~\t~);putchar(a);putchar(b);putchar(?\n?);putchar(b);putchar(c);數據輸入語句c語言的數據輸入也是山函數語句完成的。本節介紹從標準輸入設備一鍵盤上輸入數據的函數scanf和getchar。scanf函數scanf函數稱為格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中。ー、scanf函數的一般形式a567a為變量名,567是變量的值,&a是變量a的地址。在賦值表達式中給變量賦值,如:a=56?在賦值號左邊是變量名,不能寫地址,而scanf函數在本質上也是給變量賦值,但要求寫變量的地址,如&a。這兩者在形式上是不同的。&是ー個取地址運算符,&a是ー個表達式,其功能是求變量的地址。voidmain(){inta,b,c;printfif*inputa,b,c\nM);scanf(M%d%d%dH,&a,&b,&c);printf(,*a=%d,b=%d,c=%d,,,a,b,c);)注意&的用法!在本例中,由于scanf函數本身不能顯示提示串,故先用printf語句在屏幕上輸出提示,請用戶輸入a、b、c的值。執行scanf語句,則退出tc屏幕進入用戶屏幕等待用戶輸入。用戶輸入7、8、9后按下回車鍵,此時,系統又將返回tc屏幕。在scanf語句的格式串中由于沒有非格式字符在"%d%d%d”之間作輸入時的間隔,因此在輸入時要用一個以上的空格或回車鍵作為每兩個輸入數之間的間隔。如:789或789格式字符串格式字符串的一般形式為:%[*][輸入數據寬度][長度]類型其中有方括號口的項為任選項。各項的意義如下:.類型表示輸入數據的類型,其格式符和意義下表所示。格式字符意義 d輸入十進制整數〇輸入ハ進制整數x輸入十六進制整數u輸入無符號十進制整數f或e輸入實型數(用小數形式或指數形式)C輸入單個字符S輸入字符串.“”符用以表示該輸入項讀入后不賦予相應的變量,即跳過該輸入值。如scanf("%d%*d%d",&a,&b);當輸入為:123時,把1賦予a,2被跳過,3賦予%.寬度用卜進制整數指定輸入的寬度(即字符數)。例如:scanf("%5d",&a);輸入:12345678只把12345賦予變量a,其余部分被截去。又如:scanf("%4d%4d",&a,&b);輸入:12345678將把1234賦予a,而把5678賦予b。.長度長度格式符為1和h,1表示輸入長整型數據(如%Id)和雙精度浮點數(如%If)。h表示輸入短整型數據。使用scanf函數還必須注意以下幾點:scanf函數中沒有精度控制,如:scanfi["%5.2f',&a);是非法的。不能企圖用此語句輸入小數為2位的實數。scanf中要求給出變量地址,如給出變量名則會出錯。如scanf("%d",a);是非法的,應改為scnaf("%d",&a);オ是合法的。c.在輸入多個數值數據時,若格式控制串中沒有非格式字符作輸入數據之間的間隔則可用空格,tab或回車作間隔。c編譯在碰到空格,tab,回車或非法數據(如對“%d”輸入“12a”時,a即為非法數據)時即認為該數據結束。d,在輸入字符數據時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有效字符。例如:scanf("%c%c%c",&a,&b,&c);輸入為:def則把~d?賦予a,?f-賦予b,~e?賦予c。只有當輸入為:defHj,才能把?dー賦于a,~e~賦予b,?賦予c。如果在格式控制中加入空格作為間隔,如scanf("%c%c%c",&a,&b,&c);則輸入時各數據之間可加空格。voidmain(){chara,b;printfif4nputcharactera,b\nH);scanff%c%c”,&a,&b);printff'%c%c\n”,a,b);scanffy14fl4%c%c”,&a,&b);printf(M%c%c\nM,a,b);由于scanf函數"%c%c”中沒有空格,輸入mn,結果輸出只有m。而輸入改為mn時則可輸出mn兩字符,見下面的輸入運行情況:inputcharactera,bmnmnvoidmain(){chara,b;printfif"inputcharactera,b\n");scanfi("%c%c",&a,&b);printf("\n%c%c\n",a,b);}scanR"%c%c",&a,&b);本例表示scanf格式控制串“%c%c”之間有空格時,輸入的數據之間可以有空格間隔。e.如果格式控制串中有非格式字符則輸入時也要輸入該非格式字符。例如:scanf(H%d,%d,%dn,&a,&b,&c);其中用非格式符“,”作間隔符,故輸入時應為:5,6,7又如:scanfi("a=%d,b=%d,c=%d,*,&a,&b,&c);則輸入應為a=5,b=6,c=7g,如輸入的數據與輸出的類型不一致時,雖然編譯能夠通過,但結果將不正確。voidmain(){inta;printff'inputanumber\nH);scanff%d”,&a);pr血ズ%Id”,a);}由于輸入數據類型為整型,而輸出語句的格式串中說明為長整型,因此輸出結果和輸入數據不符。如改動程序如下:voidmain(){longa;printf("inputalonginteger\nH);scanf(M%ldn,&a);printf(H%ld",a);}運行結果為:inputalonginteger12345678901234567890當輸入數據改為長整型后,輸入輸出數據相等鍵盤輸入函數getchar函數getchar函數的功能是從鍵盤上輸入ー個字符。其一般形式為:getchar();通常把輸入的字符賦予ー個字符變量,構成賦值語句,如:charc;c=getchar();#includevoidmain(){charc;printギinputacharacter\nM);c=getchar();putchar(c);}使用getchar函數還應注意幾個問題:.getchar函數只能接受單個字符,輸入數字也按字符處理。輸入多于ー個字符時,只接收第一個字符。.使用本函數前必須包含文件“stdio.h"。.在tc屏幕下運行含本函數程序時,將退出tc屏幕進入用戶屏幕等待用戶輸入。輸入完畢再返回忙屏幕。voidmain(){chara,b,c;printギinputcharactera,b,c\nM);scanグ%c%c%cH,&a,&b,&c);printfC%d,%d,%d\n%c,%c,%c\n”,a,b,c,a?32,b?32,c?32);}輸入三個小寫字母輸出其ascii碼和對應的大寫字母。voidmain(){inta;longb;floatf;doubled;charc;printf(,,%d,%d,%d,%d,%d,,,sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));}輸出各種數據類型的字節長度。關系運算符和表達式在程序中經常需要比較兩個量的大小關系,以決定程序下ー步的工作。比較兩個量的運算符稱為關系運算符。在C語言中有以下關系運算符:<小于=大于或等于=等于!=不等于關系運算符都是雙目運算符,其結合性均為左結合。關系運算符的優先級低于算術運算符,高于賦值運算符。在六個關系運算符中,<,=的優先級相同,髙于==和!=,==和!=的優先級相同。關系表達式3/2,?a?+15不成立,故其值為假,即為0。voidmain(){charcdk?;inti=lj=2,k=3;floatx=3e+5,y=0.85;printf("%d,%d\n”,?a?+5=k+l);printf(H%d,%d\n",1<j<5,x-5.25<=x+y);printf(”%d,%d\n”,i+j+k=-2*j,k=j=i+5);charc=k?;inti=l,j=2,k=3;floatx=3e+5,y=0.85;printf(“%d,%d\n”,?a?+5=k+l);printf(n%d,%d\n",1<j<5,x-5.25<=x+y);printf(n%d,%d\n",i+j+k=-2*j,k=j=i+5);在本例中求出了各種關系運算符的值。字符變量是以它對應的ascii碼參與運算的。對于含多個關系運算符的表達式,如k=j=i+5,根據運算符的左結合性,先計算k==j,該式不成立,其值為0,再計算〇==i+5,也不成立,故表達式值為〇。邏輯運算符和表達式d)!b=c||d<a等價于((!b)=c)||(dc&&x+yc)&&((x+y)<b)邏輯運算的值〇)的結果為假。雖然c編譯在給出邏輯運算值時,以ー”代表“真",“〇”代表"假”。但反過來在判斷ー個量是為“真”還是為“假”時,以“0”代表“假”,以非“〇”的數值作為“真”。例如:由于5和3均為非“。”因此5&&3的值為“真”,即為1。又如:5||0的值為“真”,即為1。邏輯表達式邏輯表達式的一般形式為:表達式邏輯運算符表達式其中的表達式可以又是邏輯表達式,從而組成了嵌套的情形。例如:(a&&b)&&c根據邏輯運算符的左結合性,上式也可寫為:a&&b&&c邏輯表達式的值是式中各種邏輯運算的最后值,以“ビ和“〇”分別代表“真”和“假”。voidmain(){charcdk?;inti=lj=2,k=3;floatx=3e+5,y=0.85;printed,%d\nM,!x*!y,!!!x);printf(,,%d,%d\nn,x||i&&j-3,i<j&&x<y);printf(,,%d,%d\n',,i=5&&c&&0=8),x+y||i+j+k);}charcdk?;inti=lj=2,k=3;floatx=3e+5,y=0.85;printff%d,%d\n”,!x*!y,!!!x);printf(M%d,%d\n,*,x||i&&j-3,i<j&&x<y);printfC%d,%d\n\i-5&&c&&(j=8),x+y||i+j+k);本例中!x和!y分別為〇,!x*!y也為〇,故其輸出值為〇。由于x為非〇,故!!!x的邏輯值為O。對x||i&&j-3式,先計算j-3的值為非〇,再求i&&j-3的邏輯值為1,故x||i&&j-3的邏輯值為1〇對i<j&&x<y式,由于i<j的值為1,而x<y為〇故表達式的值為1,0相與,最后為0,對i==5&&c&&(j=8)式,由于i==5為假,即值為0,該表達式由兩個與運算組成,所以整個表達式的值為〇。對于式x+y||i+j+k由于x+y的值為非0,故整個或表達式的值為1。if語句用if語句可以構成分支結構。它根據給定的條件進行判斷,以決定執行某個分支程序段。C語言的if語句有三種基本形式。.第?種形式為基本形式if(表達式)語句;其語義是:如果表達式的值為真,則執行其后的語句,否則不執行該語句。其過程可表示為下圖voidmain(){inta,b,max;printf("\ninputtwonumbers:**);scanff%d%d”,&a,&b);max=a;if(max<b)max=b;printf("max=%d",max);}輸入兩個整數,輸出其中的大數。scanf(M%d%dM,&a,&b);max=a;if(max<b)max=b;printf(,'max=%d'(,max);本例程序中,輸入兩個數a,b。把a先賦予變量max,再用if語句判別max和b的大小,如max小于b,則把b賦予max。因此max中總是大數,最后輸出max的值。.第二種形式為if-else形式if(表達式)語句1;else語句2;其語義是:如果表達式的值為真,則執行語句1,否則執行語句2〇b)printffmax=%d\n”,a);elseprintffmax=%d\n”,b);}輸入兩個整數,輸出其中的大數。改用if'else語句判別a,b的大小,若a大,則輸出a,否則輸出bo.第三種形式為iRelse-if形式前二種形式的if語句一般都用于兩個分支的情況。當有多個分支選擇時,可采用if-else-if語句,其一般形式為:if(表達式1)語句1;elseif(表達式2)語句2;elseif(表達式3)語句3;elseif(表達式m)語句m;else語句n;其語義是:依次判斷表達式的值,當出現某個值為真時,則執行其對應的語句。然后跳到整個if語句之外繼續執行程序。如果所有的表達式均為假,則執行語句n。然后繼續執行后續程序。if-else-if語句的執行過程如圖3—3所示。#include"stdio.h"voidmain(){charc;printf("inputacharacter:*');c=getchar();ififc=一〇?&&c=~a?&&c=~a?&&c〈ンZ?)printff'thisisasmallletter\nM);elseprintff'thisisanothercharacter\nH);}ififc=~〇?&&c=?a?&&c=~a?&&c〈=~z?)printff'thisisasmallletter\nM);elseprintff'thisisanothercharacter\nn);本例要求判別鍵盤輸入字符的類別。可以根據輸入字符的ascii碼來判別類型。由ascii碼表可知ascii值小于32的為控制字符。在“0”和“9”之間的為數字,在“a”和“z”之間為大寫字母,在“a”和“z”之間為小寫字母,其余則為其它字符。這是ー個多分支選擇的問題,用if-else-if語句編程,判斷輸入字符ascii碼所在的范圍,分別給出不同的輸出。例如輸入為“g”,輸出顯示它為小寫字符。.在使用if語句中還應注意以下問題(1)在三種形式的if語句中,在if關犍字之后均為表達式。該表達式通常是邏輯表達式或關系表達式,但也可以是其它表達式,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣西賀州市本年度(2025)小學一年級數學部編版隨堂測試((上下)學期)試卷及答案
- 2025屆福建省龍巖市武平縣第二中學高考英語押題試卷含答案
- 食品理化檢驗模擬習題+答案
- 天津市第八十二中學英語2024-2025學年高二下學期期中英語試題(原卷版+解析版)
- 纖維制品的跨境電商物流解決方案考核試卷
- 自行車騎行與城市綠色經濟發展考核試卷
- 煤炭燃料發電與余熱利用考核試卷
- 絲織品在交通領域的應用考核試卷
- 聚噻吩纖維在有機光伏領域的應用考核試卷
- 燃油零售風險管理與防范考核試卷
- 醫療器械經營范圍經營方式說明
- 可編輯修改中國地圖模板
- 江蘇省生物技術和新醫藥產業發展規劃綱要
- 深信服SD-WAN產品使用說明書
- 安全觀摩手冊
- 事業單位1993歷次調整工資標準對照表
- 關于中節能太陽能科技股份有限公司主要稅種納稅情況的專項審核報告
- 藥店營業場所養護工作記錄表
- 個人簡歷表格
- 廣西行政區劃代碼
- 心理咨詢回訪記錄表
評論
0/150
提交評論