第2章 數(shù)據(jù)類型、運算符和表達式(加動畫16:9)_第1頁
第2章 數(shù)據(jù)類型、運算符和表達式(加動畫16:9)_第2頁
第2章 數(shù)據(jù)類型、運算符和表達式(加動畫16:9)_第3頁
第2章 數(shù)據(jù)類型、運算符和表達式(加動畫16:9)_第4頁
第2章 數(shù)據(jù)類型、運算符和表達式(加動畫16:9)_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第2章程序中的數(shù)據(jù)2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差2.4數(shù)據(jù)的輸入/輸出2.5程序案例本章小結(jié)學生自我完善練習目錄2.1數(shù)據(jù)類型、變量與常量2.2運算符與表達式2.1數(shù)據(jù)類型、變量與常量在C語言中,每個數(shù)據(jù)都屬于唯一的一種數(shù)據(jù)類型,沒有無類型的數(shù)據(jù)。C語言的數(shù)據(jù)類型如圖2-1所示。2.1.1數(shù)據(jù)類型概述2.1數(shù)據(jù)類型、變量與常量C語言的基本類型有三種:字符型、整型和實型(浮點型)。C語言的基本類型修飾符有四種:signed(有符號)、unsigned(無符號)、long(長型符)和short(短型符),這些類型修飾符可以與字符型或整型數(shù)據(jù)配合使用?;緮?shù)據(jù)類型和取值范圍如表2-1所示。2.1.1數(shù)據(jù)類型概述2.1數(shù)據(jù)類型、變量與常量表2-1C語言基本數(shù)據(jù)類型描述類型說明內(nèi)存單元個數(shù)取值范圍char字符型1(8位)-128~127即-27~(27-1)unsignedchar無符號字符型1(8位)0~255

即0~(28-1)signedchar有符號字符型1(8位)-128~127即-27~(27-1)int整型2(16位)-32768~32767即-215~(215-1)unsignedint無符號整型2(16位)0~65535

即0~(216-1)signedint有符號整型2(16位)-32768~32767即-215~(215-1)shortint短整型2(16位)-32768~32767即-215~(215-1)unsignedshortint無符號短整型2(16位)0~65535

即0~(216-1)signedshortint有符號短整型2(16位)-32768~32767即-215~(215-1)longint長整型4(32位)-2147483648~2147483647即-231~(231-1)unsignedlongint無符號長整型4(32位)0~4294967295

即0~(232-1)signedlongint有符號長整型4(32位)-2147483648~2147483647即-231~(231-1)float單精度實型4(32位)-3.4E+38~3.4E+38double雙精度實型8(64位)-1.7E+308~1.7E+3082.1數(shù)據(jù)類型、變量與常量1.標識符

所謂標識符,是指用來標識程序中用到的變量、函數(shù)、類型、數(shù)組、文件以及符號常量等的有效字符序列。

在C語言中,標識符只能由字母、數(shù)字和下劃線組成,第一個字符必須為字母或下劃線。2.1.2標識符2.1數(shù)據(jù)類型、變量與常量2.關鍵字關鍵字又稱保留字,是C語言規(guī)定的具有特定意義的標識符,它們有特定的含義,不能做其他用途使用。C語言的關鍵字有32個,可分為以下四類。(1)標識數(shù)據(jù)類型的關鍵字(14個):int,long,short,char,float,double,signed,unsigned,struct,union,enum,void,volatile,const。(2)標識存儲類型的關鍵字(5個):auto,static,register,extern,typedef。(3)標識流程控制的關鍵字(12個):goto,return,break,continue,if,else,while,do,for,switch,case,default。(4)標識運算符的關鍵字(1個):sizeof。2.1.2標識符2.1數(shù)據(jù)類型、變量與常量1.變量概述在程序運行過程中,其存儲的值可以被改變的量稱為變量。變量定義必須放在變量使用之前,一般放在函數(shù)體的開頭部分。要區(qū)分變量名和變量值是兩個不同的概念。例如整型變量a的值為3,則變量a在內(nèi)存中的存儲形式如圖2-2所示。2.1.3變量的定義、賦值和初始化2.1數(shù)據(jù)類型、變量與常量2.變量的說明變量定義的一般格式如下:

數(shù)據(jù)類型

變量名1[,變量名2,變量名3,…

,變量名n];2.1.3變量的定義、賦值和初始化

其中中括號“[]”括起來的部分為可選項,省略號為多次重復。例如:intx,y,z; /*定義三個整型變量x、y和z*/floati,j; /*定義兩個單精度浮點型變量i、j*/2.1數(shù)據(jù)類型、變量與常量3.變量的賦值和初始化(1)變量的賦值。定義變量后,在使用之前需要給定一個初始值。在C語言中,可以通過賦值運算符“=”給變量賦值。變量賦值語句的一般格式如下。例如:intx;/*定義一個整型變量x,此時x的值是不確定的*/x=3; /*給變量賦初值為3*/變量名=表達式;2.1.3變量的定義、賦值和初始化2.1數(shù)據(jù)類型、變量與常量(2)變量的初始化。在定義變量的同時為其賦值,稱為變量的初始化。定義的變量可以全部初始化,也可以部分初始化。例如:intx=3,y=5,z; /*定義三個整型變量x、y和z,并為x賦初值為3,y賦初值為5*/intx=10,y=10,z=10; /*定義三個整型變量x、y和z,并都賦初值為10*/intx=y=z=10; /*錯誤,不允許在定義時連續(xù)賦初值*/intx=10.5; /*定義整型變量x,賦初值為10而不是10.5(小數(shù)的整數(shù)部分)*/longy=99; /*定義一個長整型變量y,并為變量y賦初值99*/提示:變量沒初始化時其值是多少?沒有被賦值的變量其初值取決于存儲類型,靜態(tài)存儲的變量將自動為0,否則被隨機初始化,其值為不確定的數(shù)值。2.1.3變量的定義、賦值和初始化2.1數(shù)據(jù)類型、變量與常量

