第二章數據類型運算符和表達式_第1頁
第二章數據類型運算符和表達式_第2頁
第二章數據類型運算符和表達式_第3頁
第二章數據類型運算符和表達式_第4頁
第二章數據類型運算符和表達式_第5頁
已閱讀5頁,還剩60頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第2章數據類型、運算符和表達式VC++的數據類型基本運算符表達式語句、空語句及自增、自減運算符VC++的數據類型關鍵字標識符標點符號分隔符C++的基本數據類型常量變量2.1關鍵字(keyword)在C++語言中,已有特殊含義和用途的英文單詞稱為關鍵字或保留字C++中有48個關鍵字,其中5個不適用VC++VC++中增加了19個關鍵字,它們不適用C++C++與VC++兼容的43個關鍵字表2-12.1.1標識符標識符的定義以字母或下劃線開始的字母、數字以及下劃線組成的字符序列稱為標識符。標識符的有效長度VC++中,標識符的有效長度為1~247個字符標識符的命名方法Windows標準命名法(匈牙利法)意義法 2.1.2標點符號C++中的標點符號共有9個:#、(、)、{、}、,、:、;、…標點符號不表示任何操作同一個符號在不同的應用場合,其作用與含義是不同的例如“,”既可做為標點符號,又可作為運算符使用2.1.3分隔符C++源程序中每一個詞法符號之間必須用分隔符分隔開C++中的分隔符有:運算符、空格、標點符號、回車鍵和Tab鍵注解也可以用作分隔符2.1.4C++的基本數據類型描述一個數據需要兩方面的信息:一是數據所占用的存儲空間的大小(字節數),二是該數據所允許執行的操作或運算。為了便于對數據進行操作和加工,需要對數據進行分類,這種分類稱為數據類型。C++中數據類型分為兩大類:基本數據類型和導出數據類型。基本數據類型2.1.5基本數據類型基本數據類型:字符型(char)、整型(int)、實型(float)、雙精度型(double)和無值型(void)。可以在這些基本數據類型前加上以下幾個修飾詞而形成一種新的基本數據類型:有符號(signed)、無符號(unsigned)、長(long)、短 (short)。以上四個修飾詞來修飾int時,關鍵字int可以省略。無修飾詞的int和char,編譯程序認為是有符號的。常量在程序的執行過程中,值保持不變(也不能被改變)的量稱為常量。字面常量標識符常量2.1.6字面常量整型常量實型常量字符型常量字符串常量整型常量十進制常量:第一位為1~9的任意整數(由0~9之間的整數構成),比如123,-45八進制常量:以0開頭的整數(由0~8之間的整數構成),比如043,071十六進制常量:以0X或0x開頭的整數(由0~9之間的整數以及A~F之間的字母構成),比如,0X32,0xA3F長整型常量:以L

或l

結尾的整數,比如:123L,824l無符號整形常量:以U或u結尾的整數,比如:123u,824U實型常量十進制小數形式:比如,1.23指數形式:格式為<小數>E(或e)<指數>,比如,2e3表示2000,2E-4表示0.0002字符型常量用單引號括起來的單個字符叫字符型常量。字符常量在計算機內是采用該字符的ASCII編碼值來表示的,其數據類型為char。注意三個字符:‘“\,不能直接表示為‘‘’,‘”’,‘\’,而必須采用轉義序列方法。

轉義序列方法反斜杠+字母:表示控制字符,比如‘\a’表示響鈴,‘\n’表示回車符。反斜杠+特殊字符(‘,“,\),表示該字符。比如,’\\‘表示反斜杠“\”,’\‘’表示單引號“‘”。反斜杠+整型常量:此時整型常量必須是一個八進制或十六進制數(以X或x開頭),其取值通常在0~255之間,此時,如果在整數之前沒有0,表示八進制。比如:‘\141’、‘\X61’都與‘a’等價。字符串常量用雙引號括起來的若干個字符。當雙引號(“)或反斜杠(\)作為字符串中的一個字符時,必須采用轉義序列法;而單引號(‘)出現在字符串中時,可采用或不采用轉義序列法。字符串常量和字符常量的區別在每一個字符串常量的末尾,存儲時都要存放一個“0”,表示字符串的結束符字符串常量不能直接運用一些運算,比如算術運算、比較運算等,而字符常量可以標識符常量用標識符表示的常量。可用兩種方法定義標識符常量:利用編譯預處理指令。利用關鍵字define,以如下形式定義常量: #definePI3.14159利用常量說明符const。比如:

