版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第2章數據類型、運算符和表達式2.1常用的進位制
2.3常量2.2數與字符在計算機內存中的表示2.4變量2.5常用運算符與表達式2.6基本輸入/輸出操作結束放映2.1常用的進位制C語言中的數據類型2.1.1二進制數、八進制數與十六進制數十進制數有10個數碼:0~9,加法運算采用“逢十進一”的進位法則二進制數有2個數碼:0和1,加法運算采用“逢二進一”的進位法則八進制數有8個數碼:0~7,加法運算采用“逢八進一”的進位法則。十六進制數有16個數碼:0~9和A~F,加法運算采用“逢十六進一”的進位法則2.1.2二進制數、八進制數、十進制數和十六進制數之間的換算二進制(八進制或者十六進制數)轉換為十進制數的換算方法采用按權展開逐個相加的方法十進制數轉換為二進制數的換算方法十進制數的整數部分采用除以二取余數,直到商為零;十進制數的小數部分采用乘以二取整(即十分位向個位的進位),直到小數部分為零(或者精確到小數點后規(guī)定的位數)。二進制數轉換為八進制數的換算方法轉換時以小數點為分界線,整數部分從低到高,小數部分從高到低按位數分組,每3位二進制數對應1位八進制數;分組時若不足3位數時,整數部分要在前面補0、小數部分要在后面補0。二進制數轉換為十六進制數的換算方法轉換時以小數點為分界線,整數部分從低到高,小數部分從高到低按位數分組,每4位二進制數對應1位十六進制數;分組時若不足4位數時,整數部分要在前面補0、小數部分要在后面補0。2.2數與字符在計算機內存中的表示本節(jié)介紹的主要內容包括:機器數和真值原碼、反碼與補碼定點數與浮點數
ASCII編碼2.2.1機器數與真值1.機器數計算機只能識別“0”和“1”兩種數碼。數的正、負符號也可以用“0”和“1”來表示,具體地,把一個數的最高位作為符號位,稱為數符,用“0”表示正,“1”表示負,其余位仍然表示數值。注意:機器數表示的范圍受到字長的限制,例如,如果表示一個整數,字長是16位,那么最大值是0111111111111111,因此16位整數的最大值是32767。如果超過32767,就要“溢出”。2.真值帶符號位的機器數對應的數值稱為機器數的真值。【例2.4】寫出帶符號位的機器數(00100001)2和(10100011)2的真值。(00100001)2=+33(10100011)2=-353.無符號數當計算機字長的所有二進位都用來表示數值時,稱為無符號數。一般在不出現負數的情況下,可以使用無符號數。這樣可以將最大數增大一倍。例如16位無符號數的最大值是(1111111111111111)2,也就是65535。2.2.2原碼、反碼和補碼1.原碼整數X的原碼是指:其數符位0表示正,1表示負,其數值部分是X的絕對值的二進制表示。[+1]原=00000001[+127]原=01111111[-1]原=10000001[-127]原=111111112.反碼整數X的反碼是指:對于正數,與原碼相同;對于負數,數符位為1,其數值部分是X的絕對值取反,即1變0,0變1。例如:[+1]反=00000001[+127]反=01111111[-1]反=11111110[-127]反=100000003.補碼整數X的補碼是指:對于正數,與原碼相同;對于負數,數符位為1,其數值部分是X的絕對值取反后最低位加1,即負數的補碼等于其對應的反碼加1。例如:[+1]補=00000001,[+127]補=01111111[-1]補=11111111,[-127]補=100000012.2.3定點數和浮點數計算機處理的數多數帶有小數點,小數點在計算機中不占二進位,那么如何表示小數點的位置,反映數值的大???
一般有兩種表示方法:第一種是約定機器數的小數點隱含在某一固定位置上的定點表示法第二種是小數點位置可以任意移動的浮點表示法1.定點數當約定小數點位置固定在機器數的最低位之后時,稱為定點整數。當約定小數點位置固定在符號位之后,有效數值部分最高位之前時,稱為定點小數。定點小數在計算機中的格式表示如圖2-3所示:2.浮點數
任何一個二進制的浮點數(也稱為實數)都可以表示成如下的形式:其中,S為尾數,J為階碼。例如:
在計算機中規(guī)定浮點數的尾數采用純小數形式,上例中的0.100011和0.0100011。如果尾數的最高位為1,則稱為規(guī)格化數,因此上例中的就是規(guī)格化數。浮點數在計算機內部的表示形式如下圖2-4所示。例:二進制數在計算機中的存儲方式如圖2-5所示(階符一位,階碼兩位原碼,數符一位,尾數四位原碼)。數的定點表示和浮點表示各有優(yōu)缺點,在不同的場合都得到使用。當所占用的位數相同時,浮點數所表示的數的范圍要比定點數大,運算精度一般比定點數要高,但浮點數的運算規(guī)則比定點數運算規(guī)則要復雜,所以相應的計算機運算部件也比較復雜。2.3常量所謂常量(constant),是指在程序運行過程中,其值不可改變的量。在C語言中常量具有整型、實型和字符型。例如:1234、-12為整型常量,1234.,123.4和-123.4為實型常量,‘a’與‘A’都為字符型常量。程序中,這種能夠從字面上看出數值的常量稱為字面常量(或直接常量),另外可以使用一個標識符來代表一個常量,稱為符號常量。2.3.1整型常量整型常量可以用下面三種形式表示:★十進制整數:如2001,-18,0。★八進制整數:在八進制整數的前面加一個0。如02001表示(2001)8、-017表示-(17)8,而019則是錯誤的,因為八進制數不可能出現數碼9?!锸M制整數:在十六進制整數的前面加一個0x。如0x2001表示(2001)16,0xAB12表示(AB12)16。VisualC++6.0中的整型常量可分為:1.基本型(int)一個基本型常量占用32比特的內存單元,按補碼形式存儲,取值范圍為-231~231-1。2.長整型(long)一個長整型常量占用32比特的內存單元,取值范圍為-231~231-1。在書寫長整型常量時,要以英文字母l或L結尾,如123456L。3.無符號型(unsigned)無符號型是指內存單元中只存數據位而不存符號位。無符號基本型整數(unsignedint)的取值范圍與無符號長整型數(unsignedlong)的取值范圍相同,都為0~232-1。無符號基本整型常量要以字母u或U結尾,如123u,無符號長整型常量要以字母ul或UL結尾,如123456UL。2.3.2實型常量1.實型常量的兩種表示方式實型數據也稱為浮點數,在C語言中的實型常量具有以下兩種表示方法:(1)十進制小數形式。這是最普通的表示方式。要注意,一定要有小數點,例如:2002.,.2002,-3.14,0.0。(2)指數形式。由數字部分、小寫字母e(或大寫字母E)和作為指數的整數組成。例如:要將2002.168寫成指數形式,可以有多種形式:2002.168e0,200.2168e1,20.02168e2,2.002168e3等。其中的2.002168e3稱為“規(guī)范化的指數形式”。一個實數在按指數格式輸出時,是按規(guī)范化指數形式輸出的。2.實型常量的分類(1)單精度實數(float)單精度實型數的有效數字為6~7位,數值的范圍為10-37~1038
。(2)雙精度實型數(double)雙精度實型數是另外一種類型的實數。在VisualC++6.0中,雙精度實型數占用內存單元為64比特,數值范圍是10-307~10308,有效數字是15~16位。2.3.3字符常量字符常量是一個整數,寫成用一對單引號括住的單個字符的形式,例如‘a’,‘A’,‘x’,‘$’都是字符常量字符在內存中以ASCII碼值的形式存儲。例如從ASCII碼表中可以查出字符‘a’的ASCI碼值是97,它在計算機內部的存儲形式如圖2-7所示。字符常量的存儲形式與整數的存儲形式類似,所以字符常量的值就是該字符的ASCII碼值,例如字符'0'的值是48,而不是數值0。在實際編程時,應該記住一些常用字符的ASCII值,由此可以推導出其它字符的值。★字符'A'的ASCII值是65★字符'a'的ASCII值是97★字符'0'的ASCII值是48★空格字符‘‘的ASCII值為32【例2.5】寫出下列程序的運行結果。#include<stdio.h>voidmain(){
inti,j; i=65; /*字符'A'的ASCII碼值*/ j=i+1; /*字符'B'的ASCII碼值*/ printf("%c,%c\n",i,j); /*以字符形式輸出*/printf("%d,%d\n",i,j); /*以整數形式輸出*/}程序運行結果如下:A,B65,662.3.4字符串常量字符串常量也叫字符串字面值,是用一對雙引號括住的由0個或者多個字符組成的字符序列。例如,“Iamastudent.”、“WindowsXP”和“”(空字符串)等C語言規(guī)定:在每一個字符串的結尾系統(tǒng)自動加上一個字符串結束標志符‘\0’,以便判斷字符串是否結束。所以字符串“China”在內存中的存儲形式如圖2-8所示,
從圖中能看出存儲該串所需的字符數不是5而是6。另外,字符串“a”包括了兩個字符‘a’和‘\0’,故"a"不同于'a'。2.3.5符號常量符號常量(也稱為宏名),它是用一個標識符來代表的常量,C語言中用#define來定義一個符號常量,符號常量一般用大寫字母來表示。(有關內容在第四章中有詳細論述)例如:通過使用以下形式定義了一個符號常量PI,在預編譯程序時將代碼中所有的PI都用3.1415926來代替。#definePI3.1415926【例2.6】下面一段程序是按華氏溫度與攝氏溫度的轉換公式:°C=(5/9)(°F-32)打印出0°F,10°F,20°F,…,直到100°F之間的華氏溫度與攝氏溫度的對照表。#include<stdio.h>#defineLOWER0 /*表的下限*/#defineUPPER100 /*表的上限*/#defineSTEP10 /*步長*/voidmain(){intf;floatc;for(f=LOWER;f<=UPPER;f+=STEP){c=5.0f/9.0f*(f–32);printf("%3d,%6.1f\n",f,c);}}2.4變量簡單地說,變量是指其值在程序運行過程中會發(fā)生改變的量。在程序設計中,必須通過變量名來使用變量。在給變量命名時,必須用標識符來表示,不能把關鍵字當作變量名來使用。在C語言中,對所有的變量均要求“先定義,后使用”,而且在定義變量名時,盡量做到“見名知意”。2.4.1整型變量在C語言中具有以下6種整型變量:有符號基本整型:[signed]int無符號基本整型:unsignedint有符號短整型:[signed]short[int]無符號短整型:unsignedshort[int]有符號長整型:[signed]long[int]無符號長整型:unsignedlong[int]整型變量的定義C語言規(guī)定程序中使用的變量必須“先定義,后使用”,一般放在一個函數開頭的說明部分,它的作用域僅限于該函數內部(關于變量與其作用域的內容將在第4章中介紹)。同一類型的變量可以任何方式分散在多個說明中,例如:intlower,upper,step;floatx,y;變量在說明時可以同時初始化。例如:inti=0;intlimit=MAXLINE+1; /*MAXLINE是符號常量*/intj,k=10; /*可以對變量的一部分初始化*/intlower=0,upper=100,step=20; /*對幾個變量初始化*/charc='s';【例2.7】寫出下列程序的運行結果。#include<stdio.h>voidmain(){inta=1;intb=-1;unsignedc,d;c=a;d=b;printf("a=%d,b=%d,c=%d,c=%u,d=%d, d=%u\n",a,b,c,c,d,d);}運行結果如下:a=1,b=-1,c=1,c=1,d=-1,d=4294967295例2.7程序分析:為什么d為作有符號數(%d)輸出時是-1,而作為無符號數(%u)輸出時卻是4294967295?這是因為b賦值為-1,在內存中按補碼形式存儲為32個1,即:11111111111111111111111111111111當把b賦值給d時,d在內存中的存儲也變?yōu)?2個1。已知一個負整數的二進制補碼表示,如何計算出它原來所對應的十進制整數?可以按照以下步驟來求:(1)將包含符號位在內的所有二進制補碼的各位數字全部取反,即1變0、0變1;(2)將上述得到的結果轉換為十進制整數;(3)加上負號;(4)上述結果最后再減去1。如果已知一個正整數的二進制補碼表示,則它原來所對應的十進制整數,實際上就是將已知的補碼直接轉換成十進制整數。通過上述介紹可知,若把例2.7中的變量d看成是%d,由于補碼的最高位(即符號位)為1,說明了原來的十進制整數應該是負數,經過上述四步計算得到的結果就是-1;若把變量d看成是%u,則按照二進制整數轉換為十進制整數的方法,最后得到的結果就是4294967295(即232-1)。【例2.8】寫出下列程序的運行結果。#include<stdio.h>voidmain(){shortinta,b;unsignedshorti,j;a=32767;b=a+1; i=65535; j=i+1; printf("a=%d,b=%d,i=%u,j=%u\n",a,b,i,j);}運行結果如下:a=32767,b=-32768,i=65535,j=0在VisualC++6.0中,將一個整型常量賦值給另一個整型變量時,要注意以下幾點:(1)一個取值范圍為[-32768,32767]的整數應被看作是shortint型常量,允許給int型和longint型變量賦值;同樣,一個取值范圍為[–2147483648,2147483647]的整數,應被看作是int型或者long型常量可以給longint型變量賦值。(2)由于int型與longint型的數據均占據相同長度的內存單位(即32比特),則int型常量同時也是longint型常量,可以賦給int型或longint型變量。(3)若要說明某個常量是longint類型的常量,可以在該常量的后面加上尾符大寫字母L或者小寫字母l。例1234是int型常量,而1234L或者1234l則是longint型常量。(4)在函數調用中,如果形參是longint型,那么實參也必須是longint型,如果實參與形參的類型不一致可以用強制類型轉換來表示。2.4.2實型變量與實型常量相一致,實型變量也分為以下三種類型:float(單精度實型)double(雙精度實型)longdouble(長雙精度實型)【例2.9】寫出下列程序的運行結果。#include<stdio.h>voidmain(){floatx1,x2,x3;doubley1,y2;x1=1.234567899e8f;x2=1234567.899e2f;x3=x1+1;printf("x1=%f\nx2=%f\nx3=%f\n",x1,x2,x3);y1=1.234567899e8f;y2=y1+1;printf("y1=%f\ny2=%f\n",y1,y2);}運行結果如下:x1=123456792.000000x2=123456792.000000x3=123456793.000000y1=123456792.000000y2=123456793.000000【例2.10】寫出下列程序的運行結果。#include<stdio.h>voidmain(){floatx1,x2,x3,x4; doubley1,z1,z2,z3; x1=1234.567899f; x2=99876.54321f; x3=x1*x2; x4=1234.567899f*99876.54321f; printf("x3=%f\nx4=%f\n",x3,x4); y1=1234.567899*99876.54321; printf("y1=%f\n",y1); z1=1234.567899; z2=99876.54321; z3=z1*z2; printf("z3=%f\n",z3);}例2.10的運行結果:x3=123304376.000000x4=123304376.000000y1=123304374.110152z3=123304374.110152程序分析:分析運行結果,可以看出系統(tǒng)將實型常量1234.567899和99876.54321按雙精度數據處理,這樣可以提高計算的精度。如果在實型常量后面加上f(或F),系統(tǒng)就會按單精度數據處理。2.4.3字符型變量字符型變量用來存儲字符常量。一個字符變量在內存中只占一個字節(jié),只能存儲一個字符。下表2-5列出了VisualC++6.0中字符類型的取值范圍?!纠?.11】寫出下列程序的運行結果。#include<stdio.h>voidmain(){charc1,c2; c1=‘A’; /*字符A*/ c2=c1+1; /*字符B*/ printf("%c,%c\n",c1,c2); /*以字符形式輸出*/printf("%d,%d\n",c1,c2);/*以整數形式輸出*/}運行結果如下:A,B65,66【例2.12】寫出下列程序的運行結果。#include<stdio.h>voidmain(){inti;charc;c=0x41;i='B';printf("%c,%d\n",c,i);}程序運行結果如下:A,66【例2.13】寫出下列程序的運行結果。#include<stdio.h>voidmain(){charc;unsignedchard;c=255;d=255;printf("c=%d\nd=%d\n",c,d);}程序運行結果如下:c=-1d=2552.5常用運算符與表達式C語言的運算符非常豐富,根據運算符的性質可以分為算術運算符、關系運算符、邏輯運算符、賦值運算符、位運算符、條件運算符、自增和自減運算符、逗號運算符、指針運算符、強制類型轉換運算符、分量運算符、下標運算符、求字節(jié)數運算符、函數調用運算符等。根據所需要的操作數個數,運算符又可以分成單目運算符、雙目運算符和三目運算符。2.5.1算術運算符與算術表達式基本算術運算符包括:+(加法運算符,或正值運算符)-(減法運算符,或負值運算符)*(乘法運算符)/(除法運算符)%(求余運算符或模運算符)算術表達式:用算術運算符和括號將運算對象連接起來的式子稱為算術表達式。運算對象包括常量、變量和函數等。例如:x*y/z+2002.168–15%(-7)+'A'C語言規(guī)定算術運算符的優(yōu)先級為先做*,/,%;后做+,-。即“*,/,%”屬同一優(yōu)先級,“+,-”屬同一優(yōu)先級,而且前者優(yōu)先級高于后者。在表達式求值時,同一優(yōu)先級的運算符的運算順序規(guī)定為“自左至右”,即運算對象先與左面的運算符結合,也稱為“左結合性”(見表2-6)2.5.2賦值運算符與賦值表達式賦值運算符用“=”來表示。它的作用是將一個表達式的值賦給一個變量,而不是數學中的等號。由賦值運算符將一個變量和一個表達式連接起來的式子稱為“賦值表達式”。它的一般形式為:變量名=表達式凡是雙目(二元)運算符,都可以與賦值符一起組成復合賦值符。它的一般形式為:變量名雙目運算符=表達式等價于:變量名=變量雙目運算符表達式例如:x+=3等價于x=x+3x%=3+a等價于x=x%(3+a)使用賦值運算符“自右而左”的結合原則,可以處理各種復雜賦值表達式的求值。
已知intx=2,計算下述表達式的值。x+=x-=x*(y=11)解答:先進行“x-=x*(y=11)”的運算,相當于x=x-x*(y=11),經計算得到x=-20再進行x+=-20,相當于x=x+(-20)=(-20)+(-20)=-40因此最后表達式的值為-402.5.3強制類型轉換運算符當兩種不同類型的數據進行運算時,C語言會自動按規(guī)則進行類型的轉換(譬如將int類型的數據賦值給float類型的變量),此外,程序員還可以利用強制類型轉換運算符將一個表達式轉換成所需要的類型。強制類型轉換運算符的一般形式:(類型名)表達式例如:表達式(int)(x+y)表示先對x+y求和,再將和值轉換成int類型,此時就不能誤寫成(int)(x)+y。2.5.4自加、自減運算符C語言為變量增加與減少提供了兩個奇特的運算符:加一運算符++用于使其運算分量加1減一運算符--用于使其運算分量減1++與--這兩個運算符既可以用作前綴運算符(即用在變量名前面,如++n),也能用作后綴運算符(即用在變量名后面,如n++),雖然都能使n加1,但二者存在差別:表達式++n:在n的值被使用之前,先使n加1表達式n++:在n的值被使用之后,再使n加1例如:如果已知intn=5,那么情況I:x=n++;最后的結果:x=5,n=6情況II:x=++n;最后的結果:x=6,n=62.5.5逗號運算符與逗號表達式用逗號運算符將兩個表達式連接起來所形成的表達式稱為逗號表達式,其格式為:
表達式1,表達式2逗號表達式的求解過程:先求解表達式1,再求解表達式2,則整個逗號表達式的值就是表達式2的值。例如,z=(x=10,10+20),z的值為30,x的值為10。逗號表達式中的表達式又可以是一個逗號表達式,這樣逗號表達式的一般形式就可以擴展成:
表達式1,表達式2,表達式3,…,表達式n整個逗號表達式的值就是表達式n的值。2.5.6位運算所謂位運算,就是指對一個數的二進制位的運算。在匯編語言中有位操作的指令,不過C語言也提供了位運算功能,可用于單片機的開發(fā)領域,因此C語言既具有高級語言的特點,同時又具有低級語言的特點。C語言提供了6個用于位操作的運算符,這些運算符只能作用于各種整型數據(如char型、int型、unsigned型、long型)。& 按位與AND(二元運算符)| 按位或OR(二元運算符)^ 按位異或XOR(二元運算符)<< 按位左移(二元運算符)>> 按位右移(二元運算符)~ 按位取反(一元運算符)&按位與運算參加運算的兩個操作數按二進制位進行“與”運算,規(guī)則如下:0&0=00&1=01&0=01&1=1&運算經常用于屏蔽某些二進制位。【例2.14】假設辦公樓有16層,每層過道里都裝了照明燈。已知第1層過道中的燈是開著的,其它樓層里的燈有的開有的關。為了節(jié)電的需要,現在要求只保留第1層過道里的燈照明,其它樓層的燈全部要熄滅,請問如何實現?分析:本題可以用一個數字開關來控制。這里定義一個short類型的變量switch,規(guī)定它的每一個二進制位自右向左分別對應著第1層至第16層的開關,其中若某位是0,表示那一層的燈是關著的,為1則表示開燈。此時的控制語句寫為:switch=switch&0x0001;|按位或運算參加運算的兩個操作數,按二進制位進行“或”運算。運算規(guī)則如下:0|0=00|1=11|0=11|1=1|運算經常用于設置某些位。【例2.15】如果想要1樓、3樓與5樓的照明燈都打開,則可以這樣運算:switch=switch|0x0015;^按位異或運算參加運算的兩個操作數,按二進制位進行“異或”運算。運算規(guī)則如下:0^0=00^1=11^0=11^1=0從運算規(guī)則可以看出,與“1”異或位取反,與“0”異或位保留。按位異或還有一個特點:在一個數據上兩次異或同一個數,結果變回到原來的數。這個特點常常使用在動畫程序設計中。【例2.16】將short型變量x的低5位都取反(即1變0、0變1),可以這樣運算:x=x^(0000000000011111)2
即x=x^0x001f~按位取反運算~運算符是一個單目運算符,它用來對一個二進制數按位取反,即1變0、0變1。~運算符的優(yōu)先級比算術運算符、關系運算符和其他的位運算符都要高。【例2.17】將short型變量x的低6位全部置為0,可以這樣運算:x=x&~077相當于x=x&(~077)<<按位左移運算符x<<n表示把x的每一位向左移動n位,右邊空出的位置補0,同時原來的高位經過左移之后丟棄不用。例如:對于變量shortx=64;則x對應的二進制表示為0000000001000000。將x左移一位可以由語句x=x<<1;實現,其運算過程如下:(0000000001000000)2<<1轉換為(0000000010000000)2而(0000000010000000)2對應的十進制整數是128,也就是說64<<1相當于64×2=128。在一定范圍內的按位左移n位,相當于原數的十進制數乘以2n但要注意這里所說的范圍限制,例如:(0100000000000000)2<<2之后卻成為(0000000000000000)2>>按位右移運算符x>>n表示把x的每一位向右移動n位,移到右端的低位被丟棄。對無符號數而言,左邊空出的高位要補0,而對于有符號數,左邊空位上要補符號位上的值。例如,無符號數15右移2位,即15>>2,相當于(0000000000001111)2>>2,結果為(0000000000000011)2;而對有符號數–6右移2位,即(–6)>>2,相當于(1111111111111010)2>>2,結果就應該是(1111111111111110)2此時得到的結果就仍然是有符號數。2.6基本輸入/輸出操作在C語言中,輸入/輸出操作是通過函數調用來實現的。用戶只要直接調用C語言標準函數庫中的標準輸入/輸出函數,就可以完成輸入/輸出操作。由標準庫提供的輸入/輸出模型非常簡單。在使用標準輸入/輸出函數時,要在程序的開頭加上文件包含命令:#include<stdio.h>2.6.1字符的輸入和輸出
標準庫中的getchar()和putchar()函數通常用于在終端設備上一次讀取/寫入一個字符。實際上在使用終端設備時,系統(tǒng)會自動打開三個標準文件:標準輸入、標準輸出和標準錯誤輸出文件,而標準輸入和標準輸出可以通過重定向手段重定向到某一數據文件。使用getchar()函數時,從輸入設備(即鍵盤)上讀入一個字符,并將其作為結果值返回。使用putchar()函數時,在輸出設備(即命令提示符窗口或稱MS-DOS窗口)上顯示一個字符。【例2.18】下面的程序運行時,會把從鍵盤上輸入的任意字符全部顯示在屏幕上。如果鍵入組合鍵【Ctrl+Z】或者功能鍵【F6】,則運行結束。#include<stdio.h>voidmain(){intc;while((c=getchar())!=EOF)putchar(c);}【例2.18】程序分析:(1)從鍵盤上鍵入的字符在計算機內部是按位模式存儲的,所以任何整數類型也可以存儲字符數據。(2)while循環(huán)語句的執(zhí)行過程:首先檢測圓括號內的條件,如果為真,則執(zhí)行循環(huán)體;然后重新檢測條件,為真,再執(zhí)行循環(huán)體,直到條件為假,循環(huán)結束。(3)EOF:為了區(qū)分文件的正常字符與文件的結束標記。C語言在頭文件stdio.h中定義了一個整數EOF,此處代表文件結束符。(4)利用重定向手段將輸入指向一個文本文件,運行程序,在屏幕上顯示該文本文件。如果不做輸入重定向,則輸入為鍵盤,運行程序,輸入一個字符,顯示該字符,直到按【Ctrl+Z】組合鍵或功能鍵【F6】鍵結束。2.6.2帶格式數據的輸入與輸出
上一節(jié)介紹的兩個函數putchar()和getchar()只能夠輸入/輸出一個字符,如果要求輸入/輸出任意類型的數據,并且按照指定的數據格式進行輸入/輸出,則需要用到格式化輸出函數printf()和格式化輸入函數scanf()。1.printf()函數printf()函數是有格式的輸出函數,它能夠對任意類型的內部數值按照指定格式的字符形式顯示。printf()函數的一般格式如下:printf(格式控制字符串,輸出值參數表);其中格式控制字符串和輸出值參數表是printf()函數的參數。例如:(1)格式控制字符串格式控制字符串包括兩部分:按照原樣不動輸出的普通字符和用于控制printf()函數中形參轉換的轉換規(guī)格說明。轉換規(guī)格說明由一個“%”開頭到一個格式字符結尾,表2-8列出了常用的printf()函數格式轉化說明符。如果只輸出字符串時,則輸出值參數表可以省略,例:printf("ThisisaCprogram.");在字符%和轉換字符中間可以指定輸出域寬和精度?!纠?.19】寫出下列程序的運行結果。#include<stdio.h>voidmain(){shortx=-1;printf("%%d:%d\n%%u:%u\n%%o:%o\n%%x:%x\n",x,x,x,x);}運行結果如下:%d:-1%u:4294967295%o:37777777777%x:ffffffff【例2.19】程序分析:short類型的變量x的值為-1,它在內存中按補碼形式的存儲格式為16個1,即:11111111111111111111111111111111采用%d格式輸出時,是按照十進制int類型的整數(32位)來輸出,得到的結果仍然是-1;已知一個負整數的二進制補碼表示,如何計算出它原來所對應的十進制整數?可以按照以下步驟來求:(1)將包含符號位在內的所有二進制補碼的各位數字全部取反,即1變0、0變1;(2)將上述得到的結果轉換為十進制整數;(3)加上負號;(4)上述結果最后再減去1。【例2.19】程序繼續(xù)分析:采用%u格式時,是按照十進制unsignedint類型(32位)來輸出,原來存儲時的符號位1,被當作數值位來處理,直接把二進制轉換為十進制,得到的結果為4294967295;采用%o格式輸出時,是按照八進制int類型的整數(32位)來輸出,得到的結果為37777777777;采用%x格式輸出時,是按照十六進制int類型的整數(32位)來輸出,得到的結果為ffffffff;另外,此例子中格式符“%%d”的輸出結果為%d,注意它與“%d”的輸出結果不同。【例2.20】寫出下列程序的運行結果,其中格式符"%s"用于字符串的輸出。#include<stdio.h>voidmain(){ printf("%c%s\n",'T',"hisisastring.");}運行結果如下:Thisisastring.【例2.21】寫出下列程序的運行結果。#include<stdio.h>voidmain(){floatx=12.3456789f;doubley=1234567891234.123456789;printf("%f\n%f\n%e\n%g\n",x,y,y,y);}運行結果如下:12.3456791234567891234.1235001.234568e+0121.23457e+012%f格式符以小數形式輸出時,默認6位小數;單精度的有效位數一般為7位,而雙精度的有效位數一般為15位?!纠?.22】寫出下列程序的運行結果。#include<stdio.h>voidmain(){intx=123;printf("%6d\n%06d\n%-6d\n%2d\n",x,x,x,x);}運行結果如下:123{占6列寬,域寬值大于實際位數時,右對齊,左補空格}000123{有前導0時,左補0}123 {域寬為負數,左對齊,右補空格}123 {域寬值小于實際位數時,按實際位數輸出}本例中的%6d中的6是域寬指示,它必須為整數,指定了對應的輸出項所占的字符個數?!纠?.23】寫出下列程序的運行結果。#include<stdio.h>voidmain(){floatx=12.345f;printf("%.2f\n%.2s\n",x,"abcde");}運行結果如下:12.35ab程序分析:.n(n為正整數),對于浮點數,指定輸出的小數位數,對于字符串,指定從字符串左側所截取的字符串個數。(2)輸出值參數表。輸出值參數表可以是常量、變量和表達式,它們之間用逗號隔開,輸出值的數據類型和個數應該與格式轉換符相匹配。2.scanf()函數scanf()函數是有格式的輸入函數,可以按照格式字符串指定的格式讀入若干個數據,并把它們存入參數地址表指定
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論