第二章 C語言的數據類型和運算_第1頁
第二章 C語言的數據類型和運算_第2頁
第二章 C語言的數據類型和運算_第3頁
第二章 C語言的數據類型和運算_第4頁
第二章 C語言的數據類型和運算_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、語言講義第二章 C語言的數據類型和運算第二章 C語言的數據類型和運算2.1 數據類型數據是計算機加工處理的對象,C語言中的數據包括:常量、變量和有返回值的函數。為存儲和處理的需要,將數據劃分為不同的類型,編譯程序為不同的類型分配不同大小的存儲空間(存儲單元的字節(jié)數),并對各種類型規(guī)定了該類型能進行的運算(運算符集),任何類型數據的值均被限制在一定的范圍內,稱為數據類型的值域(取值范圍)。短整數short (16bit)整數int (16bit)長整數long (32bit)基本類型(簡單類型)數值類型整型實型(浮點型)單精度型float (32bit)雙精度型double (64bit)字符類

2、型char (8bit)枚舉類型enum構造類型(組合類型)(導出類型)數組類型結構類型struct聯(lián)合(共用)類型union文件類型FILE指針類型空類型voidC的數據類型2.1.1 C的數據類型說明: 構造類型是由基本類型按一定的規(guī)律構造而成的。 空類型的作用:表示函數沒有返回值;說明函數無參數;表示指針不指向任何值。2.1.2 數值型數據的表示與存儲形式如的表示: 日常表示 語言中的表示3.14159*100 3.14159e00.314159*101 0.314159e+10.0314159*102 0.0314159e231.4159*10-1 31.4159e-13141.59*

3、10-3 3141.59e-3尾數部份指數部分 小數點的位置是浮動的,稱為浮點數形式。在計算機內部實數都以浮點形式存儲,如float占4個字節(jié),三個字節(jié)存數字部分,一個字節(jié)存指數部分。0 . 3 1 4 1 5 9 + 1數字部分(3個字節(jié))指數部分(1個字節(jié))小數點的位置是固定的,稱為定點數,如:3.14159 ,10,-20, 1992顯然整數都屬于定點數,如:整數10,在計算機內部一般占2個字節(jié)。 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1定點數的小數點一般是在最高位(定點小數)或在最低位(定點整數)。對于實數型定點數如:3.14159,語言則把它按指數形式存放3.1