constI=2;注意,標識符常量一經定義,在其后繼的程序中就不能改變其值。例2-1變量在程序的執行過程中,可改變其值的量稱為變量。根據其取值不同,變量可分為不同類型的變量:比如,整型變量、實型變量、字符型變量、構造型變量、指針型變量等。對于任一變量,編譯程序要為其分配若干個字節(連續的)的內存單元,以便保存該變量的值,分配內存的大小由變量的類型決定。不管是什么類型的變量,通常是變量的說明在前,變量的使用在后。變量說明變量的賦值與初始化2.1.7變量說明說明變量的一般格式為:《storage》<type><var_name1>《,<var_name2>,…..,<var_namen>》;在C++中,變量說明是作為一條語句來處理的,稱為變量說明語句。變量說明可以出現在程序語句可出現的任何位置。同一個變量只能作一次定義性說明。給一個變量取一個新值時,稱為對變量的賦值;取一個變量的值時,稱為對變量引用;變量的賦值與初始化變量的值可以通過賦值語句而得到改變。比如,假設有一個整型變量a,則通過如下語句就可以改變a的值: a=2;當引用某個變量時,該變量必須有一個唯一確定的值。首次給變量賦值稱為對變量賦初值,或變量的初始化。可以用三種方法給變量賦初值:在變量說明時,直接賦初值;使用賦值語句賦初值;通過輸入流cin等其它方法。基本運算符在C++中,對數據(變量或常量)進行運算或處理是通過運算符進行的。所謂運算符就是表示某種特定運算形式簡單的記號。參與運算的對象稱為操作數。數據與運算符一起構成表達式,它描述對哪些數據

、以何種順序進行什么樣的操作。要正確掌握運算符,必須要注意的幾點基本運算符表達式類型轉換2.2要注意的幾點每個運算符的功能和作用運算符與操作數的關系 運算符的操作數的個數、操作數的類型運算的優先級與結合性(表1.3)

運算符的結合性規定了優先級相同的運算符的計算順序。有兩種結合性:右結合:操作數按從左到右的順序進行運算,絕大多數運算符都是右結合的左結合:操作數按從右到左的順序進行運算基本運算符基本運算符是指完成算術運算、關系運算、邏輯運算、位運算的運算符

算術運算符

關系運算符

邏輯運算符

位運算符

賦值運算符

sizeof()運算符

2.2.1算術運算符C++中有單目運算符:+-(正負號)C++中有雙目運算符:+-*/%算術運算符都是右結合的,它們之間的優先級與數學中一致。可用括號()來改變運算符的優先順序,先計算括號內的值,再計算括號外的值對于雙目運算符來說,兩個整數的運算結果還是整數;但當其中有一個操作數為實型或double型時,則運算結果為實型或double型運算符%的操作數只能是整型或字符型關系運算符關系運算是對兩個操作數進行的比較運算,C++中有六個關系運算符:<<=>>===!=關系運算符都是二目運算符。運算結果是一個整數,即當關系成立時,結果為1,而當關系不成立時,結果為0關系運算符的兩個操作數可以是任意基本類型的數據在應用關系運算符時,要注意計算機存儲和運算的精度誤差邏輯運算符邏輯運算符用來表示操作數之間的邏輯關系,其運算結果為0或1,即當邏輯關系成立時,運算結果為1,否則,為0(表1.4)C++中,邏輯運算符有三種:!:邏輯非,單目運算符&&:邏輯與,雙目運算符||:邏輯或,雙目運算符邏輯運算符的操作數可為任意一種基本數據類型的變量和常量,在運算過程中,將非0數轉化為1參與運算。

表1.4ab!a!bA&&ba||b110011100101011001001100位運算符位運算符是對其操作數按二進制數形式逐位進行的邏輯運算或移位運算。位運算符的操作數只能是整數類型的數據。C++中共有六種位運算符:注意,在進行位運算時,如果其中一個操作數為變量,在經過運算后操作數的值并沒有改變,只是將運算結果作為位運算的返回值按位取反(~)按位與(&)按位或(|)按位異或(^)左移(<<)右移(>>)按位取反(~)