在計算機內(nèi),機器數(shù)有無符號和帶符號數(shù)之分。無符號數(shù)表示正數(shù),在機器數(shù)中沒有符號位。位于無符號數(shù),若約定小數(shù)點的位置在機器數(shù)的最低位之后,則是純整數(shù);若約定小數(shù)點的位置在機器數(shù)的最高位之前,則是純小數(shù)。對于帶符號數(shù),機器數(shù)的最高位是表示正、負的符號位,其余位則表示數(shù)值。

帶符號位的機器數(shù)可采用原碼、反碼和補碼等不同的編碼方法,機器數(shù)的這些編碼方法稱為碼制。2.1.4數(shù)的原碼、反碼和補碼表示2.1數(shù)據(jù)類型、變量與常量1.原碼原碼表示法在數(shù)值前面增加了一位符號位(即最高位為符號位):正數(shù)該位為0,負數(shù)該位為1(0有兩種表示:+0和-0),其余位表示數(shù)值的大小。例如:[+45]原=00101101[-45]原=101011012.1.4數(shù)的原碼、反碼和補碼表示2.1數(shù)據(jù)類型、變量與常量2.反碼反碼是數(shù)值存儲的一種,但是由于補碼更能有效表現(xiàn)數(shù)字在計算機中的形式,所以多數(shù)計算機一般都不采用反碼表示數(shù)。反碼表示法規(guī)定:正數(shù)的反碼與其原碼相同;負數(shù)的反碼是對其原碼逐位取反,但符號位除外。例如:[+45]反=00101101[-45]反=110100102.1.4數(shù)的原碼、反碼和補碼表示2.1數(shù)據(jù)類型、變量與常量3.補碼在計算機系統(tǒng)中,數(shù)值一律用補碼來表示和存儲。這是因為使用補碼,可以將符號位和數(shù)值域統(tǒng)一處理;同時,加法和減法也可以統(tǒng)一處理。此外,補碼與原碼相互轉(zhuǎn)換,其運算過程是相同的,不需要額外的硬件電路。反碼表示法規(guī)定:正數(shù)的補碼與原碼相同,負數(shù)的補碼為其原碼除符號位外所有位取反(得到反碼),然后最低位加1。例如:[+45]補=00101101[-45]補=110100112.1.4變量的存儲形式2.1.4數(shù)的原碼、反碼和補碼表示2.1數(shù)據(jù)類型、變量與常量2.1.4變量的存儲形式2.1.4數(shù)的原碼、反碼和補碼表示原碼、反碼和補碼轉(zhuǎn)換過程如圖2-3所示。2.1數(shù)據(jù)類型、變量與常量1.整型整型數(shù)據(jù)沒有小數(shù)部分。根據(jù)整數(shù)的存儲長度,可分為以下幾種(即變量的類型)。(1)基本整型:類型名為int。(2)短整型:類型名為shortint或short。(3)長整型:類型名為longint或long。整型還可以細分為:(1)有符號整數(shù):加上修飾符singed,可以描述正整數(shù)、負數(shù)和0。(2)無符號整數(shù):加上修飾符unsinged,可以描述正整數(shù)和0。2.1.5整型及整型常量2.1數(shù)據(jù)類型、變量與常量2.整型常量整型常量又稱整數(shù),整數(shù)有3種數(shù)制來表示(不用二進制表示整數(shù))。(1)十進制整型常量:十進制整常數(shù)沒有前綴,其數(shù)字為0~9,如237、-568等。(2)八進制整型常量:以數(shù)字0開頭,由數(shù)字0~7來表示。八進制數(shù)通常是無符號數(shù),如015、026。(3)十六進制整型常量:以數(shù)字0和字符X或x(即0X或0x)開頭,由數(shù)字0~9和字符A~F或a~f表示,如0x2A(十進制數(shù)為42)、0XFFFF(十進制數(shù)為65535)。(4)整型常量的后綴:在整型數(shù)后加后綴“L”或“l(fā)”來表示長整型數(shù),加后綴“U”或“u”來表示無符號整型數(shù)。2.1.5整型及整型常量2.1數(shù)據(jù)類型、變量與常量【案例2-1】十進制、八進制、十六進制整數(shù)的輸出。單擊打開源程序程序運行結(jié)果2.1.5整型及整型常量2.1數(shù)據(jù)類型、變量與常量1.實型實型也稱為浮點型,包括(即變量類型):(1)單精度浮點類型:簡稱浮點類型,類型名為float。(2)雙精度浮點類型:簡稱雙精度類型,類型名為double。(3)長雙精度類型:類型名為longdouble。2.1.6實型及實型常量2.1數(shù)據(jù)類型、變量與常量例如:float x;/*定義單精度浮點型變量x*/double y;/*定義雙精度浮點型變量y*/x=4.72; /*為變量x賦小數(shù)4.72*/y=1.235E+5;/*為變量y賦長整數(shù)1.235×105*/2.1.6實型及實型常量2.1數(shù)據(jù)類型、變量與常量【案例2-2】各種形式實數(shù)的輸出。單擊打開源程序程序運行結(jié)果程序分析(1)%f為單精度小數(shù)的輸出格式,默認輸出為小數(shù)點后6位有效數(shù)字。(2)%lf為雙精度小數(shù)。%.9lf表示輸出小數(shù)點后9位有效數(shù)字??梢钥吹絾尉葂的有效數(shù)字不能全部存儲進去,而雙精度y的有效數(shù)字可以全部存儲。所以如果要存儲精度高的小數(shù),應該采用雙精度浮點型存儲。2.1.6實型及實型常量2.1數(shù)據(jù)類型、變量與常量2.實型常量實型常量也稱為實數(shù)或者浮點數(shù)。實數(shù)只有十進制,包括:十進制小數(shù)形式和指數(shù)形式。(1)十進制小數(shù)形式。小數(shù)形式是由數(shù)字0~9和小數(shù)點組成的(注意:必須有小數(shù)點)。例如:6.789,.789(省略小數(shù)點前0),6.(省略小數(shù)點后0),0.0都是合法的十進制小數(shù)。(2)指數(shù)形式。由十進制小數(shù)加上階碼標志字符“e”或“E”以及階碼(只能為整數(shù),可以帶符號)組成。其一般形式為:aEn,其中a為十進制數(shù),n為十進制整數(shù),其值為a×10n。例如2.35E-3,表示2.35×10-3。2.1.6實型及實型常量2.1數(shù)據(jù)類型、變量與常量【練習2-4】以下各種小數(shù)表示哪些是合法的?哪些是非法的?2.1E5、3.7E-2、0.5E7、345、-2.8E-2、E7、-5、53.-E3、2.7E解:(1)合法的實數(shù):2.1E5(等于2.1*105),3.7E-2(等于3.7*10-2),0.5E7(等于0.5*107),-2.8E-2(等于-2.8*10-2)。(2)非法的實數(shù):345(無小數(shù)點),E7(階碼標志E之前無數(shù)字),-5(無階碼標志),53.-E3(負號位置不對),2.7E(無階碼)。2.1.6實型及實型常量2.1數(shù)據(jù)類型、變量與常量1.字符類型字符類型的數(shù)據(jù)簡稱字符型,包括(即其變量類型):(1)有符號字符型,類型名稱為char,存儲數(shù)據(jù)取值范圍為-128~127。(2)無符號字符型,類型名稱為unsignedchar,存儲數(shù)據(jù)取值范圍為0~255。字符型數(shù)據(jù)在內(nèi)存中存儲的是其ASCII編碼值(為一個整數(shù)),所以字符數(shù)據(jù)和整型數(shù)據(jù)是在C語言中可以通用的,只不過字符存儲字節(jié)為1個字節(jié)。2.1.7字符型及字符型常量、字符串常量2.1數(shù)據(jù)類型、變量與常量2.字符常量

