C語言及程序設(shè)計課件1第二章 數(shù)據(jù)類型、運算符與表達式_第1頁
C語言及程序設(shè)計課件1第二章 數(shù)據(jù)類型、運算符與表達式_第2頁
C語言及程序設(shè)計課件1第二章 數(shù)據(jù)類型、運算符與表達式_第3頁
C語言及程序設(shè)計課件1第二章 數(shù)據(jù)類型、運算符與表達式_第4頁
C語言及程序設(shè)計課件1第二章 數(shù)據(jù)類型、運算符與表達式_第5頁
已閱讀5頁,還剩47頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

教學(xué)要點與重點

教學(xué)要點:程序的主要功能是處理數(shù)據(jù),數(shù)據(jù)是計算機程序的重要組成部分,是程序處理的對象。在C語言中,任何數(shù)據(jù)都屬于一種數(shù)據(jù)類型。C語言提供了豐富的數(shù)據(jù)類型,數(shù)據(jù)類型明確地規(guī)定了該類型數(shù)據(jù)的取值范圍和基于該類型數(shù)據(jù)基本運算。運算符用來表示各種運算,它們構(gòu)成了C語言表達式的基本元素。教學(xué)重點:C語言的常量和變量、基本數(shù)據(jù)類型和數(shù)據(jù)類型間的轉(zhuǎn)換、運算符和表達式。2.1常量和變量2.1.1常量 在程序運行過程中,其值不能被改變的量稱為常量。在C語言中常量類型包括整型常量、實型常量、字符常量、字符串常量和符號常量。(1)整型常量整型常量用來表示整數(shù),整型數(shù)據(jù)可以以十進制、八進制和十六進制整數(shù)形式來表示,不同的進位制有其不同的表示方式。①十進制整型常量十進制整數(shù)由正、負(fù)號和阿拉伯?dāng)?shù)字0~9組成,首位數(shù)字不能是0。②八進制整型常量八進制整數(shù)由正、負(fù)號和阿拉伯?dāng)?shù)字0~7組成,首位數(shù)字必須是0。③十六進制整型常量十六進制整數(shù)由正、負(fù)號、阿拉伯?dāng)?shù)字0~9和英文字符A~F(a~f)組成,首位數(shù)字前必須加前綴0X(0x)。整形常量實例下面是合法的整型常量:5121——(十進制正整數(shù))0111——(八進制正整數(shù),等于十進制數(shù)73)0177777——(八進制正整數(shù),等于十進制65537)0XFFFF——(十六進制正整數(shù),等于十進制數(shù)65537)0xA3——(十六進制正整數(shù),等于十進制數(shù)163)-32768——(十進制負(fù)整數(shù))下面不是合法的整型常量:09876——(非十進制數(shù),又非八進制數(shù),因為有數(shù)字8和9)20fa——(非十進制數(shù),又非十六進制數(shù),因為不是以0x開頭)0x10fg——(出現(xiàn)了非法字符)0X4H——(十六進制整數(shù)含有非法字符)H3A——(十六進制整數(shù)又沒有以0X開頭)2)實型常量

實型常量即常說的實數(shù),實型常量只采用十進制,有十進制浮點表示法和科學(xué)計數(shù)法兩種表示形式。①浮點表示法它由正負(fù)號、數(shù)字和小數(shù)點組成,必須有小數(shù)點,實數(shù)的浮點表示法又稱實數(shù)的小數(shù)形式。例如,1.58、-12.34、0.1234等都是正確的十進制浮點表示法。②科學(xué)計數(shù)法它由正負(fù)號、數(shù)字和階碼標(biāo)志“E”或“e”組成,在“e”之前要有數(shù)據(jù),之后只能是整數(shù),其一般形式為aE±n(a為十進制實數(shù),n為十進制整數(shù)),當(dāng)冪指數(shù)為正數(shù)時,正號可以省略。實數(shù)的科學(xué)計數(shù)法又稱實數(shù)的指數(shù)形式。例如,1.23e+2、-6.8e-9、12e3都是合法的指數(shù)形式,而.e3、e1.2、2e2.3都是不合法的指數(shù)形式。(3)字符型常量