將操作數的各個二進制位取反。即0變1,1變0。該運算符為單目運算符

比如:對于整型數a,其二進制值為110101,則~a為0xffffffca。計算過程如下:由于a是整型,故在存儲空間中占4個字節,共32位,因此a的低8位為00110101,而高位都為0,因此按位取反之后高位都為1,而低8為為11001010,即0xffffffca按位與(&)將兩個操作數的對應的二進制位分別進行邏輯與運算。該運算符為雙目運算符。按位邏輯與的運算規則是只有當兩個操作數都為1時,結果才為1,否則為0比如,整型變量a和b的二進制形式的值分別為:11001和11110000,則a&b的二進制值為00010000。該運算用豎式表示如下:

a00011001b&)11110000a&b00010000按位或(|)將兩個操作數對應的二進制位分別進行邏輯或運算。該運算符為雙目運算符。按位或的運算規則是只有當兩個操作數都為0時,結果才為0,否則為1比如,整型變量a和b的二進制形式的值分別為:11001和11110000,則a|b的二進制值為11111001。該運算用豎式表示如下:

a00011001b|)11110000a|b11111001按位異或(^)將兩個操作數的對應的二進制位分別進行邏輯異或運算。該運算符為雙目運算符。邏輯異或的運算規則為:僅當兩操作數的在某位對應不同時,該位的運算結果為1,否則為0。

比如,整型變量a和b的二進制形式的值分別為:11001和11110000,則a^b的二進制值為11101001。該運算用豎式表示如下:

a

00011001b^)11110000a^b11101001左移(<<)將一個二進制數向左移位指定的位數。該運算符為二目運算符,其一般格式為: <操作數1><<<操作數2>其中<操作數1>(設為a)為任一類型的整型變量,而<操作數2>(設為b)通常為一正整數,表示將a的二進制形式中的各位依次向左移動b位,移動的結果作為該運算的返回值,但a的值保持不變。比如:

inta=34,b=2,c; c=a<<b;//將a的二進制形式的各位數向左移位2位。

此時a的值保持不變,依然為34,而將移位后的結果136賦給c。

右移(>>)將一個二進制數向右移位指定的位數,該運算符為二目運算符,其一般格式為:

<操作數1>>><操作數2>其中<操作數1>(設為a)為任一類型的整型變量,而<操作數2>(設為b)通常為一正整數,表示將a的二進制形式中的各位依次向右移動b位,移動的結果作為該運算的返回值,但a的值保持不變。對一個整數右移n位,相當于將該數除以2n,并忽略小數部分

賦值運算符C++中賦值運算符分為兩種:

單一賦值運算符。即等號“=”。該運算符為二目運算符,且結合性為左結合。其功能為將右操作數賦給左操作數。例如:

a=10//把10賦給變量a復合賦值運算符。在單一的賦值運算符“=”前加上其它運算符(算術運算符或位運算符),可以構成復合的賦值運算符。C++提供了如下10種復合的賦值運算符:+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>=sizeof()運算符sizeof()運算符是用來計算某種類型或數據所占用的字節數,它為單目運算符。該運算符與其它類型的基本運算符稍有不同,它的操作數必須在括號內,其使用格式為:

sizeof(<類型>)或sizeof(<表達式>)其中前一種格式中<類型>可以是任意一種基本數據類型或用戶自定義類型。后一種格式用于計算<表達式>結果所屬類型所占用的字節數。例如

sizeof(int) //對32位計算機,其值為4sizeof(char) //其值為1sizeof(longdouble) //其值為8

doublea=2.0; floatb=3.4;sizeof(b+3)//其值為4,因為b+3的結果為實型數

sizeof(b+3.4)//其值為8,因為b+3.4的結果為雙精度型數

sizeof(a+3.4)//其值為8,因為a+3.4的結果為雙精度型