字符常量是由一對單引號括起來的一個字符。字符型數(shù)據(jù)占一個字符,其書寫形式是用單引號括起來的單個字符。例如:'a','A','@','?'等。常用字符的ASCII編碼如下:(1)字符’A’~’Z’的ASCII編碼值為65~90。(2)字符’a’~’z’的ASCII編碼值為97~122。(3)字符’0’~’9’的ASCII編碼值為48~57。(4)空格字符的ASCII編碼值為32。例如,a的十進制ASCII碼是120,b的十進制ASCII碼是121,實際上是在內(nèi)存變量a和b分別存放120和121的二進制數(shù)。整型常量在內(nèi)存中占2個字節(jié),字符常量在內(nèi)存中占1個字節(jié),當整型量按字符型量處理時,只有低8位字節(jié)參與處理。2.1.7字符型及字符型常量、字符串常量2.1數(shù)據(jù)類型、變量與常量【練習2-5】下面哪個是合法的字符常量?'f'、'Q'、'abc'、x、"A"、'+'、'!'解:(1)合法的字符常量為(單引號內(nèi)一個字符):'f'、'Q'、'+'、'!'。(2)非法的字符常量為:'abc'(單引號內(nèi)多個字符)、x(沒有單引號)、"A"(分隔符為雙引號)。2.1.7字符型及字符型常量、字符串常量2.1數(shù)據(jù)類型、變量與常量轉(zhuǎn)義字符。轉(zhuǎn)義字符主要用來表示那些用一般字符不便于表示的控制代碼,是一種特殊的字符常量。轉(zhuǎn)義字符以反斜線“\”開頭,后跟一個或幾個字符。2.1.7字符型及字符型常量、字符串常量2.1數(shù)據(jù)類型、變量與常量【練習2-6】下面哪個是合法的轉(zhuǎn)義字符?'\\'、'\abc'、'\"'、\x、'\125'、'\x24'、'\xabc'解:(1)合法的轉(zhuǎn)義字符常量:'\\'(反斜杠)、'\"'(雙引號)、'\125'(八進制ASCII為125的字符'7')、'\x24'(十六進制ASCII為24的字符'$')。(2)非法的轉(zhuǎn)義字符常量:\x(沒有分隔符單引號)、'\xabc'(x后的十六進制數(shù)位數(shù)應該為2位而不是3位)。2.1.7字符型及字符型常量、字符串常量2.1數(shù)據(jù)類型、變量與常量3.字符串常量字符串常量是用一對雙引號括起來的零個或多個字符序列,如"hello","","abc","123"等。字符常量與字符串常量的區(qū)別。字符串常量和字符常量是不同的量,它們之間主要有以下區(qū)別:(1)字符常量由單引號括起來,字符串常量由雙引號括起來。(2)字符常量只能是單個字符,字符串常量則可以含一個或多個字符。(3)可以把一個字符常量賦予一個字符變量,但不能把一個字符串常量賦予一個字符變量。(4)字符常量占一個字節(jié)的內(nèi)存空間。字符串常量占的內(nèi)存字節(jié)數(shù)等于字符串中字節(jié)數(shù)加1,增加的一個字節(jié)中存放字符'\0'(ASCII碼為0),這是字符串結(jié)束的標志。2.1.7字符型及字符型常量、字符串常量2.1數(shù)據(jù)類型、變量與常量例如,字符串"Hello"存儲情況如下:【案例2-3】字符常量、字符串常量的輸出。單擊打開源程序程序運行結(jié)果2.1.7字符型及字符型常量、字符串常量2.1數(shù)據(jù)類型、變量與常量