字符常量是單引號(即撇號)括起來的一個字符。如'b'、'%'、'9'、'C'等都是字符常量。使用字符常量時需要注意以下幾點:①字符常量中的單撇號只起定界作用并不表示字符本身,當(dāng)輸出一個字符常量時不輸出此撇號。②單撇號中的字符不能是單撇號(')和反斜杠(\)。③單撇號中必須恰好有一個字符,不能空缺(空格也是一個字符)。④不能用雙撇號代替撇號,如"A"不是字符常量。⑤空格也是字符,表示為''。

在C語言中有一類特殊的字符常量,被稱為轉(zhuǎn)義字符。它們用來表示特殊符號或鍵盤上的控制代碼,如回車符、退格符等控制符號,只能用轉(zhuǎn)義字符來表示。轉(zhuǎn)義字符是用反斜杠(\)后面跟一個字符或一個八進制或十六進制數(shù)表示。如表2-1。(4)字符串常量

字符串常量是用雙引號(雙撇號)括起來的若干字符。例如,"HelloWorld"、"1234"、"string"、"a"等。

字符串中所含的字符個數(shù)稱為字符串的長度。雙引號中一個字符都沒有的稱為空串,長度為0。字符串常量在內(nèi)存中存儲時,系統(tǒng)自動在字符串的末尾加一個“串結(jié)束標(biāo)志”,用轉(zhuǎn)義字符“\0”表示。即長度為n個字符的字符串常量,在內(nèi)存中占有n+1個字節(jié)的存儲空間。

例如,字符串“program”含有7個字符,作為字符串常量存儲于內(nèi)存中時,共占用8個字節(jié),系統(tǒng)自動在最后加一個字符“\0”,但在輸出時不輸出“\0”,在內(nèi)存中存儲形式為:program\0

對于含有轉(zhuǎn)義字符的字符串,應(yīng)將轉(zhuǎn)義字符計算為1個字符。例如"AB\n"的長度為3而不是4,若反斜杠后的轉(zhuǎn)義字符與表2-1中的不匹配,則不參與長度計算。例如,字符串"AB\C"的長度為3。(5)符號常量符號常量是在一個程序中所指定的以符號代表的常量,若在程序中某個常量多次被使用,則可以使用符號常量來代替該常量。例如,對于圓周率常數(shù)π,可以使用一個符號常量如PI來替代。在C語言中使用宏定義命令#define定義符號常量。語法格式如下:

#define符號常量名標(biāo)識符常量

#define是宏命令,一個#define命令只能定義一個符號常量。

參考程序如下:

#include<stdio.h> #definePI3.14 voidmain() { floatr,s,v; printf("請輸入半徑r:\n"); scanf("%f",&r);/*輸入半徑r*/ s=4*PI*r*r; /*計算球體表面積*/ v=4.0/3*PI*r*r;/*計算球體體積*/ printf("s=%f,v=%f\n",s,v); }定義PI為符號常量,值為3.14需要注意的是:符號常量通常用大寫字母表示,而且符號常量不是變量,一旦定義則在整個作用域內(nèi)不能改變。

運行情況:請輸入半徑r值:2↙ (輸入2并回車)s=50.240002,v=16.754667(輸出的結(jié)果)2.1.2變量在程序運行過程中,其值可以改變的量稱為變量。所有變量必須預(yù)先定義才能使用。(1)變量的命名一個變量必須有一個名字,且必須合法的C語言標(biāo)識符,常用小寫字母。(2)變量的定義聲明變量的基本語法格式為:數(shù)據(jù)類型符變量列表;數(shù)據(jù)類型符必須是有效的C語言數(shù)據(jù)類型,當(dāng)有多個變量名時由逗號作為分割符。變量名實際上是一個符號地址,在對程序編譯鏈接時,由系統(tǒng)給每一個變量分配一個內(nèi)存地址,在該地址的存儲單元中存放變量的值。例如:

inti,j,k;/*三個整型變量,用逗號分割*/charch;/*定義ch為字符型變量*/(3)變量的初始化所謂變量的初始化就是為變量賦初值。一個變量定義后,系統(tǒng)只是按定義的數(shù)據(jù)類型分配其相應(yīng)的存儲單元,是一個不確定值。變量在使用前一定要為其賦初值。在為變量初始化時,可以采用以下幾種方式:①定義時直接賦值例如:inti=1,j=2; charc=’A’;②變量定義后,使用賦值語句初始化例如:inta,b,ca=1;b=2;c=3;/*注意分隔符為分號*/③調(diào)用輸入函數(shù)為變量賦值例如:inta,b,c; scanf(“%d%d%d”,&a,&b,&c);

變量在定義直接賦值時不允許連續(xù)賦值,例如,若要對三個變量i,j,k賦同一個初值,不能寫成如下形式:inti=j=k=1;※一定要遵循“先定義、后使用”的原則。2.2基本數(shù)據(jù)類型

基本數(shù)據(jù)類型可以使用signed(有符號類型)、unsigned(無符號類型)、short(短整型)、long(長整型)來四種類型標(biāo)志符進行說明,從而形成更多的數(shù)據(jù)類型。C語言的基本數(shù)據(jù)類型框架如圖2-1所示,基本類型屬性表如表2-2所示。圖2-1C語言基本數(shù)據(jù)類型類別數(shù)據(jù)類型類型符數(shù)據(jù)長度(字節(jié))取值范圍字符型字符型char10~255整型基本整型int4-2147483648~2147483647短整型short[int]2-32768~32767長整型long[int]4-2147483648~2147483647無符號整型無符號基本整型unsigned[int]40~4294967295無符號短整型unsignedshort[int]20~65535無符號長整型unsignedlong[int]40~4294967295實型(浮點型)單精度實型float4約±(10-38~1038)雙精度實型double8約±(10-308~10308)長雙精度實型longdouble10約10-4932~104932表2-2C語言的基本數(shù)據(jù)類型屬性表2.2.1整數(shù)類型整數(shù)類型的值只能是整數(shù),C語言提供了多種的整數(shù)類型,包括基本整型、長整型、短整型、無符號整型、有符號整型等共11種類型,最基本的是基本整型int,其余10種整數(shù)類型是由類型修飾符與int組合而成,使用類型修飾符來修飾整數(shù)類型時,基本整型標(biāo)識int可以省略。例如:

shortint 短整型等價于 shortlongint長整型等價于 longunsignedint無符號整型等價于 unsignedsignedint 有符號整型等價于 signedshort

若表示長整型整數(shù),則在數(shù)的最后加后綴修飾符,用字母“L”或“l(fā)”表示,表示無符號整型整數(shù),在數(shù)的最后加后綴“U”或“u”。例如36L表示十進制常整型常量,36U表示無符號整型常量?!纠?.2】整數(shù)類型數(shù)據(jù)定義、賦值與輸出。

參考程序如下:

#include<stdio.h> voidmain() { inta=30000; /*基本整型*/ shortintb=20000; /*短整型*/ longintc=123456780; /*長整型*/ unsignedintd=25; /*無符號整型*/ printf("%d\t%d\t%d\t%u\n",a,b,c,d);/*整型數(shù)據(jù)輸出,%u為無符號類型*/ }程序說明:

程序中的數(shù)據(jù)變量類型全部為整型,包括基本整型、短整型、長整型和無符號型。

運行情況:

30000 20000 12345678025

(輸出的結(jié)果)

注意數(shù)據(jù)類型的取值范圍,賦值不當(dāng)可能出現(xiàn)越界錯誤。若將第5行語句修改為:shortintb=50000;程序編譯時會出現(xiàn)警告提示:“warningC4305:‘initializing’:truncationfrom‘constint’to‘short’”,因為短整型數(shù)據(jù)的最大取值為32767,50000已超出最大取值,產(chǎn)生越界警告,雖然程序依舊能夠運行,但程序的運行結(jié)果已不是理論上的輸出結(jié)果。2.2.2字符型字符型數(shù)據(jù)在內(nèi)存中占用一個字節(jié),用于存儲它的ASCII值,字符類型的標(biāo)識符是char。它是以ASCII碼形式存儲的,而ASCII碼形式上就是0到255之間的整數(shù),所以C語言的字符型數(shù)據(jù)和整型數(shù)據(jù)可以通用。例如:

charc;c=‘A‘與c=65等價這是因為字符‘A’的ASCII值用十進制表示就是65,字符‘A’和整數(shù)65在計算機中的存儲為:字符'A'的ASCII碼:01000001

整數(shù)65的ASCII碼:0000000001000001

和整型數(shù)據(jù)一樣,字符型數(shù)據(jù)可以進行算術(shù)運算與混合運算,可以與整型變量相互賦值與運算,即可以以字符型數(shù)據(jù)格式輸出,也可以以整型數(shù)據(jù)格式輸出?!纠?.3】字符型數(shù)據(jù)定義、賦值與輸出。 參考程序如下:

#include<stdio.h> voidmain() { charc1='A',c2='a';/*字符型變量定義并賦值*/ intx=89,y=56; printf("%c\t%c\n",c1,c2);/*以字符形式輸出字符型變量值*/ printf("%d\t%d\n",c1,c2);/*以整型形式輸出字符型變量值*/ printf("%d\t%d\n",x,y); /*以整型形式輸出整型變量值*/ printf("%c\t%c\n",x,y); /*以字符形式輸出整型變量值*/ }

運行情況:

A a(輸出的結(jié)果)

65 97(輸出的結(jié)果)

89 56(輸出的結(jié)果)

Y 8(輸出的結(jié)果)

2.2.3實數(shù)類型實數(shù)又稱浮點數(shù),浮點數(shù)可以表示帶小數(shù)的數(shù),浮點型數(shù)據(jù)包括單精度型、雙精度型和長雙精度型三種,分別用標(biāo)識符float、double和longdouble表示,三種精度的長度和表示范圍詳見表2-2。浮點數(shù)在計算機中是以指數(shù)形式存儲的,其存儲單元被分成小數(shù)部分和指數(shù)部分,小數(shù)部分所占的字節(jié)數(shù)決定了數(shù)值的精確程度,小數(shù)部分的位數(shù)愈多,數(shù)的精確程度愈高;指數(shù)部分所占的字節(jié)數(shù)決定了數(shù)的絕對值范圍,指數(shù)部分的位數(shù)愈多,數(shù)的表示范圍就愈大。通常,單精度實數(shù)提供7位有效數(shù)字,雙精度實數(shù)提供15~16位有效數(shù)字。單精度實數(shù)可以與雙精度實數(shù)進行混合運算,但由雙精度向單精度賦值時,會使實數(shù)的精度下降。實數(shù)常量都是雙精度浮點型?!纠?.4】實型數(shù)據(jù)定義、賦值與輸出。參考程序如下:

#include<stdio.h>voidmain(){ floatx=256.012341678,m;/*單精度實型變量*/ doubley=123456780.1256789,n;/*雙精度實型變量*/ m=x+y; n=x+y; printf("x=%f\n",x); /*有誤差產(chǎn)生*/ printf("y=%f\n",y); printf("m=%f\n",m);/*有誤差產(chǎn)生*/ printf("n=%f\n",n);}

程序說明:

程序定義了兩個單精度實型變量和兩個雙精度實型變量并賦初值,程序在編譯時會出在第4行和第6行出現(xiàn)警告:“warningC4305:‘initializing’:truncationfrom‘constdouble’to‘float’”和“warningC4244:‘=’:conversionfrom‘double’to‘float’,possiblelossofdata”,這些信息實際上都是在警告可能會出現(xiàn)數(shù)據(jù)丟失,運行結(jié)果與理論計算值相比,確實有數(shù)據(jù)丟失,產(chǎn)生誤差。 2.3數(shù)據(jù)類型的轉(zhuǎn)換 數(shù)據(jù)類型的轉(zhuǎn)換包括自動轉(zhuǎn)換和強制轉(zhuǎn)換。自動轉(zhuǎn)換時由低類型向高類型轉(zhuǎn)換,由C語言編譯系統(tǒng)自動完成,強制轉(zhuǎn)換也可以將高類型轉(zhuǎn)換為低類型,但可能造成信息丟失。2.3.1自動類型轉(zhuǎn)換(1)非賦值運算的類型轉(zhuǎn)換 不同類型的數(shù)據(jù)參加運算,編譯程序按照一定規(guī)則自動將它們轉(zhuǎn)換為同一類型,然后再進行運算,轉(zhuǎn)換規(guī)則如圖2-2所示。

垂直方向的轉(zhuǎn)換表示當(dāng)運算對象為不同類型時轉(zhuǎn)換的方向。若int型與double型數(shù)據(jù)進行運算,先將int型的數(shù)據(jù)直接轉(zhuǎn)換成double型,然后進行數(shù)據(jù)計算,結(jié)果為double型。需要注意的是,由低向高轉(zhuǎn)換,轉(zhuǎn)換是一步到位的?!纠?.5】數(shù)據(jù)類型轉(zhuǎn)換。參考程序如下

#include<stdio.h>voidmain(){doublel; inte=5;floath=6.24;doublef=69.5;chard='D';l=(8-d)+e*h+f/e;printf("%f\n",l);}程序說明:運算次序為:首先計算8-d,先將d轉(zhuǎn)換成int型數(shù)據(jù)進行運算,結(jié)果為int型;然后計算e*h,先將e與h都轉(zhuǎn)換成double型,運算結(jié)果為double型;再計算f/e,將e轉(zhuǎn)換成double型,運算結(jié)果為double型;也就是最后是一個int型數(shù)據(jù)和兩個double型數(shù)據(jù)相加,結(jié)果為double型。運行情況:-14.900001(輸出的結(jié)果)(2)賦值運算的類型轉(zhuǎn)換 賦值運算的類型轉(zhuǎn)換是指通過賦值運算符“=”實現(xiàn)變量類型的轉(zhuǎn)換,賦值符號右邊的表達式的值的類型自動轉(zhuǎn)換為其左邊變量的類型。①將整型數(shù)據(jù)賦值給實型變量時,數(shù)值不變,但以實型數(shù)據(jù)形式存儲表示。②將實型數(shù)據(jù)(包括單精度和雙精度)賦值給整型變量時,將舍棄實型數(shù)據(jù)的小數(shù)部分,不進行四舍五入。③將字符型數(shù)據(jù)賦值給實型變量時,將字符型數(shù)據(jù)轉(zhuǎn)換為整型數(shù)據(jù)進行計算,然后轉(zhuǎn)換為實型數(shù)據(jù)形式存儲表示。④將短整型數(shù)據(jù)賦值給字符型變量時,將短整型數(shù)據(jù)轉(zhuǎn)換為整型數(shù)據(jù)進行計算,然后轉(zhuǎn)換為字符型數(shù)據(jù)形式存儲表示。

【例2.6】利用賦值運算符實現(xiàn)類型轉(zhuǎn)換。

參考程序如下:

#include<stdio.h> voidmain() { shortintt; charb; longh; floatf; doubled; inte; t=65; b='A'; f=12.64; e=100;

運行情況:100.0000001213065.000000A (輸出的結(jié)果)d=e;/*將int型變量轉(zhuǎn)換為double型*/e=f; /*將float型變量轉(zhuǎn)換為int型*/h=t+b;/*t+b為int型,將int型轉(zhuǎn)換為long型*/f=b;/*將char型變量轉(zhuǎn)換為float型*/

b=t;printf("%f\t%d\t%ld\t%f\t%c\n",d,e,h,f,b);}2.3.2強制類型轉(zhuǎn)換強制類型轉(zhuǎn)換是通過強制類型轉(zhuǎn)換運算符將一種類型的變量強制轉(zhuǎn)換為另外一種類型,而不是由系統(tǒng)自動完成的,其基本語法格式如下: (類型標(biāo)識符)表達式若a為實型變量,則(int)a將a的結(jié)果轉(zhuǎn)換為整型,(int)4.8的結(jié)果為4。表達式若是多個變量也需加括號,例如,(int)(a+b)將(a+b)的結(jié)果轉(zhuǎn)換為整型,若寫成(int)a+b則是將a轉(zhuǎn)換成整型,然后再與b進行相加。強制轉(zhuǎn)換只是為了運算需要而對變量類型進行臨時性轉(zhuǎn)換,不會改變變量在定義時所聲明的變量類型。例如:若x在定義時為整型變量,并賦值為3,則(double)x的數(shù)據(jù)類型為實型,結(jié)果為3.000000,但x本身的數(shù)據(jù)類型沒有發(fā)生改變,仍為整型變量,其值仍為3?!纠?.7】數(shù)據(jù)類型的強制轉(zhuǎn)換。參考程序如下:#include<stdio.h>voidmain(){inta,b,c,d;floatx=6.46,y=8.57,z=7.68;