表達式 表達式是由運算符和操作數組成的,能夠求出值的式子。操作數可以為常量、變量、函數調用或其它表達式等等。最簡單的表達式是常量和變量。根據運算符的類型的不同,可將表達式分為五類:算術表達式邏輯表達式關系表達式賦值表達式逗號表達式2.2.2算術表達式算術表達式是由算術運算符和操作數組成的,能求出其值的式子。操作數可以是任意基本類型的數據。

在求算術表達式的值的過程中,要按運算符的優先級別高低次序執行,即先算乘除,后算加減。相鄰兩個運算符的優先級相同,則按規定的“從左到右”的次序運算。最后表達式的值就是該表達式的算術運算的結果,表達式的類型按混合運算的類型轉換規則確定。例如inta=2,b=2,c=4,d=5,e=6;intf=a+b-c/d*e;

等價于intf=((a+b)-((c/d)*e));intg=++a*a+a*a; //Ag的值為18inth=b*b+++b*b; //Bh的值為13A、B兩行反映了算術運算符的結合性。在A行,先將a加1變為3,再計算++a*a,結果為9,然后計算a*a,結果為9,最后將這兩者相加得g得值為18。對于B行,先計算b*b,結果為4,然后計算++b*b,在計算該式之前,先將b加1變為3,然后再計算得結果為9,最后將這兩式相加,得到h的值為13。

邏輯表達式用邏輯運算符將操作數連接起來的式子稱為邏輯表達式。邏輯表達式的值為1或0。例如:

inta=2,b=3,c=4,d=5,e;e=!a;//e的值為0e=a>b||a<c;//等價于e=((a>b)||(a<c)),e的值為1e=a>b||a>!c&&b>=d-2//等價于e=(a>b)||((a>!c)&&(b>=(d-3))),e的值為1e=!a>b//等價于e=!(a>b),e的值為1邏輯表達式的副作用

邏輯表達式的副作用對于a&&b&&c,只有a為非0時,才需要計算b的值,因為當a為0時,不管后面的項如何,都能得到該表達式的值就為0。同樣只有在a和b都為非0的情況下才需要計算c的值。

對于a||b||c,只要a為非0,就不需要判斷b和c的值,而只有當a、b都為0時才需要計算c項。

例如:

inta=2,b=3,c=4,d=5,e;e=a>b&&++b; //Ae=a<b||b++類似e=a<1&&++c||++d; //B

關系表達式關系表達式是用關系運算符將兩個操作數連接起來的式子。關系表達式的值為0或1,即當關系成立時,值為1;而當關系不成立時,值為0。例如

inta=2,b=3,c=4,d=5,e;e=a+b>c+d; //根據優先級,等價于 e=((a+b)>(c+d)),因此e值為0e=++a==b;//等價于e=((++a)==b),e的值為1。 試比較a++==b(值為0)e=5<=6 //e的值為1e=‘a’>=’b’ //e的值為0賦值表達式用賦值運算符(單一賦值運算符和復合賦值運算符)將兩個操作數連接起來的式子稱為賦值表達式,注意賦值表達式的左操作數必須為變量。賦值表達式的值為左操作數的值,因此賦值表達式還可進一步參與運算。例如

由于賦值運算符的結合性為左結合,因此運算方向是自右向左的,因此當出現連續賦值運算符時,表達式的值為最左邊的變量的值。例如

inta,b;a+=4;a>(b=3);//表達式“b=3”(值為3)參與關系運算,注意:括號不能省

a&&(b*=4)//表達式“b*=4”參與邏輯運算

a+b=2;//錯誤,因為a+b不是變量。類似的錯誤還有a+2=4等

inta,b,c=2;a=b=c+=10;//等價于a=(b=(c+=10)),該表達式的為a的值,即12a=3+b=c;//錯誤,因為該表達式等價于a=((3+b)=c),3+b不是變量

a+=b=3;//等價于a+=(b=3)逗號表達式逗號表達式是用逗號運算符將表達式連起來組成的式子。逗號運算符的優先級為所有運算符中最低的。逗號運算符的結合性為右結合,且整個逗號表達式的值和類型與最后一個表達式的值和類型一致。例如

自增自減運算符在逗號表達式中的應用