在C語言中,也可以用一個標識符來表示一個常量,稱之為符號常量。符號常量在使用之前必須先定義,其一般形式為:#define符號常量

值例如:#definePI3.14 /*定義一個符號常量PI,其值為3.14*/符號常量的特點是:

習慣上符號常量的標識符用大寫字母,變量標識符用小寫字母,以示區(qū)別。

符號常量與變量不同,它的值在其作用域內(nèi)不能改變,也不能再被賦值。2.1.8符號常量2.2運算符與表達式C語言的運算符非常豐富,共有13類45個運算符,C語言運算符如表2-5所示。2.1.8符號常量2.2運算符與表達式1.算術運算符C語言中算術運算符共有5個,分別為:+(加)、-(減)、*(乘)、/(除)、%(取余,或取模)。其運算優(yōu)先級別,結(jié)合方式如表2-5所示。(1)算術運算符為雙目(需要兩個操作數(shù))運算符,結(jié)合方式均為從左到右。(2)求余運算符“%”又稱取模運算符,要求其兩側(cè)必須為整型數(shù),它的作用是取兩個整型數(shù)相除的余數(shù),余數(shù)的符號與被除數(shù)的符號相同。例如9%4結(jié)果是1;若-9%4的結(jié)果為-1;若9%-4的結(jié)果是1。(3)除法運算符“/”。當兩個操作數(shù)都是整數(shù)時,運算的結(jié)果是整數(shù)(舍去小數(shù)取整),即表示“整除”;如果參加運算的兩個數(shù)中有一個是實數(shù),則結(jié)果是實數(shù)。例如9/4結(jié)果是2;若9.0%4的結(jié)果為2.25。2.2.1算術運算符與算術表達式2.2運算符與表達式++(自增)、--(自減)運算符是C語言中使用方便且效率很高的兩個運算符,它們都是單目運算符。這兩個運算符有前置和后置兩種形式。前置就是指運算符在操作數(shù)的前面,例如++x和--x;后置就是指運算符在操作數(shù)的后面。運算規(guī)則如下:

若只對某變量自增(自減)而不參與其他賦值運算,結(jié)果都是該變量本身自增(自減)1。

若某變量自增(自減)的同時還要參加其他運算,則前綴運算是自變量先自增(減)后再參與表達式運算,后綴運算是自變量先參與表達式運算后再自增(減)。2.2.2自增、自減運算符(++、--)2.2運算符與表達式連續(xù)自增語句(以TC為例)。例如:inti=3,j;j=(++i)+(++i)+(++i);/*j的值為18,i的值為6;先將i自增3次后將3個i相加賦給j*/j=(i++)+(i++)+(i++);/*j的值為9,i的值為6;先將3個i相加賦給j,再將i自增3次*/連續(xù)自增作為printf()函數(shù)的輸出項問題。inti=3;printf("\n%d",(++i)+(++i)+(++i));/*輸出15。自右向左逐步自增和取值即6+5+4*/2.2.2自增、自減運算符(++、--)2.2運算符與表達式inti=3;printf("\n%d",(i++)+(i++)+(i++));/*輸出12。自右向左逐步取值和自增即5+4+3*/printf()函數(shù)中多輸出項計算問題,(TC和VC略有不同)。輸出項自右向左運算后,再自左向右輸出。例如:inti=3;printf("\n%d,%d,%d",++i,++i,++i);(TC輸出6,5,4,VC下輸出6,5,4)inti=3;printf("\n%d,%d,%d",i++,i++,i++);(TC輸出5,4,3,VC下輸出3,3,3)2.2.2自增、自減運算符(++、--)2.2運算符與表達式【案例2-4】自增、自減表達式的各種結(jié)果(程序中注釋按TC規(guī)范)。單擊打開源程序程序運行結(jié)果如下2.2.2自增、自減運算符(++、--)2.2運算符與表達式1.賦值表達式格式賦值表達式是由賦值運算符“=”將一個變量和表達式連接起來的式子,其一般格式為:變量=表達式即將“=”右邊表達式的值賦給左邊的變量,表達式可以是符合C語言語法的各種表達式。例如:intx,y;/*定義整型變量x和y*/x=3;/*表示將常量3賦給變量x*/y=x+2;/*表示將表達式x+2的值賦給變量y*/2.2.3賦值運算符與賦值表達式2.2運算符與表達式2.幾點說明(1)如果賦值運算兩側(cè)的類型不一致,在賦值時要將表達式的結(jié)果轉(zhuǎn)換成變量的類型,然后再賦給變量。賦值運算方向為自右向左。例如:inta,b;/*定義整型變量a和b*/a=b=12;/*從右向左進行賦值,即先將12賦給b,再將b值賦給a*/相當于先執(zhí)行b=12,再執(zhí)行a=b。(2)同一變量連續(xù)賦值。對同一變量連續(xù)賦值時,相當于只有最后一步有效。2.2.3賦值運算符與賦值表達式2.2運算符與表達式例如:inta;/*定義整型變量a*/a=5;/*為變量a賦值5*/a=10;/*為變量a賦值10(此時原來的值5已經(jīng)被覆蓋)*/則變量a的值為10,原來的值5已經(jīng)被覆蓋了。3.復和賦值運算符賦值運算符與算術運算符相結(jié)合之后,變成復合賦值運算符,如表2-5所示。例如:a+=b;相當于a=a+b;2.2.3賦值運算符與賦值表達式2.2運算符與表達式1.關系運算符關系運算符用于比較兩個運算對象的大小。關系運算符有6種:<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、==(等于)、!=(不等于)。C語言提供的關系運算符如表2-5所示。2.關系表達式關系表達式的一般形式為:表達式關系運算符表達式2.2.4關系運算符與關系表達式2.2運算符與表達式3.幾點說明(1)在上述6個運算符中,前4個運算符的優(yōu)先級高于后2個運算符的優(yōu)先級。(2)應將等于關系運算符“==”與賦值運算符“=”相區(qū)分?!?=”是關系運算符,用于比較運算;而“=”是賦值運算符,用于賦值運算。(3)關系運算符的優(yōu)先級低于算術運算符而高于賦值運算符。它們的結(jié)合方式是自左至右。2.2.4關系運算符與關系表達式2.2運算符與表達式