/*整型變量a的值是將實型變量x強制轉(zhuǎn)換為整型后的值*//*整型變量b的值是實型變量x、y和z分別轉(zhuǎn)換為整型后的和*//*整型變量c的值是將實型變量x、y和z的和轉(zhuǎn)換為整型后的值*//*整型變量d的值是將實型變量x轉(zhuǎn)換為整型后,再與實型變量y和z相加的值*/a=(int)x;b=(int)x+(int)y+(int)z;c=(int)(x+y+z);d=(int)x+y+z;printf("%d\t%d\t%d\t%d\n",a,b,c,d);printf("%f\t%f\t%f\n",x,y,z);}程序在編譯時會出現(xiàn)警告提示:“warningC4244:'=':conversionfrom'double'to'int',possiblelossofdata”,該值轉(zhuǎn)換為int型后的輸出結(jié)果。2.4運算符和表達式用來表示各種運算的符號稱為運算符。按照運算符的類型來分,包括算術(shù)運算符、關(guān)系運算符、邏輯運算符、賦值運算符、位運算符、條件運算符、逗號運算符、求字節(jié)數(shù)運算符、指針運算符和特殊運算符;按照運算符所帶的操作數(shù)的數(shù)量來分,包括單目運算符(一元運算符)、雙目運算符(二元運算符)和三目運算符。單目運算符是指參加運算的對象只有一個,例如+12,-34,i++等,雙目運算符是指參加運算的對象有兩個,例如a+b,x*y,7/3等。表達式就是用運算符將運算對象連接而成的符合C語言規(guī)則的算式。按照運算符在表達式中的作用來分,包括算術(shù)表達式、關(guān)系表達式、邏輯表達式、賦值表達式、條件表達式等;按照運算符與運算對象的關(guān)系來分,可分為單目表達式、雙目表達式和三目表達式。2.4.1算術(shù)運算符和算術(shù)表達式