inta=1,b=3,c=2,d;d=(a=4,b=2,a>b); //先計算a=4,再計算b=2,最后計算a>b為1,因此d=1d=a=(b=3,c*2); //結果:a=c*2=4,b=3,d=4a=1;d=(a++,b+=a,c=b+2);先計算a++,然后將a增加以后的值2參與第二項b+=a的計算,得到b=5,再計算c=b+2,得到c=7,因此第三個表達式的值為7,即該逗號表達式的值為7。這里若用++a代替a++,則所得到的結果一樣。

自增自減運算符在逗號表達式中與在其它表達式中的運算規則是不一樣的。試比較:

inta=2,b;a++>(b=a);//執行該語句后,得到a=3,b=2。這里前置自增和后置自增的結果不同

類型轉換在求表達式值的過程中,對于二目運算符,通常會出現兩個操作數的類型不一致的情形,這時就要求將這兩個操作數轉換為同一類型,然后再進行運算。一般情況下,C++會進行自動轉換,當然也可以強制轉換。

不同類型數據運算的自動轉換規則

不同類型之間賦值的自動轉換規則

強制類型轉換

2.2.3不同類型數據運算的自動轉換規則當操作數的類型為字符型或短整型(包括加上signed、unsigned修飾詞)時,系統自動轉換為整型數參與運算。例如

當兩個操作數不同時,將表示范圍較小的數據類型轉換成與另一操作數相同的類型后再參與運算。轉換關系為:

int→unsigned→long→float→double

例如

shortinta=2,b=3;charx=’a’,y=’b’;

則在計算表達式a+b的值時先將a和b轉換為整型,然后再進行計算,表達式的值類型也為整型。可以用運算符sizeof()進行驗證,即sizeof(a+b)=4。

對x+y和a+x也采用同樣的方法進行計算。

可以看到,當兩個操作數的類型相同且都為字符型和短整型時,要進行類型轉換。但當兩個操作數的同為其它類型時,則不需要類型轉換。

inta=3,b=4;charch=’s’;doublex=3.4;

在計算表達式a*ch+b/x時,首先計算a*ch,先將ch轉換為整型數,再參與運算,假設得到結果為t1,然后計算b/x,先將b轉換為double型,再參與運算,得到的結果為double型,假設為t2,最后計算t1+t2,先將t1轉換為double型,再參與運算,得到一個double型的數,即為表達式的值。

不同類型之間賦值的自動轉換規則 當賦值運算符右操作數的類型與左左操作數(變量)的類型不一致時,如果它們可進行轉換(稱它們相互兼容),則系統自動對它們進行轉換。規則如下:將實型數(雙精度型)賦給整型變量將字符型數據賦給整型變量其它情形對于以上的各種形式的自動轉換,編譯系統在編譯時可能會給出一些警告信息。如要避免警告信息,可采取強制轉換的方式。將實型數(雙精度型)賦給整型變量將實型數(雙精度型)賦給整型變量時,只取實型數的整數部分,舍去小數部分。當其整數部分超過整數的范圍時,賦值的結果錯誤。

將字符型數據賦給整型變量 根據字符類型的不同,可分兩種情況:

(a)對于無符號字符類型,將該字符型數據的二進制形式的八位數直接賦給整型變量二進制形式的低八位,再將整型變量的高位補0。

(b)對于有符號字符類型,若符號位為0,則與無符號字符類型的轉換方式相同;如符號位為1,則將將該字符型數據的二進制形式的八位數直接賦給整型變量二進制形式的低八位,再將高位補1。例如

signedcharch=249;inta=ch;則a的值為-7。轉換過程可用下圖表示:

1111100111111001111111111111111111111111低八位高位字符型數據ch整型變量a其它情形對于其它情形,當將精度較低的數據賦給精度較高的變量時,可直接將前者轉換為與后者精度相同,再賦值。當將精度較高的數據(設為a)賦給精度較低的變量(設為b)時,當a賦給b的值超出b所屬類型的范圍時,則賦值的結果錯誤。

強制類型轉換強制類型轉換是指把一個表達式的值強制轉換為指定的類型。格式如下:

(<類型名>)<表達式>或<類型名>(<表達式>)

這種方法的功能是:先求表達式的值,再將該值強制轉換為<類型名>所指定的類型。

對于第一種形式,要注意強制類型轉換運算符“()”的優先級為第2級。例如

(float)3/4

溫馨提示

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

評論

0/150

提交評論