1.邏輯運算符邏輯運算符用來對運算對象進行邏輯操作,邏輯運算符有三種:&&(邏輯與)、||(邏輯或)和!(邏輯非)。C語言提供的邏輯運算符及其功能如表2-5所示。2.2.5邏輯運算符與邏輯表達式2.2運算符與表達式2.邏輯表達式邏輯表達式的一般形式為:邏輯表達式的值也是邏輯值,即0或1。3.優(yōu)先級常用的C語言運算符優(yōu)先級別如圖2-6所示。表達式邏輯運算符表達式2.2.5邏輯運算符與邏輯表達式2.2運算符與表達式5.邏輯表達式的短路現(xiàn)象

在C語言邏輯表達式中,有時會出現(xiàn)計算完&&或||左側(cè)的表達式,就不用再計算右側(cè)的表達式的情況,這種情況被稱為邏輯表達式的短路現(xiàn)象。這主要是因為&&或||的運算特點造成的。

若&&運算符左邊的表達式為假(或0),則其右側(cè)表達式將不再計算,整個表達式必然為假;同理,若||運算符左邊的表達式為真(或非0值),則其右側(cè)表達式將不再計算,整個表達式必然為真。2.2.5邏輯運算符與邏輯表達式2.2運算符與表達式例如:9<3&&++a因為表達式9<3的值為0,因此&&右側(cè)的表達式將不再計算,a值不進行自加,整個表達式的值為0。9>3||++a因為表達式9>3的值為1,因此||右側(cè)的表達式將不再計算,a值不進行自加,整個表達式的值為1。2.2.5邏輯運算符與邏輯表達式2.2運算符與表達式C語言中保留了低級語言中的二進制位運算符,以提高計算的靈活性與效率。位運算分為移位運算與按位邏輯運算。移位運算包括按位左移(<<)和按位右移(>>),按位邏輯運算包括按位求反(~)、按位與(&)、按位或(|)和按位異或(^)。

位運算符是對其操作數(shù)按二進制形式逐步地進行邏輯運算或移位運操作的,運算對象為char、short、int等類型數(shù)據(jù),但不能是浮點型數(shù)據(jù)。2.2.6位運算符優(yōu)先級運算符名

稱運算符類型結(jié)合方式5<<、>>左移、右移位(雙目)運算符由左向右8&按位與位(雙目)運算符由左向右9^按位異或位(雙目)運算符由左向右10|按位或位(雙目)運算符由左向右2.2運算符與表達式【案例2-5】閱讀下面程序,分析并寫出程序運行結(jié)果。單擊打開源程序程序運行結(jié)果2.2.6位運算符2.2運算符與表達式1.條件運算符和條件表達式

條件運算符是由字符“?”和“:”組成的,要求有三個運算對象,是C語言中唯一的三目運算符。條件運算符的優(yōu)先級高于賦值運算和逗號運算符,而低于其他運算符,其結(jié)合方式為自右至左。

條件表達式是由條件運算符將運算對象連接起來的式子,其一般格式為:表達式1?

表達式2:

表達式32.2.7其他運算符2.2運算符與表達式

條件表達式的求解過程為:先求解表達式1,若表達式1的值為1(真),則求解表達式2,并將其作為整個表達式的值;如表達式1的值為0(假),則求解表達式3,并將其作為整個表達式的值。

求兩個數(shù)a和b中的最大值,用條件表達式表示如下:a>b?a:b2.2.7其他運算符2.2運算符與表達式2.逗號運算符和逗號表達式在C語言中,符號“,”除了做分隔符外,還可以作為運算符將若干個表達式連接在一起形成逗號表達式。逗號表達式的一般格式為:逗號表達式的運算規(guī)則是:先求解表達式1,再求解表達式2,依次求解到表達式n,最后一個表達式的值就是整個逗號表達式的值。逗號運算符的優(yōu)先級最低,結(jié)合方式為自左至右。表達式1,表達式2,…,表達式n2.2.7其他運算符2.2運算符與表達式3.括號運算符和括號表達式圓括號運算符“()”的優(yōu)先級最高,用它將某些運算符和運算對象括起來以后,這些括起來的運算符和運算對象要優(yōu)先運算。例如,s=(a=1,b=2,c=3,c=a*(b+c));,盡管運算符“*”的優(yōu)先級比運算符的“+”的優(yōu)先級高,但由于(b+c)使用了圓括號運算符,故應優(yōu)先運行b+c。2.2.7其他運算符2.2運算符與表達式4.求字節(jié)運算符sizeofsizeof的定義格式如下:其功能為測定某一種類型數(shù)據(jù)所占存儲空間長度,結(jié)果是該類型在內(nèi)存中所占的字節(jié)數(shù)。括號內(nèi)可以是該數(shù)據(jù)類型名或是該類型的變量名。例如:intx;x=sizeof(int); /*求整型變量的內(nèi)存所占字節(jié)數(shù),TC中語句執(zhí)行的結(jié)果是x的值為2*/也可以寫為:x=sizeof(x); /*函數(shù)的返回值也是2*/sizeof(數(shù)據(jù)類型名)