(1)算術(shù)運算符

C語言中的算術(shù)運算符與普通數(shù)學(xué)中算術(shù)運算符的符號有所不同,但基本功能相似。算術(shù)運算符包括一元運算符(單目運算符)和二元運算符(雙目運算符)兩種。

目數(shù)運算符名稱功能單目運算符+正取原值-負(fù)取負(fù)值++自增1變量值加1--自減1變量值減1雙目運算符+加兩個數(shù)相加-減兩個數(shù)相減*乘兩個數(shù)相乘/除兩個數(shù)相除%模(求余)求整除后的余數(shù)【例2.8】正、負(fù)號運算符參考程序如下:#include<stdio.h>voidmain(){inta=+7;/*“+”號可以省略,不是加法符號而是正數(shù)符號*/intb=-9;/*“-”號不能省略,不是減法符號而是負(fù)數(shù)符號*/

printf("%d\t%d\t%d\n",a,b,-a*b);

/*因為正、負(fù)號的優(yōu)先級高于*(乘號)*/}運行情況:7-963 (輸出的結(jié)果)

②自增運算符++和自減運算符--

自增運算符++對操作數(shù)執(zhí)行加1操作;而自減運算符--則對操作數(shù)執(zhí)行減1操作,操作對象都是操作數(shù)自身。使用自增、自減運算符生成的代碼比使用等效的加、減1后賦值的代碼效率更高。但它只能用于變量不能用于常量或表達式,自增、自減運算符有兩種形式,一種形式是放在變量的左邊,稱為前綴運算符,變量在使用前自動加1或減1;另一種形式是放在變量的右邊,稱為后綴運算符,變量在使用后自動加1或減1。設(shè)變量m為基本類型數(shù)據(jù)變量,則有:m++ 先取m的值參與運算,再執(zhí)行m=m+1;++m 先執(zhí)行m=m+1,然后再取m的值參與運算;m-- 先取m的值參與運算,再執(zhí)行m=m-1;--m 先執(zhí)行m=m-1,然后再取m的值參與運算。例如,x和y為int型變量且x初值為5,(intx=5;)

