第2章 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式_第1頁
第2章 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式_第2頁
第2章 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式_第3頁
第2章 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式_第4頁
第2章 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式_第5頁
已閱讀5頁,還剩88頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第2章

數(shù)據(jù)類型、運(yùn)算符與表達(dá)式本章重點(diǎn)C語言的基本數(shù)據(jù)類型。變量的定義、賦值、初始化以及使用方法。常量的表示。基本運(yùn)算符的運(yùn)算規(guī)則及優(yōu)先級別。表達(dá)式的構(gòu)成規(guī)則和計算。數(shù)據(jù)類型轉(zhuǎn)換的意義和實(shí)質(zhì)。2本章難點(diǎn)數(shù)據(jù)類型的范圍。自增、自減運(yùn)算符的使用。運(yùn)算符的優(yōu)先級。混合表達(dá)式的運(yùn)算。32.1C語言的數(shù)據(jù)類型C語言要求每個數(shù)據(jù)在使用之前必須明確其數(shù)據(jù)類型,這是因為程序中涉及的各種數(shù)據(jù),都必須存放在內(nèi)存中,而數(shù)據(jù)類型決定了數(shù)據(jù)在內(nèi)存中的存放形式、數(shù)據(jù)的范圍以及在數(shù)據(jù)上可以進(jìn)行的運(yùn)算。41.數(shù)據(jù)類型在C語言中,數(shù)據(jù)類型可分為基本數(shù)據(jù)類型、構(gòu)造數(shù)據(jù)類型、指針類型和空類型4大類。(1)基本數(shù)據(jù)類型:整型、實(shí)型、字符型屬于基本數(shù)據(jù)類型。(2)構(gòu)造數(shù)據(jù)類型:根據(jù)已定義的一個或多個數(shù)據(jù)類型用構(gòu)造的方法來定義。在C語言中,構(gòu)造數(shù)據(jù)類型有數(shù)組、結(jié)構(gòu)體、共用體(或聯(lián)合)和枚舉類型等。(3)指針類型:一種特殊的同時又是具有重要作用的數(shù)據(jù)類型。指針變量用來存儲某個變量在內(nèi)存中的地址。(4)空類型:其類型說明符為void。5C語言的數(shù)據(jù)類型62.基本數(shù)據(jù)類型及表示范圍C語言的基本數(shù)據(jù)類型有整型、實(shí)型、字符型。(1)整型。C語言提供shortint、int、longint、longlongint、unsignedshortint、unsignedint、unsignedlongint、unsignedlonglongint等內(nèi)置整型數(shù)據(jù)類型。各種整型數(shù)據(jù)類型之間的差別體現(xiàn)在每個類型所占內(nèi)存空間的大小不同,signed關(guān)鍵字(可以省略)表示有符號,即最高位是符號位,不表示數(shù)值。unsigned關(guān)鍵字表示無符號,即最高位不是符號位,表示數(shù)值。72.基本數(shù)據(jù)類型及表示范圍(2)實(shí)型。C語言支持3種實(shí)型數(shù)據(jù)類型:float(單精度實(shí)型)、double(雙精度實(shí)型)、longdouble(長雙精度實(shí)型)。這些數(shù)據(jù)類型之間的差別體現(xiàn)在編譯器為每個類型分配的存儲空間的大小不同,它們決定了實(shí)型數(shù)據(jù)類型的精度。一般來說,雙精度實(shí)型數(shù)的精度大約是單精度實(shí)型數(shù)的兩倍。82.基本數(shù)據(jù)類型及表示范圍(3)字符型。也即char類型,用于存儲單個的字符。字符包括字母表中的大小寫字母、數(shù)字0~9以及加號、減號等特殊字符。char類型也有無符號和有符號之分。92.2常量在程序執(zhí)行過程中,其值不發(fā)生改變的量稱為常量。在C語言中,常量分為直接常量和符號常量102.2.1直接常量從字面上可以看出數(shù)據(jù)的值同時可以分析出數(shù)據(jù)類型的常量稱為直接常量。直接常量分為整型常量、實(shí)型常量、字符常量和字符串常量四種。111.整型常量整型常量就是整常數(shù)。C語言中使用的整常數(shù)有八進(jìn)制、十六進(jìn)制和十進(jìn)制3種。1)十進(jìn)制整常數(shù)十進(jìn)制整常數(shù)沒有前綴,其數(shù)碼為0~9,但不能以數(shù)字0開頭。以下各數(shù)是合法的十進(jìn)制整常數(shù)。237-568655351627以下各數(shù)不是合法的十進(jìn)制整常數(shù)。023(不能有前綴0)23D(含有非十進(jìn)制數(shù)碼)121.整型常量2)八進(jìn)制整常數(shù)八進(jìn)制整常數(shù)必須以數(shù)字0開頭,后面數(shù)碼的取值范圍為0~7。八進(jìn)制數(shù)通常是無符號數(shù)。以下各數(shù)是合法的八進(jìn)制數(shù)。015(十進(jìn)制為13)0101(十進(jìn)制為65)0177777(十進(jìn)制為65535)以下各數(shù)不是合法的八進(jìn)制數(shù)。256(無前綴0)03A2(包含了非八進(jìn)制數(shù)碼)-0127(出現(xiàn)了負(fù)號)131.整型常量3)十六進(jìn)制整常數(shù)十六進(jìn)制整常數(shù)的前綴為0X或0x,其數(shù)碼取值范圍為0~9、A~F或a~f。以下各數(shù)是合法的十六進(jìn)制整常數(shù)。0X2A(十進(jìn)制為42)0XA0(十進(jìn)制為160)0XFFFF(十進(jìn)制為65535)以下各數(shù)不是合法的十六進(jìn)制整常數(shù)。5A(無前綴0X)0X3H(含有非十六進(jìn)制數(shù)碼)14在16位字長的機(jī)器上,十進(jìn)制無符號整常數(shù)的范圍為0~65535,有符號數(shù)為-32768~+32767。八進(jìn)制無符號整常數(shù)的范圍為0~0177777,十六進(jìn)制無符號整常數(shù)的范圍為0X0~0XFFFF或0x0~0xFFFF。如果使用的數(shù)超過了上述范圍,就必須用長整型數(shù)來表示。長整型數(shù)是用后綴L或l來表示的。15注意,長整數(shù)158L和基本整常數(shù)158在數(shù)值上并無區(qū)別。但是,158L因為是長整型量,C語言編譯系統(tǒng)將為它分配4字節(jié)的存儲空間。而對于158,因為是基本整型,在16位字長的機(jī)器上只分配2字節(jié)的存儲空間。無符號數(shù)也可用后綴表示,整型常數(shù)的無符號數(shù)的后綴為U或u。16【例2.1】整型常量示例。#include<stdio.h>intmain(){inta,b,c;a=10;b=010;c=0xl0;printf("%d,%d,%d\n",a,b,c);return0;}172.實(shí)型常量實(shí)型也稱為浮點(diǎn)型。實(shí)型常量也稱為實(shí)數(shù)或者浮點(diǎn)數(shù)。在C語言中,實(shí)數(shù)只采用十進(jìn)制。它有兩種形式:小數(shù)形式和指數(shù)形式。(1)小數(shù)形式:由數(shù)碼0~9和小數(shù)點(diǎn)組成。例如:0.025.05.7890.135.0300.-267.8230注意,必須有小數(shù)點(diǎn),小數(shù)點(diǎn)前后可以沒有數(shù)字。(2)指數(shù)形式:由十進(jìn)制數(shù)加階碼標(biāo)志e或E以及階碼(只能為整數(shù),可以帶符號)組成。其一般形式為:aEn(a為十進(jìn)制數(shù),n為十進(jìn)制整數(shù),其值為a×10n)18【例2.2】實(shí)型常量示例。#include<stdio.h>intmain(){printf("%f\n",356.);printf("%f\n",356.f);return0;}193.字符常量1)常用字符常量字符常量是用單引號括起來的一個字符。例如:'a''b''=''+''?'在C語言中,字符常量有以下特點(diǎn):(1)字符常量只能用單引號括起來,不能用雙引號或其他括號。(2)字符常量只能是單個字符,不能是字符串。(3)字符可以是字符集中的任意字符,但數(shù)字被定義為字符型之后就不能參與數(shù)值運(yùn)算。如5''和5是不同的。5''是字符常量,不能作為數(shù)字5參與數(shù)值運(yùn)算。202.2.1直接常量2)轉(zhuǎn)義字符常量轉(zhuǎn)義字符是一種特殊的字符常量。轉(zhuǎn)義字符以反斜線\開頭,后跟一個或幾個字符。轉(zhuǎn)義字符具有特定的含義,不同于字符原有的意義,故稱轉(zhuǎn)義字符。例如,在前面各例題printf函數(shù)的格式串中用到的\n就是一個轉(zhuǎn)義字符,其意義是“回車換行”。轉(zhuǎn)義字符主要用來表示那些用一般字符不便于表示的控制代碼,如表2.2所示。21轉(zhuǎn)義序列有兩種形式,其中一種是“字符轉(zhuǎn)義序列”,即反斜線后面跟一個圖形符號,用于表示字符集中的非圖形符號和一些特殊的圖形字符。說明如下:(1)單引號(')和反斜線(\)雖然是圖形符號,但作為字符常量時必須用轉(zhuǎn)義序列。如\'''和'\\'是合法的,而'''和\''是非法的。(2)雙引號(")作為字符常量時既可用圖形符號也可用轉(zhuǎn)義序列表示。如''''和\''''均合法。(3)字符常量\'0'表示其值為0的字符,稱為空字符,既不引起任何控制動作,也不是一個可顯示字符。\'0'通常用于表示一個字符串的結(jié)束。用\'0'來代替0,是為了在某些表達(dá)式中強(qiáng)調(diào)其字符的性質(zhì)。22【例2.3】字符常量示例。#include<stdio.h>intmain(){printf("\n\\ncauses\nalinefeedtooccur");printf("\n\\\"causesadoublequote(\")tobeprinted");printf("\n\\acausesthebell,orbeep,tosound\a");printf("\n\\tcanbeusedtoalignsomenumberstotab");printf("columns\n\tl\t2\t3\n\t4\t5\t6\n");return0;}23轉(zhuǎn)義序列的另一種是“數(shù)字轉(zhuǎn)義序列”,即反斜線后面跟一個字符的八進(jìn)制或十六進(jìn)制字符碼,即\ooo或\xhh。ooo表示1~3個八進(jìn)制數(shù)字,八進(jìn)制可以不用前綴,hh表示1~2個十六進(jìn)制數(shù)字,x是十六進(jìn)制前綴。。24使用數(shù)字轉(zhuǎn)義序列時注意以下兩點(diǎn)。(1)使用數(shù)字轉(zhuǎn)義序列時可能依賴于字符編碼方式,因此是不可移植的。最好把轉(zhuǎn)義符隱藏在宏定義中,便于修改。#defineEOT'\004'#defineACK'\006'#defineNAK'\004'25(2)數(shù)字轉(zhuǎn)義序列的語法是獨(dú)特的,八進(jìn)制轉(zhuǎn)義序列在用完3個八進(jìn)制位之后或遇到第一個非八進(jìn)制位時終止,因此字符串"\0111"包含兩個字符\011和1,字符串"\090"包含3個字符\0、9和0。十六進(jìn)制轉(zhuǎn)義序列中的十六進(jìn)制位數(shù)超過2時,編譯出錯,這時為了終止十六進(jìn)制轉(zhuǎn)義,可以把字符串分段。"\xabc"http://出錯"\xa""bc"http://這個字符串包含3個字符264.字符串常量字符串常量是由一對雙引號括起來的字符序列。字符串常量和字符常量是不同的常量。它們之間主要有以下區(qū)別。(1)字符常量由單引號括起來,字符串常量由雙引號括起來。(2)字符常量只能是單個字符,字符串常量則可以含零個或多個字符。(3)可以把一個字符常量賦予一個字符變量,但不能把一個字符串常量賦予一個字符變量。在C語言中沒有相應(yīng)的字符串變量,但是可以用一個字符數(shù)組來存放一個字符串。(4)字符常量占一字節(jié)的內(nèi)存空間。字符串常量占的內(nèi)存字節(jié)數(shù)等于字符串的實(shí)際長度加1。增加的一字節(jié)中存放字符'0'(ASCII碼為0),這是字符串結(jié)束的標(biāo)志。272.2.2符號常量在C語言中,可以用一個標(biāo)識符來表示一個常量,稱之為符號常量。符號常量在使用之前必須先定義,其一般形式為:#define標(biāo)識符常量表達(dá)式其中#define也是一條預(yù)處理命令(預(yù)處理命令都以#開頭),稱為宏定義命令,其功能是把該標(biāo)識符定義為其后的常量值。編譯之前,程序中出現(xiàn)的所有符號常量均被常量表達(dá)式的文字所替代。28【例2.4】符號常量示例。#include<stdio.h>#definePI3.14//定義符號常量PIintmain(){floatr,circum,area;scanf("%f",&r);circum=2*PI*r;area=PI*r*r;printf("\ncircumference=%f,area=%f\n",circum,area);return0;}29【說明】從該程序中可以看出,程序用#define命令定義PI代表常量3.14,程序在編譯時將用3.14替代所有的PI。302.2.2符號常量注意:(1)符號常量的名字與后面的常量之間可有多個空白字符,但無須添加等號,且行末一般不以分號結(jié)尾。因為宏定義命令不是C語句,而是一種編譯預(yù)處理命令。若以分號結(jié)尾,則編譯預(yù)處理替換時會連同分號一起替換,造成程序的錯誤。(2)定義符號常量的好處是“一改全改”。在例2.4中,如果需要增加PI的精度,只需要將“#definePI3.14”修改為#definePI3.14159265”,則程序中所有的PI都會用3.14159265替換。314.字符串常量字符串常量是由一對雙引號括起來的字符序列。字符串常量和字符常量是不同的常量。它們之間主要有以下區(qū)別。(1)字符常量由單引號括起來,字符串常量由雙引號括起來。(2)字符常量只能是單個字符,字符串常量則可以含零個或多個字符。(3)可以把一個字符常量賦予一個字符變量,但不能把一個字符串常量賦予一個字符變量。在C語言中沒有相應(yīng)的字符串變量,但是可以用一個字符數(shù)組來存放一個字符串。(4)字符常量占一字節(jié)的內(nèi)存空間。字符串常量占的內(nèi)存字節(jié)數(shù)等于字符串的實(shí)際長度加1。增加的一字節(jié)中存放字符\'0'(ASCII碼為0),這是字符串結(jié)束的標(biāo)志。322.2.2符號常量在C語言中,可以用一個標(biāo)識符來表示一個常量,稱之為符號常量。符號常量在使用之前必須先定義,其一般形式為:#define標(biāo)識符常量表達(dá)式#define也是一條預(yù)處理命令,其功能是把該標(biāo)識符定義為其后的常量值。編譯之前,程序中出現(xiàn)的所有符號常量均被常量表達(dá)式的文字所替代。33符號常量注意:(1)符號常量的名字與后面的常量之間可有多個空白字符,但無須添加等號,且行末一般不以分號結(jié)尾。因為宏定義命令不是C語句,而是一種編譯預(yù)處理命令。若以分號結(jié)尾,則編譯預(yù)處理替換時會連同分號一起替換,造成程序的錯誤。(2)定義符號常量的好處是“一改全改”。在例2.4中,如果需要增加PI的精度,只需要將“#definePI3.14”修改為#definePI3.14159265”,則程序中所有的PI都會用3.14159265替換。342.3變量在C語言程序中,其值可以改變的量稱為變量。352.3.1變量名與變量值C語言中參與運(yùn)算的變量必須有一個唯一的名字,稱為變量名。變量名的命名規(guī)則遵循標(biāo)識符的命名規(guī)則。在程序運(yùn)行過程中,變量的值存儲在內(nèi)存中。在C語言程序中,通過變量名來引用變量的值。例如聲明了一個整型變量a,編譯時系統(tǒng)自動給變量a分配內(nèi)存并給變量名a一個對應(yīng)的內(nèi)存地址。程序從變量中取值,則是通過變量名找到相應(yīng)的內(nèi)存地址,再從該內(nèi)存地址對應(yīng)的存儲單元中讀取數(shù)據(jù)。362.3.2變量的定義變量定義的一般形式為:類型說明符變量名表;類型說明符說明變量的數(shù)據(jù)類型。變量名表中可以包括多個變量名,各變量名之間以逗號分隔。在C語言中,對所有用到的變量要先定義后使用。如果變量未定義而使用,編譯時系統(tǒng)會給出有關(guān)出錯信息。372.3.3變量初始化在C語言程序中常常需要對變量賦初值,以便使用變量。C語言程序中可有多種方法為變量提供初值,變量初始化就是其中一種。變量初始化就是在定義變量的同時給變量賦以初值的方法。變量初始化的一般形式為:類型說明符變量1=值1,變量2=值2,…;inta=3;intb,c=5;floatx=3.2,y=3f,z=0.75;charch1='K',ch2='P';注意,在定義中不允許連續(xù)賦值,如“inta=b=c=5;”是不合法的。38【例2.5】變量初始化示例。#include<stdio.h>intmain(){inta=3,b=5,c;c=a+b;printf("a=%d,b=%d,c=%d\n",a,b,c);return0;}392.4運(yùn)算符與表達(dá)式402.4.1C語言的運(yùn)算符簡介C語言的運(yùn)算符十分豐富,由運(yùn)算符構(gòu)成的表達(dá)式形式多樣,使用靈活。學(xué)習(xí)過程中對于每一種運(yùn)算符,都應(yīng)該掌握運(yùn)算符的運(yùn)算功能、操作數(shù)的類型要求、運(yùn)算結(jié)果的類型、運(yùn)算的次序(優(yōu)先級與結(jié)合性)以及運(yùn)算過程中的數(shù)據(jù)類型轉(zhuǎn)換。411.運(yùn)算符C語言的運(yùn)算符可分為以下幾類。(1)算術(shù)運(yùn)算符:用于各類數(shù)值運(yùn)算。包括+(加)、-(減)、*(乘)、/(除)、%(求余,或稱模運(yùn)算)、++(自增)、--(自減)等。(2)關(guān)系運(yùn)算符:用于比較運(yùn)算。包括>(大于)、<(小于)、==(等于)、>=(大于或等于)、<=(小于或等于)、!=(不等于)等。(3)邏輯運(yùn)算符:用于邏輯運(yùn)算。包括&&(與)、||(或)、!(非)等。(4)賦值運(yùn)算符:用于賦值運(yùn)算。包括簡單賦值(=)、復(fù)合算術(shù)賦值(+=,-=,*=,/=,%=)和復(fù)合位運(yùn)算賦值(&=,|=,^=,<<=,>>=)3類。(5)逗號運(yùn)算符(,):用于把若干個表達(dá)式組合成一個表達(dá)式。42(6)位操作運(yùn)算符:參與運(yùn)算的量,按二進(jìn)制位進(jìn)行運(yùn)算。包括&(按位與)、|(按位或)、~(按位取反)、^(按位異或)、<<(左移)、>>(右移)等。(7)條件運(yùn)算符(?:):這是C語言中唯一的三目運(yùn)算符,用于根據(jù)條件完成不同的任務(wù)。(8)指針運(yùn)算符:包括取內(nèi)容(*)和取地址(&)兩種運(yùn)算。(9)求字節(jié)數(shù)運(yùn)算符(sizeof):用于計算數(shù)據(jù)類型所占的內(nèi)存字節(jié)數(shù)。(10)特殊運(yùn)算符:包括括號運(yùn)算符(())、下標(biāo)運(yùn)算符([])、成員選擇運(yùn)算符(->和.)等完成特殊任務(wù)的運(yùn)算符。432.運(yùn)算符的優(yōu)先級與結(jié)合性表達(dá)式的運(yùn)算規(guī)則是由運(yùn)算符的功能和運(yùn)算符的優(yōu)先級與結(jié)合性來決定的。為使表達(dá)式按一定的順序求值,編譯程序?qū)⑺羞\(yùn)算符分成若干組,按運(yùn)算執(zhí)行的先后順序為每組規(guī)定一個等級,稱為運(yùn)算符的優(yōu)先級。當(dāng)一個表達(dá)式中有多個運(yùn)算符時,優(yōu)先級高的運(yùn)算符先執(zhí)行運(yùn)算,優(yōu)先級較低的運(yùn)算符后執(zhí)行運(yùn)算。處于同一優(yōu)先級的運(yùn)算符的運(yùn)算順序由結(jié)合性決定,運(yùn)算符的結(jié)合性分為從左至右(左結(jié)合性)和從右至左(右結(jié)合性)兩種。絕大部分運(yùn)算符都是左結(jié)合性。C語言運(yùn)算符的優(yōu)先級及結(jié)合性見附錄B442.4.2算術(shù)運(yùn)算算術(shù)運(yùn)算符有+(加)、-(減)、*(乘)、/(除)、%(求余數(shù)或取模)、++(自增1)、--(自減1)。其中,+、-、*、/、%為基本算術(shù)運(yùn)算符。451.基本算術(shù)運(yùn)算(1)基本算術(shù)運(yùn)算符(+、-、*、/、%)均是雙目運(yùn)算符,結(jié)合性為左結(jié)合。(2)優(yōu)先級:*、/、%運(yùn)算符的優(yōu)先級相同,+、-運(yùn)算符的優(yōu)先級相同,前面3個運(yùn)算符的優(yōu)先級高于后面兩個。(3)求余運(yùn)算(%)規(guī)定兩個操作數(shù)必須為整數(shù),運(yùn)算結(jié)果也是整數(shù),值為左操作數(shù)除以右操作數(shù)所得的余數(shù),符號與左操作數(shù)相同。例如,17%5或17%-5的結(jié)果都為2,-17%5的結(jié)果為-2。(4)除法運(yùn)算符(/)規(guī)定,如果兩個操作數(shù)都是整型,則結(jié)果是整型,就是整除的結(jié)果。如果兩個操作數(shù)中有一個是實(shí)型,則結(jié)果是實(shí)型。例如,5/2的結(jié)果是2,5.0/2、5/2.0或5.0/2.0的結(jié)果都是2.5。462.算術(shù)表達(dá)式算術(shù)表達(dá)式是算術(shù)運(yùn)算符和括號將運(yùn)算對象(也稱操作數(shù))連接起來的符合C語言語法規(guī)則的式子。(1)算術(shù)運(yùn)算的兩個運(yùn)算對象的數(shù)據(jù)類型可以不相同。當(dāng)兩個運(yùn)算對象的數(shù)據(jù)類型不同時,在進(jìn)行運(yùn)算之前它們按照相應(yīng)的轉(zhuǎn)換規(guī)則自動轉(zhuǎn)換為相同類型。(2)算術(shù)運(yùn)算結(jié)果的數(shù)據(jù)類型與操作數(shù)類型相同。如果操作數(shù)執(zhí)行了類型轉(zhuǎn)換,則與轉(zhuǎn)換后的操作數(shù)類型相同。473.自增、自減運(yùn)算符C語言還提供了兩個特殊的單目運(yùn)算符:++(自增1)和--(自減1)。++和--的操作數(shù)只能是變量,這個變量的類型可以是整型或指針類型。++使內(nèi)存中存儲的變量值加1,--使內(nèi)存中存儲的變量值減1。++x;相當(dāng)于x=x+1;--x;相當(dāng)于x=x-1;48++和--的特殊之處在于,它們分別有前綴和后綴兩種形式。++x和x++都使x加1,但它們有區(qū)別。表達(dá)式++x使內(nèi)存中存儲的變量x先加1,然后以x的新值作為該表達(dá)式的值。相反,表達(dá)式x++以內(nèi)存中x的值作為該表達(dá)式的值,然后內(nèi)存中存儲的變量x再加1。--x和x--的道理也一樣。當(dāng)++x或x++單獨(dú)使用時,兩者的效果是一樣的,但在與其他運(yùn)算符一起使用時,兩者的效果是不相同的。49【例2.6】運(yùn)算符示例。#include<stdio.h>intmain(){inta,b,c=10;a=++c;b=c++;printf("a=%d,b=%d,c=%d\n",a,b,c);printf("++a=%d,--b=%d,c--=%d\n",++a,--b,c--);return0;}50【說明】后綴++(或--)的復(fù)雜點(diǎn)在于,操作數(shù)值的更改并不是馬上發(fā)生的,而是在引用原值之后發(fā)生的,這稱為后綴++(或--)的計算延遲。計算延遲的終止點(diǎn)稱為序列點(diǎn)。當(dāng)?shù)竭_(dá)序列點(diǎn)時,執(zhí)行前面出現(xiàn)的所有后綴++(或--)的增1(或減1)運(yùn)算。也就是說,在序列點(diǎn)之前,后綴++(或--)的操作數(shù)用原值,在序列點(diǎn)之后,該操作數(shù)是更改后的新值。下列情況下出現(xiàn)序列點(diǎn)。(1)&&、||、?:或,運(yùn)算符,即這些運(yùn)算符的第一個操作數(shù)之后。(2)完整表達(dá)式結(jié)束時,即表達(dá)式語句,return語句中的表達(dá)式,if、switch或循環(huán)語句中的條件表達(dá)式(包括for語句中的每個表達(dá)式)之后。512.4.3關(guān)系運(yùn)算在程序中經(jīng)常需要判斷兩個量的關(guān)系,以決定程序下一步的工作。判斷兩個量關(guān)系的運(yùn)算符稱為關(guān)系運(yùn)算符。1.關(guān)系運(yùn)算符及其優(yōu)先次序在C語言中有6種關(guān)系運(yùn)算符,分別是<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)和!=(不等于)。關(guān)系運(yùn)算符都是雙目運(yùn)算符,其結(jié)合性均為左結(jié)合(即自左至右)。522.關(guān)系表達(dá)式(1)用關(guān)系運(yùn)算符將兩個操作數(shù)連接起來組成的表達(dá)式,稱為關(guān)系表達(dá)式。關(guān)系表達(dá)式的一般形式為:表達(dá)式關(guān)系運(yùn)算符表達(dá)式(2)關(guān)系表達(dá)式的值只能是1或0,當(dāng)關(guān)系成立時即為“真”,即表達(dá)式的值為整數(shù)1;否則為“假”,即表達(dá)式的取值為整數(shù)0。53【例2.7】關(guān)系表達(dá)式示例。#include<stdio.h>intmain(){charx='m',y='n';inta,b;a=x<y;//a為關(guān)系表達(dá)式x<y的值printf("a=%d\n",a);b=(x!=y-1);//b為關(guān)系表達(dá)式x!=y-1的值printf("b=%d\n",b);return0;}542.4.4邏輯運(yùn)算1.邏輯運(yùn)算符及其優(yōu)先次序除了使用關(guān)系表達(dá)式建立條件以外,C語言還可以使用邏輯運(yùn)算符建立更為復(fù)雜的條件。C語言中提供了3種邏輯運(yùn)算符:&&(邏輯與)||(邏輯或)和!(邏輯非)。邏輯與運(yùn)算符&&和邏輯或運(yùn)算符||均為雙目運(yùn)算符,具有左結(jié)合性。邏輯非運(yùn)算符!為單目運(yùn)算符,具有右結(jié)合性。邏輯運(yùn)算符的優(yōu)先級(從高到低排列)為:!→&&→||,其中&&和||低于關(guān)系運(yùn)算符,!高于算術(shù)運(yùn)算符。552.邏輯運(yùn)算的值邏輯運(yùn)算的值也為真和假兩種,用1和0來表示。邏輯運(yùn)算符的真值表如表2.4所示56(1)邏輯與運(yùn)算&&:當(dāng)邏輯與運(yùn)算符和兩個表達(dá)式一起使用時,只有當(dāng)這兩個表達(dá)式本身都為真時,結(jié)果才為真;只要兩個表達(dá)式中有一個為假,結(jié)果即為假。當(dāng)需要檢測多個條件并做出判斷時,可以使用邏輯與運(yùn)算符&&。例如:(a<b)&&(b<c)只要a<b并且b<c時結(jié)果就為真(其值為1),即判斷b是否在a和c之間。因為關(guān)系運(yùn)算符比邏輯運(yùn)算符優(yōu)先級高,這個邏輯表達(dá)式中的括號可以省略。57(2)邏輯或運(yùn)算||:當(dāng)邏輯或運(yùn)算符與兩個表達(dá)式一起使用時,如果兩個表達(dá)式中任意一個或兩個都為真,則邏輯或運(yùn)算的結(jié)果為真。只有兩個表達(dá)式都為假時,結(jié)果才為假。例如:(a>b)||(b>c)只要a>b或者b>c為真,或者兩個條件都為真時結(jié)果就為真(其值為1)。(3)邏輯非運(yùn)算!:邏輯非運(yùn)算符用于把一個表達(dá)式改變?yōu)樗南喾礌顟B(tài)。該運(yùn)算符只能作用于一個表達(dá)式。例如,若age的值為20,則(age>18)的值為1,而!(age>18)的值為0。58雖然C語言在給出邏輯運(yùn)算結(jié)果時,以1代表真,0代表假。但反過來在判斷一個量是為真還是為假時,則0代表假,以非0的數(shù)值作為真。例如,5&&3的值為真,即結(jié)果為1。5||0的值為真,即結(jié)果為1。593.邏輯表達(dá)式邏輯表達(dá)式的一般形式為:表達(dá)式邏輯運(yùn)算符表達(dá)式其中的表達(dá)式也可以是邏輯表達(dá)式,從而組成了嵌套的情形。例如:(a&&b)&&c根據(jù)邏輯運(yùn)算符的左結(jié)合性,上式也可寫為:a&&b&&c邏輯表達(dá)式的值是式中各種邏輯運(yùn)算的最后值,以1和0分別代表真和假。在邏輯表達(dá)式的求解過程中,并不是所有的邏輯運(yùn)算符都被執(zhí)行,只有在必須執(zhí)行下一個邏輯運(yùn)算符才能求出表達(dá)式的值時,才執(zhí)行該運(yùn)算符的運(yùn)算。60(1)A&&B:只要A為假,則不必判斷B的真假,邏輯表達(dá)式即可得到結(jié)果,肯定為假。只有當(dāng)A為真時,才需要判斷B的真假來得到邏輯表達(dá)式的結(jié)果,這時才執(zhí)行&&運(yùn)算符。(2)A||B:只要A為真,則不必判斷B的真假,邏輯表達(dá)式即可得到結(jié)果,肯定為真。只有當(dāng)A為假時,才需要判斷B的真假來得到邏輯表達(dá)式的結(jié)果,這時才執(zhí)行||運(yùn)算符。例如:inta=1,b=2,c=3,d=4,m=1,n=1;(m=a>b)&&(n=c>d)首先計算m=a>b,計算結(jié)果m=0,所以整個表達(dá)式的值就確定為假即數(shù)值0,因此不必計算n=c>d,所以n的值不變,仍然為1。61【例2.8】邏輯表達(dá)式示例。#include<stdio.h>intmain(){intm=0,n=0,k;k=(m=0)&&(n=1);//①printf("1:m=%d,n=%d,k=%d\n",m,n,k);k=(m=1)&&(n=1);printf("2:m=%d,n=%d,k=%d\n",m,n,k);k=(m=2)&&(m=1)&&(m=0);printf("3:m=%d,k=%d\n",m,k);m=0;n=0;k=m==0&&n==0;printf("4:k=%d\n",k);k=m>0&&n==0;printf("5:k=%d\n",k);return0;}62【說明】本例中,邏輯與運(yùn)算從左至右計算每個表達(dá)式,左側(cè)表達(dá)式的結(jié)果為0,就不再計算右側(cè)表達(dá)式。例如,當(dāng)執(zhí)行①式時,m=0的值為0,便可確定整個表達(dá)式的值為0,因此后面的n=1就不會計算了。所以結(jié)果m的值為0,n的值仍為0表達(dá)式的值為0,則k的值為0。63【例2.9】邏輯表達(dá)式示例。#include<stdio.h>intmain(){intm=0,n=0,k;k=(m=0)||(n=1);printf("1:m=%d,n=%d,k=%d\n",m,n,k);k=(m=1)||(n=0);printf("2:m=%d,n=%d,k=%d\n",m,n,k);k=(m=2)||(m=1)||(m=0);printf("3:m=%d,k=%d\n",m,k);m=0;n=0;k=m==0||n==0;printf("4:k=%d\n",k);k=m>0||n==0;printf("5:k=%d\n",k);return0;}642.4.5賦值運(yùn)算1.賦值運(yùn)算符賦值運(yùn)算就是把數(shù)據(jù)賦給內(nèi)存中存儲的變量。賦值表達(dá)式可以像其他任何表達(dá)式一樣當(dāng)作一個數(shù)據(jù)來處理。2.賦值表達(dá)式賦值表達(dá)式的一般形式為:變量=表達(dá)式符號“=”是簡單的賦值運(yùn)算符,它有兩個操作數(shù):左操作數(shù)必須是一個變量;右操作數(shù)是一個表達(dá)式,這個表達(dá)式可以是常量表達(dá)式、變量表達(dá)式或者其他形式的表達(dá)式。賦值表達(dá)式執(zhí)行的過程是:首先計算右邊表達(dá)式的值,然后將該值賦給左邊的變量。653.賦值表達(dá)式的類型轉(zhuǎn)換賦值表達(dá)式也有類型轉(zhuǎn)換的問題。當(dāng)賦值運(yùn)算符兩邊的數(shù)據(jù)類型不相同時,系統(tǒng)將進(jìn)行自動類型轉(zhuǎn)換,即把賦值運(yùn)算符右邊的類型轉(zhuǎn)換為左邊的類型。其轉(zhuǎn)換規(guī)則為:(1)實(shí)型(float,double)賦給整型變量時,只將整數(shù)部分賦給整型變量,舍去小數(shù)部分。(2)整型(int,short,long,longlong)賦給實(shí)型變量時,數(shù)值不變,但將整型數(shù)據(jù)以浮點(diǎn)形式存放到實(shí)型類型變量中,即增加小數(shù)部分(小數(shù)部分的值為0)。(3)字符型(char)賦給整型(int)變量時,由于字符型只占一字節(jié),整型為兩字節(jié),所以int變量的高8位補(bǔ)的數(shù)與char的最高位相同,低8位為字符的ASCII碼值。66(4)整型(int)賦給字符型(char),只把低8位賦給字符變量。同樣,longint賦給int變量時,只把低16位賦給int變量。由此可見,當(dāng)賦值運(yùn)算符右邊表達(dá)式的數(shù)據(jù)類型長度比左邊變量定義的長度長時,將丟失一部分?jǐn)?shù)據(jù),這樣會損失精度。67【例2.10】#include<stdio.h>intmain(){inta,b=322;floatx,y=8.88;charcl='a',c2;a=y;x=b;printf("a=%d,x=%f\n",a,x);a=cl;c2=b;printf("a=%d,c2=%c\n",a,c2);return0;}68【說明】本例表明了賦值運(yùn)算中類型轉(zhuǎn)換的規(guī)則。a為整型,賦予實(shí)型量y值8.88后只取整數(shù)部分8。x為實(shí)型,賦予整型量b的值322后增加了小數(shù)部分。字符型量c1賦予a,變?yōu)檎?整型量b取其低8位賦予c2(b的低8位為01000010,即十進(jìn)制66,按ASCII碼對應(yīng)于字符B)。694.復(fù)合的賦值運(yùn)算符在賦值運(yùn)算符“=”之前加上其他雙目運(yùn)算符可構(gòu)成復(fù)合賦值運(yùn)算符,如+=、-=、*=、/=、%=、<<=、>>=、&=、^=和|=。構(gòu)成復(fù)合賦值表達(dá)式的一般形式為:變量雙目運(yùn)算符=表達(dá)式它等效于:變量=變量運(yùn)算符表達(dá)式注意:等號右邊的表達(dá)式作為一個整體參與運(yùn)算70復(fù)合賦值運(yùn)算符是C語言的特色之一。這類運(yùn)算符簡明,其表示方式與人們的思維習(xí)慣比較接近。i+=2可讀作“把2加到i上”,i=i+2可讀作“取i,加上2,再把結(jié)果放回到i中”。因此,前者比后者好。而且,這類運(yùn)算符還有助于編譯程序產(chǎn)生高效的目標(biāo)代碼。復(fù)合賦值運(yùn)算符的結(jié)合性都是右結(jié)合的,可以嵌套。例如“若inta=1,b=2;”,則“a+=b+=3;”等價于“a+=(b+=3);”,執(zhí)行的過程是先執(zhí)行b+=3,再執(zhí)行a+=b。最后a的值是6,b的值是5。復(fù)合賦值運(yùn)算與自增運(yùn)算都可以使變量的值發(fā)生變化。在實(shí)際應(yīng)用的過程中要注意和分析一些程序,熟練應(yīng)用這兩種運(yùn)算符。712.4.6逗號運(yùn)算在C語言中逗號“,”也是一種運(yùn)算符,稱為逗號運(yùn)算符。其功能是把兩個表達(dá)式連接起來組成一個表達(dá)式,稱為逗號表達(dá)式。其一般形式為:表達(dá)式1,表達(dá)式2逗號表達(dá)式的求值過程是從左到右分別求兩個表達(dá)式的值,并以表達(dá)式2的值作為整個逗號表達(dá)式的值。72【例2.11】#include<stdio.h>intmain(){inta=2,b=4,c=6,x,y;y=(x=a+b,b+c);printf("y=%d,x=%d\n",y,x);return0;}73【說明】本例中,y等于整個逗號表達(dá)式的值,也就是表達(dá)式2的值,x是逗號表達(dá)式中第一個表達(dá)式的值。因為逗號運(yùn)算符的優(yōu)先級比賦值運(yùn)算符低,所以y=(x=a+b,b+c)中的括號不能省。如果沒有括號,結(jié)果就不一樣了。74對于逗號表達(dá)式還要說明以下兩點(diǎn)。(1)逗號表達(dá)式一般形式中的表達(dá)式1和表達(dá)式2也可以又是逗號表達(dá)式。例如:表達(dá)式1,(表達(dá)式2,表達(dá)式3)形成了嵌套情形。因此可以把逗號表達(dá)式擴(kuò)展為以下形式:表達(dá)式1,表達(dá)式2,…,表達(dá)式n整個逗號表達(dá)式的值等于表達(dá)式n的值。(2)在程序中使用逗號表達(dá)式,通常是要分別求逗號表達(dá)式內(nèi)各表達(dá)式的值,并不一定要求整個逗號表達(dá)式的值。另外,不是在所有出現(xiàn)逗號的地方都組成逗號表達(dá)式,如在變量說明中和函數(shù)參數(shù)表中的逗號只是用作各變量之間的間隔符。75【例2.12】#include<stdio.h>intmain(){inta=1,b=2,c=3;printf("%d,%d,%d\n",a,b,c);//這里不是逗號表達(dá)式printf("%d,%d,%d\n",(a,b,c),b,c);//(a,b,c)是逗號表達(dá)式a=(c=0,c+5);//這里是逗號表達(dá)式b=(c=3,c+8);//這里是逗號表達(dá)式printf("%d,%d,%d\n",a,b,c);return0;}762.4.7位運(yùn)算1.位運(yùn)算符及其優(yōu)先次序C語言還提供字符型、整型常量和變量的按位操作。用來執(zhí)行這些位操作的運(yùn)算符稱為位運(yùn)算符。位操作是對位模式按位進(jìn)行的一元和二元操作。位運(yùn)算符有6個:~(按位取反)、&(按位與)、|(按位或)、^(按位異或)、>>(右移)和<<(左移)。除~(按位取反)為單目運(yùn)算符外,其余均為雙目運(yùn)算符。所有位運(yùn)算符的操作數(shù)必須為整型(包含字符型)。進(jìn)行位運(yùn)算的兩個操作數(shù)類型可以不同(如整型和長整型),若類型不同則運(yùn)算前自動轉(zhuǎn)換為相同的類型(按由少字節(jié)類型向多字節(jié)類型轉(zhuǎn)換的規(guī)則,即將整型轉(zhuǎn)換為長整型),運(yùn)算結(jié)果的類型與轉(zhuǎn)換后操作數(shù)的類型相同。位運(yùn)算符優(yōu)先級(從左向右優(yōu)先級由高到低):~,<<,>>,&,^,|。772.位運(yùn)算表達(dá)式及其值在使用位運(yùn)算符時,每個操作數(shù)被處理為由一系列單一的1和0組成的二進(jìn)制數(shù)字。然后,每個操作數(shù)中的各個位再按位進(jìn)行運(yùn)算,其結(jié)果根據(jù)所選的運(yùn)算確定。1)單目求反運(yùn)算符~該運(yùn)算符作用是:改變操作數(shù)中每一位1為0,每一位0為1。例如:inti=0,j=025;~i就是~0,0用十六位二進(jìn)制表示為0000000000000000,則~0就是1111111111111111,即0xffff。~j就是~(025)=~(0000000000010101B)=1111111111101010B=0xffea=0177752(十進(jìn)制為-22)782)雙目按位與、按位或、按位異或運(yùn)算符&、|和^運(yùn)算規(guī)則如下:&:對應(yīng)的兩個二進(jìn)制位均為1,則結(jié)果位為1,否則為0。|:對應(yīng)的兩個二進(jìn)制位均為0,則結(jié)果位為0,否則為1。^:對應(yīng)的兩個二進(jìn)制位相同,則結(jié)果位為0,否則為1。適當(dāng)設(shè)置掩碼,用按位|可將某些位置1;用按位^可將某些位取反;用按位&可將某些位清零。inta=0x2cab,b;79(1)要求取出a的低8位,高8位清零。用按位&實(shí)現(xiàn),b=a&0x00ff(或0xff),即a的高8位分別與0進(jìn)行&運(yùn)算,低8位分別與1進(jìn)行&運(yùn)算。所以b的值是0x00ab。(2)要求只取a的高4位,其他位清零。用按位&運(yùn)算,b=a&0xf000,即a的高4位分別與1進(jìn)行&運(yùn)算,其他位用0進(jìn)行&運(yùn)算,b的值是0x2000。(3)要求a高8位不變,將低8位置1。用按位|運(yùn)算,b=a|0xff,使a的低8位分別與1進(jìn)行|運(yùn)算,高8位用0進(jìn)行|運(yùn)算。b的值為0x2cff。80(4)將a的低4位取反,其余位不變。用按位^運(yùn)算,b=a^0xf,即用1與相應(yīng)位進(jìn)行運(yùn)算可求反,用0與相應(yīng)位進(jìn)行^運(yùn)算其值不變。b的值為0x2ca4。(5)將a的最高位取反,其余位不變。例如,b=a^0x8000,則b的值為0xacab。813)移位運(yùn)算符<<和>>移位運(yùn)算符的作用是:將運(yùn)算符左邊的操作數(shù)向左(<<)或向右(>>)移動運(yùn)算符右邊操作數(shù)指定的位數(shù)。

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論