4、4159e0,即的實數一律以浮點形式存儲。2.1.3字符型數據的表示和存儲形式字符型數如:(a,A,#,3)在內存中以相應的ASCII代碼存放(占一個字節(jié)),如a的ASCII代碼為97,存儲形式為:0 1 1 0 0 0 0 1在中,ASCII代碼值可以被看成整數,如A+32為97與a等價。2.1.4 基本類型的名字和長度下列關鍵字稱為類型區(qū)分符:char、 int、 short、 long、 signed 、unsigned 、float、double類型區(qū)分符代表一個基本類型的名字,用來說明一個數據的類型。表2.1 基本類型的名字和長度完整的類型名簡單的類型名類型的長度(字節(jié))取值范圍ch

5、ar char 1有符號:-128127 無符號:0255signed charsigned char1-128127unsigned charunsigned char10255int int 2或4(與具體機器有關)字節(jié):-32768327674字節(jié):約-21億21億short intshort2-3276832767long intlong4約-21億21億signed int signed2或4 (同int)同intunsigned intunsigned2或 4(同int)字節(jié):0655354字節(jié):約042億signed short int signed shor2-32768327

6、67unsigned short intunsigned short2065535singed long int signed long 4約-21億21億unsigned long intunsinged long4約042億float float4 絕對值約13.4e-3813.4e+38double double8絕對值約:1.7e-3081.7e+308long doublelong double>=8由具體實現定義說明:signed和unsigned不能同時修飾char,short和long或signed和unsigned不能同時修飾int。float不能使用任何修飾詞,dou

7、ble可用long修飾;int的長度與具體機器的字長相同,在16位機上為2字節(jié),在32位機上為字節(jié)。因此,int 的長度與short或long 相同。signed char用個字節(jié)的低位表示字符值,最高位表示符號。unsigned char用整個字節(jié)表示字符值,無符號位。char表示有符號和無符號與具體機器系統(tǒng)有關,但char一定和signed char或unsigned char其中之一同。在多數機器系統(tǒng)中,char與signed char同。浮點類型的范圍與浮點在機器內的表示有關,標準沒有規(guī)定浮點數格式,大多數機器浮點數格式為:對于個字節(jié)浮點數,階碼占位,尾數占位,位符號位: 尾 數 階碼

8、23位8位符號位(1位)對于字節(jié)的浮點數: 尾 數 階碼符號位(1位)52位11位在浮點數中尾數位決定精度(有效數字位數),階碼決定取值范圍。對于帶符號的數據類型,一般用最高位(左邊第位)表示符號,表示正,表示負,數值以補碼形式存放(一個正數的補碼是該數的二進制數),如()補為0000000000001010。一個負數的補碼為取反加,如()補為1111111111110110。表中列出的short,int, long 是帶符號的(隱含signed);對于無符號的數據類型,最高位不作為符號,與其它各位一起表示數值,因此,無符號數只表示正數不表示負數,與同樣長度的帶符號正數相比表示的最大數擴大了一

9、倍。字符型數據也分為signed和unsigned。ANSI標準ASCII碼字符的允許取值范圍為0127,用位表示就可以了,最左位補表示正數。有些計算機系統(tǒng),除ASCII碼字符外,還擴展使用一些圖形符號(如“”),擴充使用用128255,其第一位為。因此,對signed字符型數取值范圍為-128127。對unsigned字符型,取值范圍為0255; 實數類型數據signed、unsigned之分;以后各章均使用類型的簡寫形式;語言提供了一個測試某一類型數據所占存儲空間長度的運算符sizeof,格式為sizeof(類型標識符)。如sizeof(char)為, sizeof(long)為。2.1

10、常量和變量的常量有兩種形式:一種是文字常量,簡稱常量或常數,文字常量是由表示值的文字本身直接表示的常量,如123,3.14159;另一種是符號常量,是用標識符表示的文字常量(標識符一般用大寫英文字母),標識符是文字常量的名字。任何一個常量都屬于一個數據類型,文字常量的類型由文字常量自身隱含說明,如123為整型,3.14159是一個浮點型,符號常量的類型由定義時指定。2.2.1常量的表示的常量有整數常量、浮點常量、字符常量、字符串常量和枚舉常量。整數整數有三種形式:十進制整數、八進制整數和十六進制整數。十進制整數 十進制整數由數字09組成的數字串,多位數時最左第一個數字不能為,前面可以有表示正負

11、的符號“”或“”,“”可以省略。如738 -500+39是合法的整數。八進制整數八進制整數由數字07組成的數字串,第一個數字必須為0(前導零),它是八進制數的標志,八進制一般用于表示無符號數如:0137027+013-024是合法的八進制整數,而0128非法。八進制可以與十進制轉換:如0137=95若將轉換為八進制:0188811余余余即:十六進制整數十六進制整數是由數字09和字母af(或)組成的符號串,符號串必須以x或X(十六進制的前綴)開頭,十六進制表示無符號整數,如0x13a0xc320xff0xb8000xdc都是合法的十六進制整數。013ax13a13a均為非法。說明:所有整數的缺省

12、類型是int,通過在其后面加后綴字母,可以表示長整數(long)無符號整數(unsigned)和無符號長整數(unsigned long)。長整數:在任意進制整數后面加l或,如27l018l0x1aL無符號整數:在任意進制整數后加u或。如27u0400U0x1aU無符號長整數:任意進制的整數后加ul或UL。如:27ul 0400UL0x1aUL.后綴字母大小寫任意,由于l與數字容易混,常用。當整數的值超出int類型所能表示的范圍時,稱為整數溢出。整數溢出會產生不正確的結果,為避免溢出或類型轉換的需要,應根據具體情況將整數相應地表示為長整數、無符號整數或無符號長整數,如在16位機上,整數1234

13、56會產生溢出,應表示成123456L.2、浮點數浮點數的一般形式為:±整數部分 .小數部分 e±n其中 表示可選項,e±n稱為指數部分,e±n 表±n, “e”可以寫成“”。n稱為階碼(位十進制無符號常整數,可以有前導但仍表示十進制),n前面的“”可以省略。如-123.567e+5 -123.567E5 -123.567e05 都是代表值-12356700.0浮點數的組成規(guī)則如下:一個浮點數可以無整數部分或小數部分,但不能二者均無。一個浮點數可以無小數點或指數部分,但不能二者均無。例如:3.141593 .1E+02 -.234e+5 243

14、.e-2 2.01234e+3 0. .08 100.0 都是合法的浮點數。若將2.01e+3寫成2010,將. 寫成,或將100. 寫成100則它們不是浮點數而是整數。下面一些是非法表示:-.e+1 既無小數部分也無整數部分1e-0.5:階碼不是整數1e+I:階碼不是常量(除非I已定義為符號整型常量)當浮點數超出它的類型所能表示的范圍產生浮點溢出。如果浮點數的絕對值小于所能表示的最小值則下溢。如1.7e-309和-1.7e-309均產生下溢。下溢時絕對值太小以致機器不能表示而產生零值,稱之為“機器零”。下溢時機器可能不能正常運行。當浮點數的絕對值大于所能表示的最大值時產生上溢,如1.7e30

15、9和-1.7e309均產生上溢。上溢時將產生錯誤的結果。浮點數的缺省類型是double,通過在浮點數后面加后綴字母可以表示單精度(float)數、雙精度數(double)和高精度 (lang double) 數。單精度浮點數:在浮點數后面加f或F。如:3.14159F。雙精度浮點數:在浮點數后面加d或D。如:3.14159d。高精度浮點數:在浮點數后面加l或L。如:3.14159L。在程序中可根據存儲的需要、精度的需要或類型轉換的需要將浮點數表示為適當的類型。3、字符常數字符常數通常是指一對單引號(單撇號)括起來的一個字符,形式為:字符字符常數可以被看成是一個整數,值為該字符的ASCII碼值。

16、字符常數有兩種表示方法。(1) 用字符的圖形符號表示一個字符,形式為: 字符的圖形符號字符的圖形符號是指可打印字符,ASCII碼字符集中,字符碼為32126的字符是可打印字符,因而這種方法只適用于部分字符。如: a B + 3 > 注意:a和a表示兩種完全不同的概念,a是一個字符常數,a是由單個字母構成的標識符。另外,在可打印字符中,有兩個特殊字符不能用圖形符號來表示,它們是單引號本身()和反斜線()。即 是非法表示,要想表示它們必須用轉義序列表示。(2)用轉義序列表示一個字符,形式為: 轉義序列轉義序列是由反斜線()開頭的一個特殊字符串,每個轉義序列表示字符集中的一個字符,轉義序列及其

17、表示的字符如表2.2所示。表2.2轉義序列轉義序列ASCII字符碼表示的字符十進制八進制十六進制0abfnrtv?”oooxhh 0 7 8 12 10 13 9 11 92 63 39 3402550255 0 7 10 014 012 015 011 013 134 077 047 042000377000377 0x00 0x07 0x08 0x0c 0x0a 0x0d 0x09 0x0b 0x5c 0x3f 0x27 0x220x000xff0x000xff空字符響鈴字符退格字符換頁字符換行字符回車字符水平制表字符垂直制表字符反斜線字符問號字符單引號字符雙引號字符以ooo為字符碼的字符

18、以xhh 為字符碼的字符說明:()從表中可以看出,轉義序列有兩種形式:一種是反斜線后跟一個圖形符號;另一種轉義序列的位型“ooo”和“xhh”。前者表示常用的控制字符(字符碼為031的字符),如n表示一個換行字符,其ASCII碼為十進制10。后者可以表示字符集中的任一字符(字符碼為0255的所以字符)。()位型中的ooo表示個八進制數字,可以不用前綴;hh表示個十六進制數字,x 是前綴不能省。例如:水平制表符可用下列任一種形式表示:t011 11 x09 x9字符A可用下列任一種形式表示:A 101 x41 ()單引號和反斜線字符雖然是打印字符,但編譯程序規(guī)定必須用轉義序列表示。例如:單引號字

19、符可用下列任一種形式表示: 047 47 x27反斜線字符可用下列任一種形式表示: 0134 134 x5c()雙引號字符常數可以用圖形符號或轉義序列任一種形式表示。例如:“” 042 x22()字符0是值為的字符(空字符),不是空白字符。0除表示值外,它強調對象的類型是字符型。也就是說,表示值為的字符用0比用好。、字符串C語言沒有字符串類型,但可以表示字符串常數,字符串變量是用字符數組來表示的。字符串常數(簡稱字符串)是用一對雙引號括起來的一個字符序列,其字符的個數稱為字符串長度。形式為:“字符序列”雙引號是字符串的定界符而不是字符串的組成部分,雙引號中的任何一個字符都是一個字符常數,形式為

20、不帶單引號的字符(圖形符號或轉義字符)。例如:“This is a stringn”一個字符串可以包含個字符,表示為“”(兩個相鄰的雙撇號),稱為空串。字符串在機內存儲時,系統(tǒng)自動在其末尾加了一個0,0是字符串的結束標志,以確定字符串的實際長度,字符串的存儲長度比實際長度大??沾拇鎯﹂L度為,存儲長度為。注意:()“a” 和a是兩個不同的概念。()當雙引號作為字符串的組成字符時,必須用轉義序列表示。如:“” is a empty strinng”表示:“” is a empty strinng()當單引號作為字符串的組成字符時,可以用圖形符號表示,也可以用轉義字符表示,如:“Its a pen

21、.” “Its a pen.”()字符串可以連接。被連接的兩個字符串之間可以有個或多個空白字符,但不能有其它字符。如:“Hello,” “how are you?”等價于“Hello, how are you?”字符串連接主要用于源程序中表示長度跨越多行的字符串。如:printf(“Hello,how are you?”); 是非法的。因為語法規(guī)定字符串常數必須書寫一行。如果一行寫不下可用兩種方法:printf(“Hello,How are you?”); 是續(xù)行符或:printf(“Hello,” “how are you:”);2.2.2符號常量為使程序易于閱讀和便于修改,可以給程序中經常

22、使用的常量定義一個有一定含義的名字,這個名字稱為符號常量。符號常量是一個標識符,有三種方法定義一個符號常量:一種是利用編譯預處理的宏替換功能#define;另一種是用const類型限定符說明并初始化一個標識符;第三種方法是通過定義枚舉類型來定義符號常量(以后講)。1. 用#define定義符號常量形式:#define 標識符 常量表達式常量表達式是值為常量的表達式,一般為已定義的符號常量或文字常量,也可以由運算符連接常量形成的表達式;標識符是符號常量的名字,它代表常量表達式所表示的文字。例如:#define SIZE 100#define PI 3.1415926#define BLANK #

23、define TWO_PI 2.0*PI注:符號常量的名字(標識符)一般用大寫字母。#define 行不是C語句,而是編譯程序的預處理控制,因此其后面不加“;”2. 用const定義符號常量。形式:const 類型區(qū)分符 標識符=常量表達式;符號“=”左邊的標識符被定義為常量,標識符代表常量表達式的值。例如:const int MAX=1000;const double PI=3.14159;const char BLANK=;const signed TRUE=1,FALSE=0;說明:用#define和const定義的符號常量在實現上有本質不同。#define在編譯預處理時用常量表達式去替

24、換程序中所有出現的常量標識符,標識符沒有對應的存儲單元;由const說明的標識符是一個不可更改的左值,編譯時要給它分配存儲單元。應用舉例:計算圓柱體的體積V=r2h#include “stdio.h”void main (void) float v,r,h; printf (“input r,h:”); scanf (“%f%f”,&r,&h); v=3.14159 r*r*h; printf (“v=%fn”,v); 如果使用符號常量:#include “stdio.h”#define PI 3.14159 viod main void) float v,r,h; prinr

25、f(“input r,h:”); scanf (“%f%f”,&e,&h); v=PIr*r*h; printf(“v=%fn”,v);2.2.3變量說明變量:在程序中其值可變的量,每一個變量都有一個名字(標識符),稱為變量名。常量的類型是由常量自身隱含說明的,不需要做顯示說明,而變量的類型必須做顯示說明。C程序中任何變量必須遵循現說明后引用的原則,以便編譯程序為變量分配適當長度的存儲單元以及確定變量所允許的運算。變量說明的形式:類型區(qū)分符 變量表。類型區(qū)分符:說明變量中所列變量的數據類型。變量表由一個或多個變量名組成,多于一個變量時中間用逗號“,”隔開。一個說明結束必須用分號

26、“;”。變量數又稱說明符表,這里一個變量名即是一個說明符。如: int age,index;與int age; int index;等價程序中有些變量在使用前需要設置初值,如做為計數器使用(如n+;)和做累加和的變量(如sum=sum+x)通常置初值為零,做累乘積的變量(如time=time*y)通常置初值為1。給變量賦初值有兩種方式:一是通過賦值語句置初值(如i=0;);另一個方式是在變量說明時給出初值稱為初始化,格式為:類型區(qū)分符 變量名=表達式,;如: int age=15,index=1,i=0,j=0; int i=j=0; 非法。因為i=j=0等價于i=(j=0),而(j=0)是賦

27、值表達式。 int i,j=0; j被初始化為0;i的初值不確定。 char c=”y”; double esp=1.0e-5;注意:引用一個沒有值的變量非法。2.3 運算符和表達式C的運算符十分豐富。由運算符通過對運算對象(操作數)進行各種操作,按操作數的數目可將運算符分為:單目(一元),雙目(二元)和三目(三元)運算符;按運算符的功能分類有:算術運算符、關系運算符、邏輯運算符、自增和自減運算符、位運算符、賦值運算符和條件運算符。另外還有數組的下標 、 函數調用( )、表順序求值的逗號運算符和類型強制運算符等。表達式是由運算符、操作符數組成的符合的語法算式。從本質上說,表達式是對運算規(guī)則的描

28、述并按規(guī)則執(zhí)行運算,運算的結果是一個值,稱為表達式的值,其類型稱為表達式的類型。單個操作數也是表達式。常量、變量、有返回值的函數調用和用()括起來的表達式稱為簡單表達式。由簡單表達式和以簡單表達式為操作數的表達式都是表達式。如 y3(x4) “”稱為賦值運算符表達式的運算規(guī)則是由運算符的功能和運算符的優(yōu)先級與結合性決定的。為使表達式按一定的順序求值,編譯程序將所有運算符分成若干組,每組規(guī)定一個等級稱為運算符的優(yōu)先級,優(yōu)先級高的先執(zhí)行運算。處于同一優(yōu)先級的運算符的運算順序稱為運算符的結合性。運算符的結合性有從左至右(左結合)和從右至左(右結合)兩種。表2·2 運算符的優(yōu)先級和結合性優(yōu)先

29、級運算符結合性1() -> · 左結合2! (單目) (單目)(類型) *(指針運算) & sizeof(類型名)右結合3*(乘法) %左結合4(雙目) (雙目)左結合5<< >>左結合6< < > >左結合7 !左結合8&左結合9左結合10|左結合11&&左結合12| |左結合13? :左結合14 * % & | << >>左結合2.3.1 算術運算算術運算符包括(單目) (單目) (雙目) (雙目) * (實數式整數) %(整數)雙目 , * , ,的操作數可為任

30、何整數式或浮點數。對于“” “” 還可以用于指針加(減)一個整數。雙目運算符的兩個操作數類型可以不同,運算時自動轉換成相同的類型(以后介紹)?;驹瓌t是值域較窄的類型向較寬的類型轉換。例如: 135 結果為整數18 兩個操作數類型相同不轉換 13.05 結果為18.0 將5轉換為5.0 后運算 d97 結果為整數3, d 的類型為char,先將 d 轉換成整數100再運算對于除運算符“”,如果兩操作數都是整數則執(zhí)行整數除,結果也是整數,值為商的整數部分,小數部分被截去;若至少有一個操作數為浮點數則執(zhí)行實數除,結果為浮點數。如: 155 結果為整數3 12 結果為整數0 85 結果為整數11.0

31、2 或 12.0 結果為實數0.5或1.02.0對于求余運算符%,規(guī)定兩操作數必須為整數,運算結果也為整數,值為左操作數除以右操作數所得的余數,符號與左操作數相同。如:17%5 或 17%5 結果為整數 217%5 或 17%5 結果為整數25%10 結果為整數510%5 結果為整數0整數除和求余運算存在下列關系:a%baa/b*b 其中a,b均為整數下面是一個由算術運算符連接操作數構成的表達式25(i%j*8/(ik) 其中i,j,必須為整數k可為整數或為浮點數2.3.2 關系運算關系運算符包括 < (小于) < (小于等于) > (大于) > (大于等于) (等于)

32、 !(不等)關系運算符比較兩個操作數值的大小,操作數可以為整數、字符、實數,兩操作數類型可以不同,運算符按一般算術轉換規(guī)則自動轉換成相同的類型。結果類型一定為int,如果操作數關系成立則結果為非0(一般為1),否則為0。注意C語言中沒有表示邏輯真值和邏輯假值的數據。任何非0值(一般為非0整數)都表示邏輯真,整數0表示邏輯假。如:a!=b 表達式值為非0,50+70<=100.0 表達式值為0.如果用浮點數比較來測試某個條件,則可能永遠得不到所希望的結果。如設x,y為浮點變量,則表達式:x/y*y= =x 值可能不成立。若需要判別兩實數是否大約相等,可用下式表示:fabs(x/y*y-x)

33、<e-5 如:數學中axb與C中a=<x<=b含義不同。若a=0,b=0.5,x=0.3。則執(zhí)行 “a=<x<=b”時先求a<=x得1(真)再執(zhí)行1<=b得0(假)。為判別x是否在區(qū)間a,b內應為:a<=x && x<=b 表達式5>2>7>8在數學中不允許,在C中是允許的。按自左向右的原則:5>2為1 1>7為0 0>8為0整個表達式為的值0 關系表達式的值為,也可看作整型表達式。如:int i=1,j=7,a;a=i+(j%4!=0);最后a的值為 字符比較按ASC碼進行b&

34、gt;a為a>A為a<0為 0=0為1 例如:z=3-1>=x+1<=y+z 若x為2,y=3 則z的值為1 2.3.3 邏輯運算邏輯運算符包括:&&(與) |(或) ?。ǚ牵┻壿嬤\算符的操作數可以為任何基本類型,&&和|的兩個操作數的類型可以不同,運算時不執(zhí)行類型轉換。非0值的操作數視為邏輯真,0值操作數視為邏輯假,運算結果類型為int,值為非0(邏輯真)或0(邏輯假)。運算規(guī)則:0&&0 為0; 0&&1 為0; 1&&0 為0; 1&&1 為1注 1可用任何非0操作數代

35、替,下同。0|0 為0 0|1 為1 1|0 為1 1|1 為1 !0 為0 !1 為0如:(c<=z)&&(c>=a) 或 c<=z&&c>=a其結果如果變量c的值是小寫字母,則上式為真(非0)否則為0。d<0|d>9 若d為非數字時,表達式為非0 。否則為0!i等價于 i= =0 但!i 比i= =0效率高,若c為字符型,檢查c 是否為空白字符時 用!c 比 c= =0好注意:對于邏輯與(&&)運算,當左操作數為0(假)時整個表達式的值已確定為假,則右操作數根本就不計算(運算短路)。 如:int i=1,j

36、=1,k; i>1&&k=i+j 其結果整個表達式的值為(假),k的值為。對于邏輯或(|)運算,當左操作數為非(真)時整個表達式的值已確定為真,則右操作數根本就不計算。 如:int i=1,j=1,k; i1|k=i+j 其結果整個表達式的值為1(真),k的值為。2.3.4 自增和自減運算 自增和自減運算符包括:+(增1) -(減1) “+”和“-”是單目運算符,操作數必須是可更改的左值表達式。左值表達式是一個表示存儲單元的表達式,一般為不帶const說明的變量名。帶const說明的標識符是不可更改的左值表達式。可更改的左值表達式包括:基本類型的變量名、下標表達式、指針變

37、量名和間接訪問表達式(指針變量)、結構成員選擇表達式和結構變量名。用()括起來的左值表達式也是左值表達式?!? +”將操作數加1,“ -”將操作數減1,結果類型與操作數類型相同。整型或浮點型操作數按整型數值1增加或減少,指針類型操作數以后講。“+ +”或 “-”可以出現在操作數前面(前綴式)或后面(后綴式) 如 +n -n n+ n-。前綴式先將操作數增(減),然后取操作數的新值作為表達式的結果。例如若n=1 則+n結果為2,n的新值為2。后綴式將操作數增(減)1之前的值作為表達式的結果。操作數的增(減)1運算是在引用表達式的值之后完成的稱為后綴+(或)的計算延遲。一直延遲到出現下面情況時,操

38、作數才增(減)。·邏輯與運算符&&·邏輯或運算符|·條件運算符?:·順序求值運算符,·一個完整的表達式(包括以語句形式出現的表達式,選擇語句中的選擇表達式,循環(huán)語句中的控制表達式,return語句中表達式)舉例:設 int x=0 , y=1; x+x+ 結果為。整個表達執(zhí)行完后x值為。即若 z=x+x+ 則z的值為,x的值為2。 yx+&&x 結果為1,因為結果為,&&后面的x值為因而整個表達式的值為 z=x*y| y結果z的值為,因為|后的y值為,因而整個表達式的值為,z的值為。上機可以測試:

39、“+”、“”運算的延遲情況。#include “stdio.h”void main(void) int x=0,y=1; printf(“x=%d,y=%dn”,x,y); printf(“x+=%dn”,x+); printf(“d=%dn”,y); printf(“x=%d,y=%dn”,x,y);輸出:x=0,y=1; x+=0 y=1 x=1,y=0注:自增(自減)運算符的結合性是自右至左。它的運算對象只能是整型變量,而不能是表達式或常數,如5+或(x+y)+非法,+x也是非法,x+也是非法的。若x為5,y為5,z=x-y,則x=4,y=5,z=0。例:1 +i+i 是錯的,中間應有空

40、格:+i+ +i; 它的結合方法是:從左向右盡可能多地把連續(xù)的+號組成運算符。 2 i=3; j=+i+ +i, printf(“%d”,j),則輸出10; 而printf(“%d”,+i+ +i),則輸出9。 printf(“%d %d”,+i+ +i, i);則輸出9 3。 而printf(“%d %d”,i, +i+ +i);則輸出5 9。 3若i=3;j=i+ + +i;則j的值是8,i的值是5; 4若i=3;i=i+ + +i;則i的值是9; 5若i=3;i=i+ + i+;則i的值是8; 6若i=3;j=i+ + i+;則j的值是6,i的值是5; 7若i=3;i=+i + +i;則

41、i的值是10;2.3.5 位運算任何數據在計算機內部都是以二進制碼形式存儲的。例如一個unsigned char類型的字符A存儲形式為01000001。位運算是以逐個二進制位為直接處理對象的運算。這是C語言區(qū)別于其它高級語言的特色之一。位運算符是指 (求反) &(按位與) |(按位或) (按位加 、異或)>>(右移) <<(左移)除是單目運算符外,其余均為雙目運算符。所有位運算符的操作對象必須是整數。兩個操作數類型可以不同,運算之前遵循一般算術轉換規(guī)則自動轉換為相同的類型。結果類型是轉換后的類型,結果的值與是有符號或無符號數有關。1 求反運算()運算符“”將操作

42、數的每個二進制位取成相反值,即0變1,1變0。結果類型與操作數類型同。例:unsigned i=0xd3f5,j=0; short k=0; 將i變成二進制碼 1101001111110101 i=0010110000001010即i為0x2C0Aj的二進制碼為全0, j為全1,即65535將k各位求反,k為全1,因是有符號類型整數,所以k為-1。2 按位與、或、加運算(&、|、 )運算規(guī)則:i j i&j i|j ij0 0 00 00 1 01 11 0 01 11 1 11 0可以看出:i0的結果是i; i1的結果是i;例如 unsigned short x=0xd3f5

43、,y=0xff,z;(1) z=0xd3f5 & 0xff;它的值為0xf5,即0xd3f5通過與0xff按位與取上了它的低8位,而高8位被屏蔽,0xff稱屏蔽碼。1101001111110101 & 0000000011111111 0000000011110101(2) z=0xd3f5|0xffz被賦值為0xd3ff 通過與0xff按位或運算。使原來的數高8位不變低8位變?yōu)槿?。(3)z=0xd3f50xffz被賦值為0xd30a。 低8位取反其余不變(4)對于十進制的位操作,應先轉化為二進制,運算后再轉為十進制。如:int i ,j , k i =5; /*i的值為-6

44、*/j=5&8 ; /*j的值為*/k=58; /*k的值為*/利用“”,可使兩個變量的值交換(不借助于第三個變量)。例:a=3;b=4; a=ab; b=ba=b(ab)=abb=a0=a a=ab=(ab)b(ab)=abbab=b0=b課堂作業(yè):要想讓某數的第4位取反其它位不變,應如何設置。3移位運算符(<<和>>)"<<" 和">>"是雙目運算符。移位運算的規(guī)則是將左操作數向左(“”或向右(“)”移動由右操作數指定的位數。兩操作數必須為整數,且右操作數為正數,可以是值為正整數的表達式,結果類

45、型與轉換后的左操作數類型相同。左移時,高位被移出(丟掉),右邊空出的低位用0填充,右移時,左邊空出的高位的填充方式決定于右操作數的類型,如果是無符號數,則用0填充,否則用符號位填充。例:unsigned x=65,y=15;short z=-8;(1) x<<3該表達式的值為520,類型與x相同。X=65=0x41=0000000001000001,左移3位后X=0000001000001000=520X<<3等價于x*2*2*2,即x<<n相當于x乘上2n。但x<<15的結果是多少?(2) y>>3該表達式的值為,表達式的類型與y相

46、同。Y=15即0xf二進制是0000000000001111右移位后 變成0000000000000001為整數1。y>>3等價于y/2/2/2或y/(2*2*2),即:y>>n相當于y整除2n。() z>>該表達式的值為-2,類型為intz=-8=1111111111111000(的補碼),右移位后z=1111111111111110(的補碼)=-2位操作綜合應用舉例:例將整數的低字節(jié)作為結果的低字節(jié),的低字節(jié)作為結果的高字節(jié)拼成一個新的整數。(P&0377)| (K&0xff)<<8其中P&0377取出的低字節(jié)(低位)

47、,K&0xff取出的低字節(jié),(K&0xff)<<8使的低字節(jié)成為高字節(jié),最后由| 拼裝(“<<”優(yōu)先于“|”)。例2設x,m,n為unsigned short,且m15,n,取出x從第m位(從右至左編號依次為:15)開始向右的n位,并使其向右端(第位)靠齊。x>>(m-n+1)&(0<<n)其中m-n+1是要被取出部分距離右端的位數,x>>(m-n+1)向右端靠齊,(0<<n)制作一個低端n位為,其余為的屏蔽位。2.3.6 賦值運算賦值就是把值存入變量對應的存儲單元中,語言中賦值操作是作為一種表達式

48、來處理的,賦值運算符()可以和算術運算符(,)及雙目位運算符(&,|,>>,<<)組合成一個復合賦值運算符。賦值運算符共有11個。= += -= *= /= %= &= |= = <<= >>=注意:復合運算符的兩個組成符號之間不能有空白字符。簡單賦值簡單賦值運算符“僅執(zhí)行賦值操作,表達式的形式為:操作數操作數“的功能是將右操作數的值賦給由左操作數指定的存儲單元(變量)。左操作數必須是一個可更改內容的左值表達式.賦值運算符的右操作數類型可以和左操作數不同,執(zhí)行賦值之前右操作數被自動轉換為左操作數的類型。如:int j; j=5.6

49、;則j的值為;表達式的結果和類型與左操作數相同。對于基本類型,賦值表達式的形式可具體化為:變量名表達式例如:int i=5,j;float a=3.0,b=3.5;double r;char c1,c2;c1=a;j=c1; /*由char向int轉換,結果賦給j*/r=a*b+i; /*a*b的結果由float向double轉換,結果賦給r*/c2=j; /*j由int向char轉換,其結果賦給c2*/i=c1>c2; /*c1>c2的類型與左操作數相同,直接賦值*/當右操作數又是一個賦值表達式時,形成多重賦值表達式,例如:i=j=0是一個合法的賦值表達式,“”右結合。因此上式等

50、價于i=(j=0) ,而j=0表達式的值為,因此i的值也為,但要注意:多重賦值表達式不能出現在變量說明中,如:int i=j=0; 是非法的。 2復合賦值 復合賦值運算符包括+ = - = * = / = % = &= |= = <<=和>>=,其形式為操作數1 OP=操作數2可理解為下面的展開形式: 操作數1=操作數1 OP操作數2例如 i+=1 可理解為i=i+1注意:復合賦值運算符與它的展開形式不一定等價 如 si+=1 /*i增加1 */ 展開形式 si+=si+1 /* i增加2 */ 3表達式求值的副作用一個變量的值由于計算表達式時而發(fā)生了

51、不應有的改變,這種效應稱為表達式求值的副作用:賦值操作、自增、自減操作及函數調用都有副作用。 c=b*=a+2; 應是 b=b*(a+2); c=b;而不是 b*=a; c=b+2; 賦值操作右結合。 如 x=i+j; 應如何理解:x=(i+)+j 或x=i+(+j)?C編譯器總是從左至右盡量地將若干字符組成一個運算符。上式應理解為 x=(i+)+j 諸如 i=(k=j+1)+(j=5),不同的編譯器有不同的理解。在C中不符合交換律,在turbo C2.0中先算k=j+1,再算j=5.2.3.7 條件運算條件運算符(?:)是一個三元運算符,一般形式為操作數1?操作數2:操作數3操作數1必須為基本類型或指針類型、(一般為整型的)表達式,操作數2和操作數3可以是其它任何類型的表達式,且類型也可以不一致。計算e2結果為e2的值計算e3結果為e3的值非0e10條件運算符的規(guī)則如圖所示: 注意:e2和e3中只有一個被求值。

溫馨提示

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

評論

0/150

提交評論