則執(zhí)行語句y=x++;后,y的值為5,(y=x++;執(zhí)行結(jié)果:y=5,x=6.)而執(zhí)行語句y=++x;后,y的值為6。(y=++x;執(zhí)行結(jié)果:y=6,x=6.)注:++和--運算的變量只能是整型、字符型和指針型變量。

【例2.10】自增、自減運算符基本運算。參考程序如下:

#include<stdio.h> voidmain() { inta=5; intf,h,g; f=18-a++; printf("f=%d",f); printf("a=%d\n",a); h=++a+6; printf("h=%d",h); printf("a=%d\n",a); g=++a+a++; printf("g=%d\n",g); }a++是后綴運算,先計算表達式的值,然后再使a值增1,即f=18-5=13;++a運算是前綴運算,先使a的值增1,然后再計算表達式的值,即h=7+6=13;a當(dāng)前值為7,++a是前綴運算,k的值自增1為8,a++是后綴運算,計算后a的值再加9,所以z=8+8=16,計算后變量a的值為9。注意:雖然++和--操作可以優(yōu)化代碼執(zhí)行效率,并且簡化了表達式,但在使用時一定要小心謹(jǐn)慎,尤其是連用時需要更加小心,使用不當(dāng)可能會得到意想不到的結(jié)果。③加法運算符(+)加法運算符用來實現(xiàn)兩個數(shù)的相加,屬于二元運算符,如3+6。④減法運算符(-)減法運算符用來實現(xiàn)兩個數(shù)的相減,屬于二元運算符,如6-3。⑤乘法運算符(*)乘法運算符用來實現(xiàn)兩個數(shù)的相乘,屬于二元運算符,如6*3。⑥除法運算符(/)除法運算符用來實現(xiàn)兩個數(shù)的相除,屬于二元運算符,如6/3。若兩個整數(shù)或字符相除,結(jié)果為整型,當(dāng)不能整除時,只保留結(jié)果的整數(shù)部分,小數(shù)部分全部舍去,而不是四舍五入。如,8/3的結(jié)果也為2;但當(dāng)除數(shù)或被除數(shù)中有一個是浮點數(shù),則進行浮點數(shù)除法,結(jié)果也為浮點數(shù),如,8.0/3=2.666667?!纠?.12】常用算術(shù)運算符的使用。參考程序如下:#include<stdio.h>voidmain(){inti=15,j=3,e=2,f=-4;charch='A';printf("%d\t%d\t%d\t%d\t%d\n",j+j,i-j,j*e,i/j,i%e);

printf("%d\t%d\n",f%j,i%f);