sizeof(變量名)2.2.7其他運算符2.2運算符與表達式【案例2-6】編寫一個程序,用sizeof運算符求字符型、短整型、基本整型、長整型、單精型浮點型、雙精度浮點的內(nèi)存字節(jié)數(shù)。單擊打開源程序程序運行結(jié)果2.2.7其他運算符2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差C語言有豐富的數(shù)據(jù)類型,各不同的數(shù)據(jù)類型的存儲長度和存儲方式不同,一般不能直接混合運算。在C語言中,數(shù)據(jù)類型的轉(zhuǎn)換方式有三種:自動類型轉(zhuǎn)換、賦值類型轉(zhuǎn)換和強制類型轉(zhuǎn)換。2.3.1類型轉(zhuǎn)換概述2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差1.不同數(shù)據(jù)類型的差異數(shù)據(jù)類型的差異體現(xiàn)在存儲數(shù)據(jù)的范圍和精度上,存儲數(shù)據(jù)的范圍越大、精度越高,該類型越“高級”。2.數(shù)據(jù)類型轉(zhuǎn)換產(chǎn)生的效果(1)數(shù)據(jù)類型級別的提升與降低:短數(shù)據(jù)轉(zhuǎn)換成長數(shù)據(jù);整數(shù)轉(zhuǎn)換成實數(shù);signed型轉(zhuǎn)換成unsigned型。(2)符號位擴展與零擴展。為保持數(shù)值不變,整型短數(shù)據(jù)轉(zhuǎn)換成整型長數(shù)據(jù)時將產(chǎn)生符號位擴展與零擴展。2.3.1類型轉(zhuǎn)換概述2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差例如:intx=’a’;字符’a’的二進制形式和intx的二進制形式如圖2-7所示。2.3.1類型轉(zhuǎn)換概述2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差(3)截去高位產(chǎn)生數(shù)值的變化。通過上面學習可以得到,如果把長類型的數(shù)據(jù)賦值給短類型的變量,必然將產(chǎn)生丟失高位字節(jié)的效果。(4)丟失精度。實數(shù)轉(zhuǎn)換成整數(shù)時,由于截去小數(shù)將丟失精度。double型轉(zhuǎn)換成float型時,有效數(shù)字減少(四舍五入),精度丟失。long型轉(zhuǎn)換成float型時,由原來可達10位整數(shù)變成只有7位有效數(shù)字,精度丟失,但由于數(shù)的范圍擴大了,數(shù)據(jù)類型從較低級提升到高級。2.3.1類型轉(zhuǎn)換概述2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差自動類型轉(zhuǎn)換是指在C語言中,不同的數(shù)據(jù)可以出現(xiàn)在同一個表達式中。在進行運算時,C語言自動進行必要的數(shù)據(jù)類型轉(zhuǎn)換,以完成表達式的求值。2.3.2自動類型轉(zhuǎn)換2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差賦值運算時,如果賦值運算符兩側(cè)的類型(指基本類型)不一致,系統(tǒng)自動將表達式轉(zhuǎn)換成變量的類型存到變量的存儲單元中,轉(zhuǎn)換的情況有以下幾種。(1)整型賦給實型變量時,數(shù)值上不發(fā)生任何變化。例如:floatx;x=24;(2)實型數(shù)據(jù)賦給整型變量時,小數(shù)部分將舍棄。例如:intx;x=25.48;(3)短的有符號整型賦給長整型變量時,需要進行符號位擴展。(4)短的無符號整型賦給長整型變量時,需要進行0擴展。(5)長整型數(shù)據(jù)賦給短整型變量時,有可能溢出。例如:charx=324;溢出x值為’d’。(6)同長度有符號整型數(shù)據(jù)賦給無符號整型數(shù)據(jù)時,數(shù)據(jù)將失去符號位功能。(7)同長度有符號整型數(shù)據(jù)賦給有符號整型數(shù)據(jù)時,數(shù)據(jù)將得到符號位功能。2.3.3賦值類型轉(zhuǎn)換2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差強制類型轉(zhuǎn)換的運算格式如下:強制類型轉(zhuǎn)換用于不能自動轉(zhuǎn)換的情況。例如:(int)3.14/*將3.14轉(zhuǎn)換成整型,其值為3*/(int)(3.14+4.78)/*將表達式3.14+4.78的和7.92轉(zhuǎn)換成int型,值為7*/(int)3.14+4.78 /*將3.14轉(zhuǎn)換成int型的值3,然后再加上4.78,值為7.78*/(類型)表達式