printf("%d\t%d\t%d\n",ch/3,ch-3,ch%3);}⑦求余運算符(%)求余運算符也稱取模運算符,取整數(shù)除法產(chǎn)生的余數(shù),要求參與運算的數(shù)據(jù)必須為整數(shù),所以“%”不能用于float和double類型數(shù)據(jù)的運算。如,6%3的結(jié)果為0,8.0%3為錯誤表達式,7%3的結(jié)果為1,7%-3的結(jié)果是1,-7%3的結(jié)果是-1,-7%-3的結(jié)果是-1,余數(shù)的符號與被除數(shù)的符號相同。字符型數(shù)據(jù)參與算術(shù)運算時,字符型數(shù)據(jù)與整型數(shù)據(jù)通用,本例字符變量ch=‘A’,相當(dāng)于ch的值為整型值65。因為'A'的ASCII值就是65。

運行情況:

612651(輸出的結(jié)果)

-13 (輸出的結(jié)果)

21622(輸出的結(jié)果)(2)算術(shù)表達式

在C語言中,由算術(shù)運算符、常數(shù)、變量、函數(shù)和圓括號組成的,符合C語法規(guī)則的式子稱為算術(shù)表達式。

使用算術(shù)表達式應(yīng)遵循如下原則:

1、要區(qū)分算術(shù)運算符與數(shù)學(xué)運算符在表達形式上的差異。

在C語言中應(yīng)寫成1.0/3*x*x+2*x+1

注意數(shù)據(jù)類型:1/3計算結(jié)果為0.如:數(shù)學(xué)表達式:都是無法識別的2、注意運算符的優(yōu)先級別,如果不能確定,最好在表達式中適當(dāng)?shù)奈恢锰砑訄A括號“()”,且括號必須成對出現(xiàn)。3、雙目運算符兩側(cè)運算對象的數(shù)據(jù)類型應(yīng)保持一致,運算所得結(jié)果類型與運算對象的類型一致;若參與運算的數(shù)據(jù)類型不一致,系統(tǒng)將自動按轉(zhuǎn)換規(guī)律對操作對象進行數(shù)據(jù)類型轉(zhuǎn)換,然后再進行相應(yīng)的運算?!纠?.13】從鍵盤輸入兩個實數(shù),計算算術(shù)表達式的值。參考程序如下:#include<stdio.h>#include<math.h>voidmain(){floatx,y,z;printf("請輸入實型變量x和y的值,x不等于y:\n");scanf("%f%f",&x,&y);z=fabs(y)/(2*x+4*pow(y,x));printf("z=%f\n",z);} 將數(shù)學(xué)函數(shù)定義的頭文件使用include語句加進來fabs(),pow()為C語言提供的函數(shù),存儲在C語言的數(shù)學(xué)庫(math.h),需要時直接調(diào)用即可,

運行情況:請輸入實型變量x和y的值,x不等于y:

5 6↙ (輸入56并回車)

0.000193 (輸出的結(jié)果)2.4.2關(guān)系運算符和關(guān)系表達式(1)關(guān)系運算符關(guān)系運算符是表示運算量之間邏輯關(guān)系的運算符,通過對兩個操作數(shù)值的比較,判斷比較的結(jié)果,關(guān)系運算的結(jié)果為邏輯值,如果符合條件,則結(jié)果為真,如果不符合條件,則為假。在C語言中,由于沒有專門的邏輯型數(shù)據(jù),將非0視為真,將0視為假,常用1表示真,0表示假。采用宏定義的方式來定義邏輯值:

#define TRUE 1用TRUE表示真

#define FALSE0用FALSE表示假在C語言中有6種關(guān)系運算符,如表2-4所示。(2)關(guān)系表達式用關(guān)系運算符將兩個表達式連接起來的式子稱為關(guān)系表達式。關(guān)系表達式的一般形式為:

表達式 關(guān)系運算符表達式

指明對表達式所實施的操作

算術(shù)表達式關(guān)系表達式邏輯表達式賦值表達式字符表達式表達式可以是運算的對象運算的對象

關(guān)系表達式的值是一個邏輯值,用1表示真,0表示假。如:x>=y,a+b<c+d,a>(b<c)!=d都是合法的關(guān)系表達式,進行關(guān)系運算時,先計算表達式的值,然后再進行關(guān)系比較運算。【例2.14】關(guān)系運算示例的main()函數(shù)中:

intx,y,i,j; x=6;y=7;i=8;j=9; printf("%d",x+y>i+j);/*表達式為算術(shù)表達式*/0 printf("%d",(x=6)!=(i=8));/*表達式為賦值表達式*/1 printf("%d",(x==6)!=(i==8));/*表達式為關(guān)系表達式*/0 printf("%d",(x<=y)==(i<=j));/*表達式為關(guān)系表達式*/1 printf("%d",'A'>'a');/*表達式為字符表達式*/0

運行情況【例2.15】關(guān)系運算基本操作。 參考程序如下:

#include<stdio.h> voidmain() { inta,b;doublei,j; printf("請輸入整型變量a、b的值:\n"); scanf("%d%d",&a,&b); printf("請輸入實型變量i、j的值:\n"); scanf("%f%f",&i,&j); printf("%d\t",a>b);

printf("%d\t",'g'>'X');/*字符型數(shù)據(jù)在比較時按其ASCII值進行*/ printf("%d\t",b/a*a==b);/*可能有誤差產(chǎn)生*/ printf("%d\t",j/i*i==j);/*可能有誤差產(chǎn)生*/ printf("%d\n",0<a<100);/*結(jié)果為邏輯值而非取值空間,a<=x<=b為關(guān)系表達式,結(jié)果是一個整數(shù)值,若要表示該數(shù)學(xué)表達式為一存儲空間,應(yīng)寫成:a<=x&&x<=b。*/

}請輸入整型變量a、b的值:請輸入實型變量i、j的值:

3 4↙5.16.2↙01011運行結(jié)果1運行結(jié)果23 7↙1.69.2↙010012.4.3邏輯運算符和邏輯表達式(1)邏輯運算符 邏輯運算符是對邏輯量進行操作的運算符,邏輯運算的結(jié)果也是一個邏輯值,與關(guān)系運算一樣,邏輯運算值也只有2個,用整數(shù)1表示真,用整數(shù)0表示假,C語言提供了3種邏輯運算符,如表2-5。表2-5邏輯運算符目數(shù)運算符名稱示例結(jié)果單目運算符!邏輯非!10雙目運算符&&邏輯與0&&10||邏輯或0||11三種邏輯運算符的運算規(guī)則可以用一張邏輯運算真值表來表示,如表2-6所示。表2-6邏輯運算真值表ab!a!ba&&ba||b非0非00011非0001010非01001001100(2)邏輯表達式用邏輯運算符將兩個表達式連接起來的式子稱為邏輯表達式,其運行結(jié)果是一個邏輯量,用1表示真,0表示假。邏輯表達式的一般形式為:

表達式 邏輯運算符表達式

關(guān)系表達式邏輯表達式表達式可以是【例2.16】邏輯運算示例。 參考程序如下:

#include<stdio.h> voidmain() { ints,r,t; floatx;

s=0;r=4;t=0; x=6.5; printf("%d\t",s&&r&&t); printf("%d\t",s||r||t); printf("%d\t",!s); printf("%d\t",r>s&&('s'||'r')); printf("%d\t",!(x>3)&&(r<=x)); }邏輯表達式為s&&r&&t,先計算s&&r,結(jié)果為假,其值為0,不再計算0&&t。同理,在邏輯或中,輸出1;s的值為0,結(jié)果為真。邏輯表達式為r>s&&(‘s’||‘r’),r>s的值為真,由于是邏輯與操作,仍需計算‘s’||‘r’,值為真,即為計算邏輯表達式1&&1的值,輸出1;!(x>3)的值為假,所以整個邏輯表達式的值為假,輸出0。注意:對于邏輯與操作,只要有一個表達式的值為假,則邏輯表達式值為假,輸出0;相對應(yīng)邏輯或操作中,只要有一個表達戒為真,則邏輯表達值為真,輸出1。在計算邏輯表達式的值時,只有在必須計算下一個表達式才能求解的情況下,才進行下一個表達式的求解運算。

運行情況:

01110 (輸出的結(jié)果)2.4.4賦值運算符和賦值表達式(1)賦值運算符賦值運算符實現(xiàn)將一個表達式的值賦給一個變量,賦值運算符是“=”,是一個雙目運算符,賦值運算在C語言中是最基本、最常用的運算。例如,d=a+b-c,x=y,i=6等都是合法的賦值表達式。(2)賦值表達式用賦值運算符將一個變量和一個表達式連接起來的式子稱為賦值表達式,賦值表達式的一般形式為: 變量=表達式賦值表達式的計算過程是:計算右邊表達式的值,將計算結(jié)果賦值給左邊的變量。賦值表達式的值就是賦值運算符左邊變量的值。 例如,x=2.5,a=b+c,x=y等都是合法的賦值表達式。(3)復(fù)合賦值運算符和復(fù)合賦值表達式在賦值運算符“=”之前加上其它運算符,可以構(gòu)成復(fù)合賦值運算符,用于完成賦值組合運算操作。由復(fù)合賦值運算符將一個變量和一個表達式連接起來的式子稱為復(fù)合賦值表達式。構(gòu)成復(fù)合賦值表達式的一般形式為:

變量復(fù)合賦值運算符表達式復(fù)合賦值表達式計算過程是:先將“變量”和“表達式”進行組合賦值運算符所規(guī)定的運算,然后將運算結(jié)果賦值給復(fù)合賦值運算符左側(cè)的在“變量”,實際上,復(fù)合賦值表達式的運算等價于:

變量=變量運算符表達式2.4.5位運算符與位運算(1)位運算符

C語言提供了6種基本位運算符。

目數(shù)運算符名稱示例結(jié)果單目運算符~按位取反~10100101雙目運算符&按位與0110&10100010|按位或0110|10101110^按位異或0110^10101100<<按位左移01101010<<210101000>>按位右移01101010>>200011010