或類型(表達式)2.3.4強制類型轉(zhuǎn)換2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差1.數(shù)據(jù)的溢出因為C語言定義的各種數(shù)據(jù)類型長度有限,所以有時為不同數(shù)據(jù)類型賦值或運算時,可能會發(fā)生數(shù)據(jù)溢出現(xiàn)象,即所得數(shù)據(jù)值超出所能存放的最大值,結(jié)果為非正確的數(shù)據(jù)。例如:charx=127;x=x+1;其二進制變化情況如圖2-9和圖2-10所示。2.3.5數(shù)據(jù)的溢出和誤差2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差127加1后并沒有等于128,因為char型的數(shù)據(jù)最大值是127,加1后溢出,變成負數(shù)-128的補碼了。同理,直接將128賦給字符型變量x,結(jié)果一樣,x無法存儲128,存儲的還是-128的補碼。2.3.5數(shù)據(jù)的溢出和誤差2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差【案例2-7】演示各種類型數(shù)據(jù)的溢出。單擊打開源程序程序運行結(jié)果通過上面案例可以看出,不同數(shù)據(jù)類型的數(shù)據(jù)存儲值都有下限和上限,所以在定義數(shù)據(jù)類型時要注意運算的數(shù)值的大小,來決定數(shù)據(jù)類型的定義。2.3.5數(shù)據(jù)的溢出和誤差2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差2.實數(shù)的誤差整數(shù)存儲除了溢出以外是沒有誤差的。然而實型數(shù)據(jù)由于是用有限的存儲單元存儲較大范圍的實數(shù),有效數(shù)字是有尾數(shù)限制的,在實際計算和引用中會有很多問題。例如,如果將一個非常大的數(shù)加上一個非常小的數(shù),小數(shù)就會被忽略?;蚴窃谟嬎銜r,小數(shù)的有效位加上一個數(shù)是有效的,如果無效位上加上一個數(shù)還是無效的。2.3.5數(shù)據(jù)的溢出和誤差2.3數(shù)據(jù)類型轉(zhuǎn)換及數(shù)據(jù)的溢出誤差【案例2-8】演示實數(shù)的誤差。單擊打開源程序程序運行結(jié)果2.3.5數(shù)據(jù)的溢出和誤差2.4數(shù)據(jù)的輸入/輸出C語言提供的函數(shù)以庫的形式存放在系統(tǒng)中,它們不是C語言文本中的組成部分。在使用函數(shù)庫時,要用到預編譯命令#include將有關的“頭文件”包含到用戶源文件中。例如:#include“stdio.h”/*標準輸入、輸出頭文件包含命令*/

預編譯命令一般放在程序的開頭,使用不同類型的函數(shù)需要包含不同的“頭文件”。在C語言中經(jīng)常使用的輸入、輸出函數(shù)主要有格式化輸出函數(shù)(printf)、格式化輸入函數(shù)(scanf)、字符輸出函數(shù)(putchar)和字符輸入函數(shù)(getchar)。2.4數(shù)據(jù)的輸入/輸出1.printf的函數(shù)調(diào)用形式printf是系統(tǒng)標準庫函數(shù),其調(diào)用一般形式為:printf括號內(nèi)有兩項,前一項是輸出數(shù)據(jù)的格式(即要輸出什么類型的數(shù)據(jù)),后一項是輸出數(shù)據(jù)名稱(即要輸出哪個變量)。

printf("格式控制字符串",輸出列表

);2.4.1格式化輸出函數(shù)printf2.4數(shù)據(jù)的輸入/輸出格式字符串內(nèi)部有兩個信息。(1)格式說明。它的作用是將要輸出的數(shù)據(jù)轉(zhuǎn)化為指定的格式輸出。通常默認形式是“%”加上一個字符,如%d表示十進制整數(shù)格式控制符,%f表示小數(shù)格式控制符等。(2)普通字符。除了格式說明符外,所有字符均按原樣輸出。例如:intx=3;printf(“x=%d”,x);輸出結(jié)果為:x=32.4.1格式化輸出函數(shù)printf2.4數(shù)據(jù)的輸入/輸出2.printf的格式說明如果要輸出復雜的格式,可以設置格式控制符,就可以按用戶的格式要求來輸出相關數(shù)據(jù)。一般是“%”加上若干個英文字母,用以說明數(shù)據(jù)輸出的類型、長度、位數(shù)等。格式控制符的一般形式為:

%[標志][輸出最小寬度][.精度][長度]類型2.4.1格式化輸出函數(shù)printf2.4數(shù)據(jù)的輸入/輸出其中有方括號[]的項為可選項。各項的意義如下。(1)標志:可以是-、+、0。因為printf的默認格式是右對齊,左邊輸出空格。如果想按左對齊方式輸出,則標志寫“-”。如果想讓空白位輸出0,則標志寫“0”。如果想讓正數(shù)前面輸出“+”號,則標志寫“+”。(2)輸出最小寬度:十進制整數(shù)。表示按此數(shù)值作為數(shù)據(jù)寬度輸出。例如:printf(“%+5d”,21);/*輸出結(jié)果為□□+21,其中5為輸出寬度,□為空格*/printf(“%-5d”,21);/*輸出結(jié)果為21□□□,其中5為輸出寬度,□為空格*/printf(“%05d”,21);/*輸出結(jié)果為00021,5為輸出寬度,前面的0為表示占位用數(shù)字0*/2.4.1格式化輸出函數(shù)printf2.4數(shù)據(jù)的輸入/輸出(3)精度:精度格式符以“.”開頭,后跟十進制整數(shù)。本項的意義是:如果輸出數(shù)字,則表示小數(shù)的位數(shù);如果輸出的是字符,則表示輸出字符的個數(shù);若實際位數(shù)大于所定義的精度數(shù),則截去超過的部分。如果輸出的是字符串,則表示輸出字符的個數(shù)。例如:printf(“%7.2f”,123.456789);/*輸出結(jié)果為□123.46,其中7為輸出總寬度,2為小數(shù)點后位數(shù)*/printf(“%7.5s”,”BoyAndGirl1”);/*輸出結(jié)果為□□BoyAn,其中7為輸出總寬度,5為輸出字符個數(shù),□為空格*/(4)長度:可以是h、l。h表示是按短整型輸出,l表示按長整型輸出。例如:longx=356;printf(“%5ld”,x);/*輸出結(jié)果為□□356,其中5為輸出寬度,長整型需要加l*/(5)類型:是格式說明符中必須有的項。它表示輸出列表里要輸出的數(shù)據(jù)類型。常用的數(shù)據(jù)類型格式控制符如表2-7所示(所有格式字符必須小寫)。2.4.1格式化輸出函數(shù)printf2.4數(shù)據(jù)的輸入/輸出表2-7printf函數(shù)的常用類型控制字符表2.4.1格式化輸出函數(shù)printf格式字符意義d按十進制形式輸出帶符號的整數(shù)(正數(shù)前無+號)o按八進制形式無符號輸出(無前導o)x按十六進制形式無符號輸出(無前導ox)u按十進制無符號形式輸出c按字符形式輸出一個字符f按十進制形式輸出單、雙精度浮點數(shù)(默認6位小數(shù))e按指數(shù)形式輸出單、雙精度浮點數(shù)s輸出以\o結(jié)尾的字符串2.4數(shù)據(jù)的輸入/輸出3.printf的輸出列表printf函數(shù)中的“輸出列表”部分由表達式組成,這些表達式應與“格式控制字符串”中的格式說明符的類型一一對應,若“輸出列表”中有多個表達式,則每個表達式之間應由逗號隔開,各輸出項可以是任意合法的表達式(包括常量、變量和函數(shù)調(diào)用)。因此printf函數(shù)也具有計算的功能。printf("%d\n",100); /*輸出顯示:100*/printf("%d\n",12340000+5678); /*輸出顯示:12345678*/printf("%f\n",(x=123.0)+(y=0.4567)); /*輸出顯示:123.456700*/printf("%6.2f\n",123.4567); /*輸出顯示:123.46*/printf("%.3f\n",123.4567); /*輸出顯示:123.457*/2.4.1格式化輸出函數(shù)printf提示:定義浮點型變量時要注意小數(shù)的精度問題浮點型數(shù)據(jù)在賦值的過程中,float型的變量x只能接收7位有效數(shù)字,而double型的變量y能接收15~16位有效數(shù)字。如果賦值的小數(shù)后的位數(shù)過多或過少,都會造成數(shù)據(jù)的精度丟失或不足。2.4數(shù)據(jù)的輸入/輸出【案例2-9】演示各種數(shù)據(jù)的輸出格式。單擊打開源程序程序運行結(jié)果2.4.1格式化輸出函數(shù)printf2.4數(shù)據(jù)的輸入/輸出scanf函數(shù)的功能是從鍵盤上將數(shù)據(jù)按用戶指定的格式輸入給指定的變量。1.scanf的函數(shù)調(diào)用形式scanf函數(shù)是系統(tǒng)標準庫函數(shù),其調(diào)用一般形式為:其中格式控制字符串的定義與使用方法與printf相同,但不能顯示非格式字符。地址列表是要賦值的各變量地址。地址是由地址運算符“&”后跟變量名組成。如&a表示變量a的地址。scanf("格式控制字符串",地址列表

);2.4.2格式化輸入函數(shù)scanf2.4數(shù)據(jù)的輸入/輸出2.scanf的格式說明如果要輸入不同類型的數(shù)據(jù),可以設置格式控制符,C語言允許按用戶的格式要求來輸入相關數(shù)據(jù)。一般是“%”加上若干個英文字母,用以說明數(shù)據(jù)輸入的類型、長度、位數(shù)等。格式控制符的一般形式為:

%[*][寬度][長度]類型2.4.2格式化輸入函數(shù)scanf其中有方括號[]的項為可選項,各項的意義如下。(1)[*]:表示輸入的數(shù)值不賦給相應的變量,即跳過該數(shù)據(jù)不讀。例如:scanf("%d%*d%d",&a,&b);當輸入為:123時,將1賦給a,2被跳過,3賦給b。2.4數(shù)據(jù)的輸入/輸出(2)[寬度]:十進制整數(shù),表示輸入數(shù)據(jù)的最大寬度。例如:scanf("%5d",&a);輸入:12345678↙只把12345賦給變量a,其余部分被截去。(3)[長度]:長度格式符為l和h,l表示輸入長整型數(shù)據(jù)(如%ld)和雙精度浮點數(shù)(如%lf),h表示輸入短整型數(shù)據(jù)。(4)類型:是格式說明符中必須有的項。它表示地址列表里要輸入的數(shù)據(jù)類型。2.4.2格式化輸入函數(shù)scanf2.4數(shù)據(jù)的輸入/輸出3.scanf的地址列表在C語言中,使用了地址這個概念,這是與其他語言不同的。應該把變量的值和變量的地址這兩個不同的概念區(qū)別開來,變量的地址是C編譯系統(tǒng)分配的,用戶不必關心具體的地址是多少。例如:inta=567;則a為變量名,567是變量的值,&a表示變量a的地址。但在賦值號左邊是變量名,不能寫地址。而scanf函數(shù)在本質(zhì)上也是給變量賦值,但要求寫變量的地址,如&a。這兩者在形式上是不同的。&是一個取地址運算符,&a是一個表達式,其功能是求變量的地址。2.4.2格式化輸入函數(shù)scanf2.4數(shù)據(jù)的輸入/輸出4.使用scanf函數(shù)注意事項(1)在用scanf函數(shù)輸入數(shù)據(jù)時,不能規(guī)定精度。(2)scanf中要求給出變量地址,若給出變量名則會出錯。(3)在輸入多個數(shù)值數(shù)據(jù)時,若格式控制串中沒有非格式字符做輸入數(shù)據(jù)之間的間隔,則可用空格、Tab或回車。C編譯在碰到空格、Tab、回車或非法數(shù)據(jù)(如對“%d”輸入“12A”時,A即為非法數(shù)據(jù))時即認為該數(shù)據(jù)結(jié)束。(4)在輸入字符數(shù)據(jù)時,若格式控制串中無非格式字符,則認為所有輸入的字符(字符類型的空格也為有效字符常量)均為有效字符。2.4.2格式化輸入函數(shù)scanf2.4數(shù)據(jù)的輸入/輸出(5)如果格式控制串中有非格式字符,則輸入時也要輸入該非格式字符。例如:scanf("%d,

溫馨提示

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

評論

0/150

提交評論