位運算符的操作對象只能是整型或字符型數(shù)據(jù),不能為實型數(shù)據(jù);位運算是對每個二進制位分別進行操作;操作數(shù)的移位運算不改變原操作數(shù)的值。表2-8位運算符(2)位運算位運算是指對二進制位進行的運算。與其它高級語言相比,位運算是C語言的特點之一。位運算不允許只操作其中的某一位,而是對整個數(shù)據(jù)的二進制位進行運算。①按位取反運算(~) 按位取反運算符是單目運算符,運算規(guī)則是將操作對象中所有二進制位按位取反,即將0變?yōu)?,將1變?yōu)?,②按位“與”運算(&) 按位與運算是對兩個操作數(shù)相應(yīng)的位進行邏輯與運算,運算規(guī)則是只有當(dāng)兩個操作數(shù)對應(yīng)的位都為1,該位的結(jié)果為1,當(dāng)兩個操作數(shù)對應(yīng)的位中有一個為0,該位的結(jié)果為0,③按位“或”運算(|) 按位或運算是對兩個操作數(shù)相應(yīng)的位進行邏輯或運算,運算規(guī)則是只有當(dāng)兩個操作數(shù)對應(yīng)的位都為0,該位的結(jié)果為0,當(dāng)兩個操作數(shù)對應(yīng)的位中有一個為1,該位的結(jié)果為1,④按位異或運算(^) 按位或運算是對兩個操作數(shù)相應(yīng)的位進行異或運算,運算規(guī)則是只有當(dāng)兩個操作數(shù)對應(yīng)的位相同時,該位的結(jié)果為0,當(dāng)兩個操作數(shù)對應(yīng)的位不相同時,該位的結(jié)果為1。⑤按位左移運算(<<) 按位左移運算的規(guī)則是將操作數(shù)向左移動指定的位數(shù),并且將移去的高位舍棄,在低位補0。⑥按位右移運算(>>) 按位右移運算的規(guī)則是將操作數(shù)向右移動指定的位數(shù),并且將移去的低位舍棄,對于高位部分,若操作數(shù)為無符號數(shù),則左邊高位補0;若操作數(shù)為有符號數(shù),若為正數(shù)則補0,若為負(fù)數(shù)則補1。(2)位運算按位取反運算(~)按位“與”運算(&)按位“或”運算(|)求~10100110求11000011&10100110求11000011|10100110按位異或運算(^)按位左移運算(<<)按位右移運算(>>)求11000011^10100110求10100110<<2求01011001>>2向左移2位,高位舍棄,低位補0.結(jié)果為:10011000向右移2位后,高位補0,00→01011001.結(jié)果為00010110(2)位運算位運算實例【例2.18】位運算基本操作。參考程序中main()函數(shù)如下:

intx=22,y=93;printf("%d\t",x&y);printf("%d\t",x|y);printf("%d\t",x^y);printf("%d\t",~x); 程序說明:x=22二進制數(shù)為01011101y=93二進制數(shù)為00010110位運算操作實際上就是對這兩組二進制數(shù)進行操作,對x進行按位取反的二進制數(shù)為11101001,結(jié)果為-23,從符號上判斷該數(shù)是一個負(fù)數(shù),而負(fù)數(shù)的原值為各位取反再加1,即為二進制數(shù)-00010111,結(jié)果為-23?!纠?.19】移位運算示例。 參考程序中main()函數(shù)如下:

intx=45; printf("%d",x); printf("%d",x>>2); printf("%d",x<<2); 程序說明:x=45的二進制數(shù)為00111010,經(jīng)過移位運算x>>2和x<<2后,x的值不變,但通過復(fù)合移位賦值運算后,操作數(shù)的值發(fā)生改變。運行情況:209575-23 (輸出的結(jié)果)運行情況:4511180 (輸出的結(jié)果)真假計算表達式1的值表達式1計算表達式2的值計算表達式3的值圖2-3條件表達式執(zhí)行流程2.4.6條件運算符與條件表達式(1)條件運算符條件運算符是C語言中唯一的三目運算符,它的符號是“?”和“:”,且必須成對出現(xiàn)。(2)條件表達式由條件運算符組成的表達式稱為條件表達式。條件表達式的一般形式為:

表達式1?表達式2:表達式3【例2.21】條件運算示例。 參考程序中main()函數(shù)如下:

/*從鍵盤輸入兩個整數(shù),求其最小值*/ intx,y,min; printf("請輸入兩個整數(shù):"); scanf("%d%d",&x,&y); min=(x<y)?x:y; printf("兩個數(shù)最小的是%d",min);運行情況:請輸入兩個整數(shù):-7 8↙兩個數(shù)最小的是-7 注意:條件表達式中表達式2和表達式3的數(shù)據(jù)類型如果不同,則表達式的結(jié)果類型將是二者中較高的類型。如,2<6?17:14.5的值為17,若輸出語句為

printf(“%d”,2<6?17:14.5);,則結(jié)果為0,若輸出語句為

printf(“%f”,2<6?17:14.5);,則結(jié)果為17.0000002.4.7逗號運算符與逗號表達式(1)逗號運算符逗號運算符使用的是運算符“,”,其作用是將多個表達式連接起來。(2)逗號表達式使用逗號運算符將多個表達式連接在一起,就組成了逗號表達式。逗號表達式的一般形式為: 表達式1, 表達式2,…,表達式n

表達式的求解過程是:先計算表達式1的值,然后計算表達式2的值,以此類推,最后計算表達式n的值,并將表達式n的值作為表達式的值。【例2.22】逗號運算示例。

參考程序main()函數(shù)如下:

intx,y,i,j,exp1,exp2; x=4,y=6,i=8,j=16; exp1=(x+6,x-6,x/6,x*6); printf("%d\t%d\n",x,exp1); exp2=((x=x+2),y+i,x+j); printf("%d\t%d",x,exp2);

變量x的值不變

變量x的值發(fā)生變化程序說明:表達式exp1=(x+6,x-6,x/6,x*6);表達式的值為最后一個表達式的值,即x*6的值,結(jié)果為24同理exp2=6+16=22。運行情況:424 (輸出的結(jié)果)622 (輸出的結(jié)果)2.4.8求字節(jié)數(shù)運算符求字節(jié)數(shù)運算符又稱長度運算符,是一個單目運算符,用于返回其操作數(shù)所對應(yīng)數(shù)據(jù)類型的字節(jié)數(shù),其一般形式為:

sizeof(opr)

其中,opr表示所要運算的對象,sizeof為運算符。如例2.23求字節(jié)數(shù)運算中的語句:

printf("sizeof(char):%d\n",sizeof(char));printf("sizeof(shortint):%d\n",sizeof(shortint));

運行情況:

sizeof(char):1 (輸出的結(jié)果)

sizeof(shortint:2

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論