




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第1章
基本C++語言——C++程序結(jié)構(gòu)01C++概述C++概述C++是在C語言基礎(chǔ)上由貝爾實(shí)驗室的BjarneStroustrup在1980年創(chuàng)建的。研制C++的一個重要目標(biāo)是使C++首先是一個更好的C,所以C++根除了C中存在的問題(如對數(shù)據(jù)類型檢查機(jī)制比較弱,缺少支持代碼重用的結(jié)構(gòu),是一種面向過程的編程語言等)。C++的另一個重要目標(biāo)就是面向?qū)ο蟮某绦蛟O(shè)計,因此在C++中引入了類的機(jī)制。最初的C++被稱為“帶類的C”,1983年正式命名為C++(CPlusPlus)。以后經(jīng)過不斷完善,形成了目前的C++。為了使C++具有良好的可移植性,1990年,美國國家標(biāo)準(zhǔn)局(ANSI)設(shè)立了ANSIX3J16委員會,專門負(fù)責(zé)制定C++標(biāo)準(zhǔn)。很快,國際標(biāo)準(zhǔn)化組織(ISO)也成立了自己的委員會(ISO-WG-21)。同年,ANSI與ISO將兩個委員會合并,統(tǒng)稱為ANSI/ISO,共同合作進(jìn)行標(biāo)準(zhǔn)化工作。經(jīng)過長達(dá)9年的努力,C++的國際標(biāo)準(zhǔn)(ISO/IEC)在1998年獲得了ISO、IEC(國際電工技術(shù)委員會)和ANSI的批準(zhǔn),這是第一個C++的國際標(biāo)準(zhǔn)ISO/IEC14882:1998,常稱為C++98、標(biāo)準(zhǔn)C++或ANSI/ISOC++。02C++程序創(chuàng)建1.創(chuàng)建工作文件夾2.啟動MicrosoftVisualStudio20083.創(chuàng)建項目并添加C++程序4.生成和運(yùn)行5.添加和移除C++程序創(chuàng)建使用C++等高級語言編寫的程序稱為源程序。由于計算機(jī)只能識別和執(zhí)行的是由0和1組成的二進(jìn)制指令,稱為機(jī)器代碼,因而C++源程序是不能被計算機(jī)直接執(zhí)行的,必須轉(zhuǎn)換成機(jī)器代碼才能被計算機(jī)執(zhí)行。這個轉(zhuǎn)換過程就是編譯器對源代碼進(jìn)行編譯和連接的過程。如圖1.1所示。源代碼編譯器目標(biāo)代碼連接程序可執(zhí)行代碼庫其他代碼C++程序創(chuàng)建事實(shí)上,對于C++程序的源代碼編輯、編譯和連接的步驟,許多C++編程工具軟件商都提供了各自的C++集成開發(fā)環(huán)境(IntegratedDevelopmentEnvironment,IDE)用于程序的一體化操作,常見的有MicrosoftVisualStudio(MicrosoftVisualC++)、各種版本的BorlandC++(如TurboC++、C++Builder等)、IBMVisualAgeC++和Bloodshed免費(fèi)的Dev-C++等。但MicrosoftVisualStudio在項目文件管理、調(diào)試以及操作的親和力等方面都略勝一籌,從而成為目前使用極為廣泛的基于Windows平臺的可視化編程環(huán)境。如圖1.2所示。C++程序創(chuàng)建1.創(chuàng)建工作文件夾創(chuàng)建VisualC++的工作文件夾“D:\VisualC++程序”,以后所有創(chuàng)建的C++程序都在此文件夾下。在文件夾“D:\VisualC++程序”下再創(chuàng)建一個子文件夾“第1章”用于存放第1章中的C++程序;對于第2章程序就存放在子文件夾“第2章”中,以此類推。2.啟動MicrosoftVisualStudio2008在Windows7(及其以后操作系統(tǒng))中,選擇“開始”→“所有程序”→“MicrosoftVisualStudio2008”→“MicrosoftVisualStudio2008”菜單命令,運(yùn)行MicrosoftVisualStudio2008。C++程序創(chuàng)建第一次運(yùn)行時,會出現(xiàn)如圖1.3所示的“選擇默認(rèn)環(huán)境設(shè)置”對話框。對于VisualC++用戶來說,為了能沿續(xù)以往的環(huán)境布局和操作習(xí)慣,應(yīng)選中“VisualC++開發(fā)設(shè)置”,然后單擊
按鈕。稍等片刻后,出現(xiàn)VisualStudio2008開發(fā)環(huán)境(參見前圖1.2)。C++程序創(chuàng)建3.創(chuàng)建項目并添加C++程序(1)選擇“文件”→“新建”→“項目”菜單命令或按快捷鍵【Ctrl+Shift+N】或單擊標(biāo)準(zhǔn)工具欄中的按鈕,彈出“新建項目”對話框,在“項目類型”欄中選中“VisualC++”下的“Win32”,在“模板”欄中選中
;單擊
按鈕,將項目位置定位到“D:\VisualC++程序\第1章”文件夾中,在“名稱”欄中輸入項目名稱“Ex_1”(雙引號不輸入)。特別地,要去除“創(chuàng)建解決方案的目錄”選項(不然文件夾的層次有點(diǎn)多),如圖1.4所示。C++程序創(chuàng)建(2)單擊
按鈕,彈出“Win32應(yīng)用程序向?qū)А睂υ捒颍瑔螕?/p>
按鈕,進(jìn)入“應(yīng)用程序設(shè)置”頁面,一定要選中“附加選項”的“空項目”,如圖1.5所示,單擊
按鈕,系統(tǒng)開始創(chuàng)建Ex_1空項目。C++程序創(chuàng)建(3)選擇“項目”→“添加新項”菜單命令或按快捷鍵【Ctrl+Shift+A】或單擊標(biāo)準(zhǔn)工具欄中的按鈕,彈出“添加新項”對話框,在“類別”欄中選中“VisualC++”下的“代碼”,在“模板”欄中選中
;在“名稱”欄中輸入文件名稱“Ex_Simple1”(雙引號不輸入,擴(kuò)展名.cpp可省略),如圖1.6所示。C++程序創(chuàng)建(4)單擊
按鈕,在打開的文檔窗口中輸入下列C++代碼。【例Ex_Simple1】一個簡單的C++程序/*第一個簡單的C++程序*/#include<iostream>usingnamespacestd;intmain(){ doubler,area; //定義變量r,area雙精度整數(shù)類型 cout<<"輸入圓的半徑:"; //顯示提示信息 cin>>r; //從鍵盤上輸入的值存放到r中 area=3.14159*r*r; //計算圓面積,結(jié)果存放到area中 cout<<"圓的面積為:"<<area<<"\n"; //輸出結(jié)果 return0; //指定返回值}C++程序創(chuàng)建4.生成和運(yùn)行(1)選擇“生成”→“生成解決方案”菜單命令或直接按快捷鍵【F7】,系統(tǒng)開始對Ex_Simple1.cpp進(jìn)行編譯、連接,同時在輸出窗口中顯示編連信息,當(dāng)出現(xiàn)“Ex_1-0個錯誤,0個警告”時表示可執(zhí)行文件Ex_1.exe已經(jīng)正確無誤地生成了。(2)選擇“調(diào)試”→“開始執(zhí)行(不調(diào)試)”菜單命令或直接按快捷鍵【Ctrl+F5】,就可以運(yùn)行剛剛生成的Ex_1.exe了,結(jié)果彈出下面的窗口(其屬性已被修改過,具體修改方法見實(shí)驗1),它稱為控制臺窗口,是一種為兼容傳統(tǒng)DOS程序而設(shè)定的屏幕窗口:此時等待用戶輸入一個數(shù)。當(dāng)輸入10并按【Enter】鍵后,控制臺窗口顯示為C++程序創(chuàng)建5.添加和移除(1)再次選擇“項目”→“添加新項”菜單命令或按快捷鍵【Ctrl+Shift+A】或單擊標(biāo)準(zhǔn)工具欄中的按鈕,彈出“添加新項”對話框,在“類別”欄中選中“VisualC++”下的“代碼”,在“模板”欄中選中
;在“名稱”欄中輸入文件名稱“Ex_Simple2”(雙引號不輸入,擴(kuò)展名.cpp可省略),單擊
按鈕,在打開的文檔窗口中輸入下列C++代碼。【例Ex_Simple2】函數(shù)調(diào)用輸出三角星陣//輸出星號的三角形陣列#include<iostream>usingnamespacestd;voidShowTriStars(intnum); //聲明一個全局函數(shù)intmain(){ ShowTriStars(5); //函數(shù)的調(diào)用 return0; //指定返回值}voidShowTriStars(intnum) //函數(shù)的定義{ for(inti=0;i<num;i++) { for(intj=0;j<=i;j++) cout<<'*'; cout<<'\n'; }}C++程序創(chuàng)建(2)在源文件節(jié)點(diǎn)
處右擊鼠標(biāo),從彈出的快捷菜單中選中“從項目中排除”命令,如圖1.7所示,這樣就將最前面的Ex_Simple1.cpp源文件排除出項目。C++程序創(chuàng)建(3)選擇“調(diào)試”→“開始執(zhí)行(不調(diào)試)”菜單命令或直接按快捷鍵【Ctrl+F5】,彈出對話框,提示“此項目已過期,...,要生成它嗎?”,單擊
按鈕,運(yùn)行的結(jié)果如下面的窗口:03C++代碼結(jié)構(gòu)1.main函數(shù)2.輸入輸出3.預(yù)處理指令4.注釋5.縮進(jìn)C++代碼結(jié)構(gòu)1.main函數(shù)代碼中,main表示主函數(shù),由于每一個程序執(zhí)行時都必須從main開始,而不管該函數(shù)在整個程序中的具體位置,因此每一個C++程序或由多個源文件組成的C++項目都必須包含一個且只有一個main函數(shù)。在main函數(shù)代碼中,“intmain()”稱為main函數(shù)的函數(shù)頭,函數(shù)頭下面是用一對花括號“{”和“}”括起來的部分,稱為main函數(shù)的函數(shù)體,函數(shù)體中包括若干條語句(按書寫次序依次順序執(zhí)行),每一條語句都由分號“;”結(jié)束。由于main函數(shù)名的前面有一個int,它表示main函數(shù)的類型是整型,須在函數(shù)體中使用關(guān)鍵字return,用來將其后面的值作為函數(shù)的返回值。C++代碼結(jié)構(gòu)2.輸入輸出main函數(shù)體內(nèi)的第1條語句是用來定義兩個雙精度實(shí)型(double)變量r和area,第2條語句是一條輸出語句,它將雙引號中的內(nèi)容(即字符串)輸出到屏幕上,cout表示標(biāo)準(zhǔn)輸出流對象(屏幕),“<<”是插入符,它將后面的內(nèi)容插入到cout中,即輸出到屏幕上;第3條語句是一條輸入語句,cin表示標(biāo)準(zhǔn)輸入流對象(鍵盤),“>>”是提取符,用來將用戶鍵入的內(nèi)容保存到后面的變量r中;“return0;”之前的最后一條語句是采用多個“<<”將字符串和變量area的內(nèi)容輸出到屏幕中,后面的“\n”是換行符,即在內(nèi)容輸出后回車換行。C++代碼結(jié)構(gòu)3.預(yù)處理指令#include<iostream>稱為預(yù)處理指令(即編譯之前進(jìn)行的指令,以后還會討論)。iostream是C++編譯器自帶的文件,稱為C++庫文件,它定義了標(biāo)準(zhǔn)輸入/輸出流的相關(guān)數(shù)據(jù)及其操作。由于程序用到了輸入/輸出流對象cin和cout,因而需要用#include將其合并到程序中。又由于它們總是被放置在源程序文件的起始處,所以這些文件被稱為頭文件(HeaderFile)。C++編譯器自帶了許多這樣的頭文件,每個頭文件都支持一組特定的“功能”,用于實(shí)現(xiàn)基本輸入輸出、數(shù)值計算、字符串處理等方面的操作。需要說明的是,為了避免與早期庫文件相沖突,C++引用了“名稱空間(namespace)”這個特性,并重新對庫文件命名,去掉了早期庫文件中的擴(kuò)展名.h。又由于iostream是C++標(biāo)準(zhǔn)組件庫,它所定義的類、函數(shù)和變量均放入名稱空間std中,因此需要在程序文件的開始位置處指定“usingnamespacestd;”,以便能被后面的程序所使用。事實(shí)上,cin和cout就是std中已定義的流對象,若不使用“usingnamespacestd;”,還應(yīng)在調(diào)用時通過域作用運(yùn)算符“::”來指定它所屬的名稱空間,即如下述格式來使用:std::cout<<"輸入圓的半徑:"; //::是域作用運(yùn)算符,表示cout是std域中的對象std::cin>>r; C++代碼結(jié)構(gòu)4.注釋在C++中,“/*...*/”之間的內(nèi)容稱為塊注釋,它可以出現(xiàn)在程序中的任何位置,包括在語句或表達(dá)式之間。而“//”只能實(shí)現(xiàn)單行的注釋,它是將“//”開始一直到行尾的內(nèi)容作為注釋,稱為行注釋。注釋的目的只是為了提高程序的可讀性,對編譯和運(yùn)行并不起作用。正是因為這一點(diǎn),所注釋的內(nèi)容既可以用漢字來表示(如Ex_Simple1、Ex_Simple2中的注釋),也可以用英文來說明,只要便于理解就行。5.縮進(jìn)縮進(jìn)是指程序在書寫時不要將程序的每一行都由第一列開始,而是在適當(dāng)?shù)牡胤郊舆M(jìn)一些空格,和注釋一樣,也是為了提高程序的可讀性。通常,在書寫代碼時,每個“}”花括號占一行,并與使用花括號的語句對齊?;ɡㄌ杻?nèi)的語句采用縮進(jìn)書寫格式,縮進(jìn)量為4個字符(一個默認(rèn)的制表符)。除縮進(jìn)外,程序代碼還應(yīng)注意對齊和分段(塊)。所謂對齊,即同一層次的語句需從同一列開始,同一層次的左右花括號分開時應(yīng)在同一列上。而分段(塊)是指將程序代碼根據(jù)其作用、功能和屬性分成幾個段落或幾個塊,段落或塊之間添加一個或多個空行。第1章
基本C++語言——數(shù)據(jù)類型和基本輸入/輸出01基本數(shù)據(jù)類型基本數(shù)據(jù)類型為了能精確表征數(shù)據(jù)在計算機(jī)內(nèi)存中的存儲(格式及大?。┖筒僮?,C++將數(shù)據(jù)類型分為基本數(shù)據(jù)類型、派生類型和復(fù)合類型三類,后兩種類型又可統(tǒng)稱為構(gòu)造類型,如圖1.8所示?;緮?shù)據(jù)類型C++基本數(shù)據(jù)類型有int(整型)、float(單精度實(shí)型)、double(雙精度實(shí)型)、char(字符型)和bool(布爾型,值為false或true,而false用0表示,true用1表示)等。對于上述基本數(shù)據(jù)類型,還可以使用short(短型)、long(長型)、signed(有符號)和unsigned(無符號)來區(qū)分,以便更準(zhǔn)確地適應(yīng)各種情況的需要。表1.1列出了C++各種基本數(shù)據(jù)的類型、字寬(以字節(jié)數(shù)為單位)和范圍,它們是根據(jù)ANSI標(biāo)準(zhǔn)而定的。類
型
名類型描述字
寬范
圍bool布爾型1false(0)或true(1)char單字符型1-128~127unsignedchar無符號字符型10~255(0xff)signedchar有符號字符型1-128~127wchar_t寬字符型2視系統(tǒng)而定short[int]短整型2-32768~32767unsignedshort[int]無符號短整型20~65535(0xffff)signedshort[int]有符號短整型(與shortint相同)2-32768~32767int整型4-2147483648~2147483647unsigned[int]無符號整型40~4294967295(0xffffffff)signed[int]有符號整型(與int相同)4-2147483648~2147483647long[int]長整型4-2147483648~2147483647unsignedlong[int]無符號長整型40~4294967295(0xffffffff)signedlong[int]有符號長整型(與longint相同)4-2147483648~2147483647float單精度實(shí)型47位有效位double雙精度實(shí)型815位有效位longdouble長雙精度實(shí)型1019位有效位,視系統(tǒng)而定02字面常量1.整數(shù)常量2.實(shí)數(shù)常量3.字符常量4.字符串常量*字面常量1.整數(shù)常量C++中的整數(shù)可用十進(jìn)制、八進(jìn)制和十六進(jìn)制來表示。其中,八進(jìn)制整數(shù)是以數(shù)字0開頭且由0~7的數(shù)字組成的數(shù)。如045,即(45)8,表示八進(jìn)制數(shù)45,等于十進(jìn)制數(shù)37;-023表示八進(jìn)制數(shù)-23,等于十進(jìn)制數(shù)-19。而十六進(jìn)制整數(shù)是以0x或0X開頭且由0~9、A~F或a~f組成的數(shù)。如0x7B,即(7B)16,等于十進(jìn)制的123,-0X1a等于十進(jìn)制的-26。需要說明的是,整數(shù)后面還可以有后綴l、L、u、U等。2.實(shí)數(shù)常量實(shí)數(shù)即浮點(diǎn)數(shù),它有十進(jìn)制數(shù)和指數(shù)兩種表示形式。十進(jìn)制數(shù)形式是由整數(shù)部分和小數(shù)部分組成的(注意必須有小數(shù)點(diǎn))。例如0.12、.12、1.2、12.0、12.、0.0都是合法的十進(jìn)制數(shù)形式實(shí)數(shù)。指數(shù)形式采用科學(xué)表示法,它能表示出很大或很小的實(shí)數(shù)。例如1.2e9或1.2E9都表示1.2×109,注意字母E(或e)前必須有數(shù)字,且E(或e)后面的指數(shù)必須是整數(shù)。需要說明的是,若實(shí)數(shù)是以F(或f)結(jié)尾的,如1.2f,則表示單精度浮點(diǎn)數(shù)(float),以L(或小寫字母l)結(jié)尾的,如1.2L,表示長雙精度浮點(diǎn)數(shù)(longdouble)。字面常量3.字符常量在C++中,用單引號將其括起來的字符稱為字符常量。如‘B’、‘b’、‘%’、‘’等都是合法的字符,但若只有一對單引號‘’則是不合法的,因為C++不支持空字符常量。注意‘B’和‘b’是兩個不同的字符。除了上述形式的字符常量外,C++還可以用“\”開頭的字符序列來表示特殊形式的字符。例如在以前程序中的‘\n’,它代表回車換行,即相當(dāng)于按【Enter】鍵,而不是表示字母n。這種將反斜杠(\)后面的字符轉(zhuǎn)換成另外意義的方法稱為轉(zhuǎn)義序列表示法。‘\n’稱為轉(zhuǎn)義字符,“\”稱為轉(zhuǎn)義字符引導(dǎo)符,單獨(dú)使用沒有任何意義,因此若要表示反斜杠字符,則應(yīng)為‘\\’。表1.2列出了常見的轉(zhuǎn)義序列符。字符形式含
義ASCII碼值\a響鈴(BEL)07H\b退格(相當(dāng)于按Backspace鍵)(BS)08H\n換行(相當(dāng)于按Enter鍵)(CR、LF)0DH、0AH\r回車(CR)0DH\t水平制表(相當(dāng)于按Tab鍵)(HT)09H\v垂直制表(僅對打印機(jī)有效)(VT)0BH\'單引號27H\"雙引號22H\\反斜杠5CH\?問號3FH\ooo用1位、2位或3位八制數(shù)表示的字符(ooo)8\xhh用1位或多位十六制數(shù)表示的字符hhH字面常量4.字符串常量*C++語言除了允許使用字符常量外,還允許使用字符串常量。字符串常量是由一對雙引號括起來的字符序列,簡稱為字符串。字符串常量中除一般字符外,還可以包含空格、轉(zhuǎn)義序列符或其他字符(如漢字)等。例如:"Hello,World!\n""C++語言"都是合法的字符串常量。字符串常量的字符個數(shù)稱為字符串長度。若只有一對雙引號“”,則這樣的字符串常量的長度為0,稱為空字符串。由于雙引號是字符串的分界符,因此如果需要在字符串中出現(xiàn)雙引號則必須用“\"”表示。例如:"Pleasepress\"F1\"tohelp!"這個字符串被解釋為:Pleasepress"F1"tohelp!字符串常量應(yīng)盡量在同一行書寫,若一行寫不下,可用“\”來連接,例如:"ABCD\EFGHIJK…"字面常量注意不要將字符常量和字符串常量混淆不清,它們主要的區(qū)別如下:(1)字符常量是用單引號括起來的,僅占1個字節(jié);而字符串常量是用雙引號括起來的,至少需要2字節(jié),但空字符串除外,它只需1個字節(jié)。例如,字符串“a”的字符個數(shù)為1,即長度為1,但它所需要的字節(jié)大小不是1而是2,因為除了字符a需要1個字節(jié)外,字符串結(jié)束符‘\0’還需1個字節(jié)。如圖1.9所示。(2)內(nèi)存中,字符是以ASCII碼值來存儲的,因此可將字符看作整型常量的特殊形式,它可以參與常用的算術(shù)運(yùn)算,而字符串常量則不能。例如:intb='a'+3; //結(jié)果b為100,這是因為讓'a'的ASCII碼值97參與了運(yùn)算03變量及其命名規(guī)則1.變量名命名2.變量定義3.變量賦值和初始化變量及其命名規(guī)則1.變量名命名變量名需用標(biāo)識符來標(biāo)識。所謂標(biāo)識符,是用來標(biāo)識變量名、函數(shù)名、數(shù)組名、類名、對象名等的有效字符序列。標(biāo)識符命名的好壞直接影響程序的可讀性,下面幾個原則是命名時所必須注意的。(1)合法性。C++規(guī)定標(biāo)識符由大小寫字母、數(shù)字字符(0~9)和下劃線組成,且第一個字符必須為字母或下劃線。任何標(biāo)識符中都不能有空格、標(biāo)點(diǎn)符號及其他字符,例如下面的標(biāo)識符是不合法的:93Salary,Peter.Ding,$178,#5f68,r<d而且,用戶定義的標(biāo)識符不能和系統(tǒng)關(guān)鍵字同名。以下是63個ANSI/ISOC++標(biāo)準(zhǔn)關(guān)鍵字:asmautoboolbreakcasecatchcharclassconstconst_castcontinuedefaultdeletedodoubledynamic_castelseenumexplicitexportexternfalsefloatforfriendgotoifinlineintlongmutablenamespacenewoperatorprivateprotectedpublicregisterreinterpret_castreturnshortsignedsizeofstaticstatic_caststructswitchtemplatethisthrowtruetrytypedeftypeidtypenameunionunsignedusingvirtualvoidvolatilewchar_twhile需要說明的是,程序中定義的標(biāo)識符除了不能與關(guān)鍵字同名外,還不能與系統(tǒng)庫文件中預(yù)定義的標(biāo)識符同名,如以前遇到的cin、cout等。變量及其命名規(guī)則(2)有效性。因為有的編譯器只能識別前32個字符,也就是說前32個字符相同的兩個不同標(biāo)識符被有的系統(tǒng)認(rèn)為是同一個標(biāo)識符。因此,雖然標(biāo)識符的長度(組成標(biāo)識符的字符個數(shù))是任意的,但最好不能超過32個。(3)易讀性。在定義標(biāo)識符時,若能做到“見名知意”就可以達(dá)到易讀性的目的。實(shí)際上,許多程序員還采用“匈牙利標(biāo)記法”來定義標(biāo)識符(見附錄D),這種方法是在每個變量名前面加上表示數(shù)據(jù)類型的小寫字符,變量名中每個單詞的首字母均大寫。例如,用nWidth或iWidth(寬度)表示整型(int)變量。變量及其命名規(guī)則2.變量定義C++中,定義變量的最簡單的方法是先寫數(shù)據(jù)類型,然后是變量名,數(shù)據(jù)類型和變量名之間必須用1個或多個空格來分隔,最后以分號來結(jié)尾,即如下列格式的語句:<數(shù)據(jù)類型><變量名1>[,<變量名2>,…];數(shù)據(jù)類型是告訴編譯器要為由變量名指定的變量分配多少字節(jié)的內(nèi)存空間,以及變量中要存取的是什么類型的數(shù)據(jù)。例如:double x; //雙精度實(shí)型變量這樣,x占用了8個字節(jié)連續(xù)的內(nèi)存空間,存取的數(shù)據(jù)類型是double型,稱為雙精度實(shí)型變量。再如:float y; //單精度實(shí)型變量則y占用了4個字節(jié)連續(xù)的內(nèi)存空間,存取的數(shù)據(jù)類型是float型,稱為單精度實(shí)型變量。此后,變量x、y就分別對應(yīng)于各自的內(nèi)存空間,換句話說,開辟的那塊8字節(jié)的內(nèi)存空間就叫x,那塊4字節(jié)的內(nèi)存空間就叫y。又如:int nNum1; //整型變量int nNum2; //整型變量int nNum3; //整型變量變量及其命名規(guī)則則nNum1、nNum2、nNum3分別占用4個字節(jié)的內(nèi)存空間,其存取的數(shù)據(jù)類型是int型,稱為整型變量。由于它們都是同一類型的變量,因此為了使代碼簡潔,可將同類型的變量定義在一行語句中,不過同類型的變量名要用逗號(,)分隔(逗號前后可以有0個或多個空格)。例如上述三個整型變量可這樣定義(注意,只有最后一個變量nNum3的后面才有分號):intnNum1,nNum2,nNum3;需要說明的是,除了上述整型變量、實(shí)型變量外,還可有字符型變量,即用char定義的變量。這些都是最基本的數(shù)據(jù)類型變量。實(shí)際上,只要是合法的C++數(shù)據(jù)類型,均可以用來定義變量。例如:unsignedshort x,y,z; //無符號短整型變量longdouble pi; //長雙精度實(shí)型變量在C++中沒有基本數(shù)據(jù)類型的字符串變量。字符串變量是用字符類型的數(shù)組、指針或string類來定義的(以后會討論)。變量及其命名規(guī)則在同一個作用域(以后會討論)中,不能對同一個變量重新定義?;蛘哒f,在同一個作用域中,不能有兩個或兩個以上的變量名相同。例如:float x,y,z; //單精度實(shí)型變量int x; //錯誤,變量x重復(fù)定義float y; //錯誤,變量y重復(fù)定義C++變量滿足即用即定義的編程習(xí)慣,也就是說,變量定義的位置可以不固定,比較自由,但一定要遵循先定義后使用的原則。例如:int x; //即用即定義x=8;int y; cout<<z<<endl; //錯誤,z還沒有定義變量及其命名規(guī)則3.變量賦值和初始化變量一旦定義后,就可以通過變量名來引用變量進(jìn)行賦值等操作。所謂引用變量,就是使用變量名對其內(nèi)存空間進(jìn)行操作。例如:int x,y;x=8; //給x賦值y=x; //將x的值賦給y“x=8;”和“y=x;”都是變量的賦值操作,“=”是賦值運(yùn)算符(以后還會討論)。由于變量名x和y標(biāo)識它們的內(nèi)存空間,因此,“x=8;”是將“=”右邊的數(shù)據(jù)8存儲到左邊變量x的內(nèi)存空間中。而“y=x;”這個操作則包括兩個過程:先獲取x的內(nèi)存空間中存儲的值(此時為8),然后將該值存儲到y(tǒng)的內(nèi)存空間中。變量及其命名規(guī)則當(dāng)首次引用一個變量時,變量必須有一個確定的值,這個值就是變量的初值。在C++中,可用下列形式或方法給變量賦初值。(1)在變量定義后,使用賦值語句來賦初值。如前面的“x=8;”和“y=x;”,使x和y的初值都設(shè)為8。(2)在變量定義的同時賦給變量初值,這個過程稱為變量初始化。例如:int nNum1=3; //指定nNum1為整型變量,初值為3double x=1.28; //指定x為雙精度實(shí)變量,初值為1.28char c='G'; //指定c為字符變量,初值為'G'(3)也可以在多個變量的定義語句中單獨(dú)對某個變量進(jìn)行初始化,如:int nNum1,nNum2=3,nNum3;表示nNum1、nNum2、nNum3為整型變量,但只有nNum2的初值為3。(4)在C++中,變量的初始化還有另外一種形式,例如:
int nX(1),nY(3),nZ;表示nX、nY和nZ都是整型變量,其中緊隨nX和nY后面的括號中的數(shù)值1和3分別為nX和nY的初值。04標(biāo)識符常量和枚舉1.const只讀變量2.枚舉常量標(biāo)識符常量和枚舉與變量相似,標(biāo)識符常量在使用前同樣需要先作聲明(所謂聲明,就是告訴編譯器這個標(biāo)識符要被使用,聲明不同于定義,由于聲明時不會分配任何內(nèi)存空間,所以聲明可以多次。而定義不同,它是要分配內(nèi)存空間的,只能定義一次)。在C++中,標(biāo)識符常量可以有const修飾的只讀變量、enum類型的枚舉常量及#define定義的常量3種形式。這里先介紹前面兩種。1.const只讀變量在變量定義時,可以使用關(guān)鍵字const來修飾,這樣的變量是只讀的,即在程序中對其只能讀取不能修改。由于不可修改,因而它是一個標(biāo)識符常量,且在定義時必須初始化。需要說明的是,通常將標(biāo)識符常量中的標(biāo)識符寫成大寫字母以與其他標(biāo)識符相區(qū)別。例如:const floatPI=3.14159265f; //指定后綴f使其類型相同,否則會有警告錯誤因π字符不能作為C++的標(biāo)識符,因此這里用PI來表示。PI被定義成一個float類型的只讀變量,由于float變量只能存儲7位有效位精度的實(shí)數(shù),因此PI的實(shí)際值為3.141592。若將PI定義成double,則全部接受上述數(shù)字。事實(shí)上,const還可放在類型名之后(它們的區(qū)別以后會討論),如下列語句:double constPI=3.14159265;標(biāo)識符常量和枚舉【例Ex_PI】
用const定義標(biāo)識符常量#include<iostream>usingnamespacestd;constdoublePI=3.14159265; //PI是一個只讀變量intmain(){ doubler=100.0,area; area=PI*r*r; //引用PI cout<<"圓的面積是:"<<area<<"\n"; return0; //指定返回值}程序運(yùn)行結(jié)果如下:圓的面積是:31415.9需要說明的是,由于const標(biāo)識符常量的值不能修改,因此下列語句是錯誤的:constfloatPI; //此時PI的值無法確定PI=3.14159265; //錯誤:只讀變量不能放在賦值運(yùn)算符的左邊標(biāo)識符常量和枚舉2.枚舉常量枚舉常量是在由關(guān)鍵字enum指定的枚舉類型中定義的。枚舉類型屬于構(gòu)造類型,它是一系列有標(biāo)識符的整型常量的集合,因此每一個枚舉常量實(shí)質(zhì)上就是一個整型標(biāo)識符常量。定義時,先寫關(guān)鍵字enum,然后是要定義的枚舉類型名、一對花括號({}),最后以分號結(jié)尾。enum和類型名之間至少要有一個空格,花括號里面是指定的各個枚舉常量名,各枚舉常量名之間要用逗號分隔。即如下列格式:enum<枚舉類型名>{<枚舉常量1,枚舉常量2,…>};例如:enumCOLORS{Black,Red,Green,Blue,White};其中COLORS是要定義的枚舉類型名,通常將枚舉類型名寫成大寫字母以與其他標(biāo)識符相區(qū)別。它有5個枚舉常量(又稱為枚舉值、枚舉元素),系統(tǒng)默認(rèn)為每一個枚舉常量對應(yīng)一個整數(shù),并從0開始,逐個增1,也就是說枚舉常量Black等于0,Red等于1,Green等于2,以此類推。標(biāo)識符常量和枚舉當(dāng)然,這些枚舉常量默認(rèn)的值可單獨(dú)重新指定,也可部分指定,例如:enumCOLORS{Black=5,Red,Green=3,Blue,White=7};由于Red沒有賦值,則其值自動為前一個枚舉常量值增1,即為6。同樣,Blue為4,這樣各枚舉常量的值依次為5,6,3,4,7。以后就可直接使用這些枚舉常量了,例如:intn=Red; //n的初值為6cout<<Blue+White<<endl; //輸出11事實(shí)上,在枚舉定義時可不指定枚舉類型名。例如:enum{Black=5,Red,Green=3,Blue,White=7};顯然,用enum一次可以定義多個標(biāo)識符常量,不像const和#define每次只能定義一個。又如,若在程序中使用TRUE表示true,F(xiàn)ALSE表示false,則可定義為:enum{FALSE,TRUE}; //或enum{TRUE=true,FALSE=false};05基本輸入/輸出1.輸入流(cin)2.輸出流(cout)3.使用格式算子oct、dec和hex基本輸入/輸出1.輸入流(cin)cin可以獲得多個鍵盤的輸入值,它具有下列格式:cin>><變量1>[>><變量2>…];其中,提取運(yùn)算符“>>”可以連續(xù)寫多個,每個提取運(yùn)算符后面跟一個獲得輸入值的變量。例如:intnNum1,nNum2,nNum3;cin>>nNum1>>nNum2>>nNum3;要求從鍵盤上輸入三個整數(shù)。輸入時,必須在3個數(shù)值之間加上一些空格來分隔,空格個數(shù)不限,最后用回車鍵結(jié)束輸入;或者在每個數(shù)值之后按回車鍵。例如,上述輸入語句執(zhí)行時,可以輸入:12?9?20
或12
9
20
基本輸入/輸出此后變量nNum1、nNum2和nNum3的值分別為12、9和20。需要說明的是,提取運(yùn)算符“>>”能自動將cin輸入值轉(zhuǎn)換成相應(yīng)變量的數(shù)據(jù)類型,但從鍵盤輸入數(shù)據(jù)的個數(shù)、數(shù)據(jù)類型及順序,必須與cin中列舉的變量一一匹配。如:char c;int i;float f;long l;cin>>c>>i>>f>>l;上述語句運(yùn)行后,若輸入:1?2?9?20
則變量c等于字符‘1’,i等于2,f等于9.0f,l等于20L。要注意輸入字符時,不能像字符常量那樣輸入‘1’,而是直接輸入字符,否則不會有正確的結(jié)果。例如,當(dāng)輸入:'1'?2?9?20
由于c是字符型變量,占一個字節(jié),故無論輸入的字符后面是否有空格,c總是等于輸入的第1個字符,即為一個單引號。此后,i就等于“1'”,由于i需要輸入的是一個整數(shù),而此時的輸入值有一個單引號,因而產(chǎn)生錯誤,但單引號前面有一個“1”,于是就將1提取給i,故i的值為1。一旦產(chǎn)生錯誤,輸入語句運(yùn)行中斷,后面的輸入就變?yōu)闊o效,因此f和l都不會有正確的值。基本輸入/輸出2.輸出流(cout)與cin相對應(yīng),通過cout可以輸出一個整數(shù)、實(shí)數(shù)、字符及字符串等,如下列格式:cout<<<對象1>[<<<對象2>...];cout中的插入運(yùn)算符“<<”可以連續(xù)寫多個,每個后面可以跟一個要輸出的常量、變量、轉(zhuǎn)義序列符及表達(dá)式等,例如:【例Ex_Cout】cout的輸出及endl算子#include<iostream>usingnamespacestd;intmain(){ cout<<"ABCD\t"<<1234<<"\t"<<endl; return0; //指定返回值}執(zhí)行該程序,結(jié)果如下:ABCD1234程序中,轉(zhuǎn)義字符‘\t’是制表符,endl是C++中控制輸出流的一個操作算子(預(yù)定義對象),它的作用和‘\n’等價,都是結(jié)束當(dāng)前行并另起一行。基本輸入/輸出3.使用格式算子oct、dec和hex格式算子oct、dec和hex能分別將輸入或輸出的整數(shù)轉(zhuǎn)換成八進(jìn)制、十進(jìn)制及十六進(jìn)制?!纠鼸x_ODH】格式算子的使用#include<iostream>usingnamespacestd;intmain(){ int nNum; cout<<"PleaseinputaHexinteger:"; cin>>hex>>nNum; cout<<"Oct\t"<<oct<<nNum<<endl; cout<<"Dec\t"<<dec<<nNum<<endl; cout<<"Hex\t"<<hex<<nNum<<endl; return0; }程序運(yùn)行后,其結(jié)果如下:PleaseinputaHexinteger:7b
Oct173Dec123Hex7b第1章
基本C++語言——運(yùn)算符和表達(dá)式01算術(shù)運(yùn)算符算術(shù)運(yùn)算符由操作數(shù)和算術(shù)運(yùn)算符構(gòu)成的算術(shù)表達(dá)式常用于數(shù)值運(yùn)算,與數(shù)學(xué)中的代數(shù)表達(dá)式相對應(yīng)。C++算術(shù)運(yùn)算符有雙目的加減乘除四則運(yùn)算符、求余運(yùn)算符及單目的正負(fù)運(yùn)算符,如下所示:+ 正號運(yùn)算符,如+4,+1.22等- 負(fù)號運(yùn)算符,如-4,-1.22等* 乘法運(yùn)算符,如6*8,1.4*3.56等
除法運(yùn)算符,如6/8,1.4/3.56等% 模運(yùn)算符或求余運(yùn)算符,如40%11等+ 加法運(yùn)算符,如6+8,1.4+3.56等- 減法運(yùn)算符,如6-8,1.4-3.56等在算術(shù)表達(dá)式中,C++算術(shù)運(yùn)算符和數(shù)學(xué)運(yùn)算的概念及運(yùn)算方法是一致的,但要注意以下幾點(diǎn)。(1)除法運(yùn)算。兩個整數(shù)相除,結(jié)果為整數(shù),如7/5的結(jié)果為1,它是將小數(shù)部分去掉,而不是四舍五入。若除數(shù)和被除數(shù)中有一個是實(shí)數(shù),則進(jìn)行實(shí)數(shù)除法,結(jié)果是實(shí)型。如7/5.0、7.0/5、7.0/5.0的結(jié)果都是1.4。(2)求余運(yùn)算。求余運(yùn)算要求參與運(yùn)算的兩個操作數(shù)都是整型,其結(jié)果是兩個數(shù)相除的余數(shù)。例如40%5的結(jié)果是0,40%11的結(jié)果是7。要理解負(fù)值的求余運(yùn)算,例如40%-11的結(jié)果是7,-40%11的結(jié)果是-7,-40%-11的結(jié)果也是-7。算術(shù)運(yùn)算符(3)優(yōu)先級和結(jié)合性。在算術(shù)表達(dá)式中,先乘、除后加、減的運(yùn)算規(guī)則是由運(yùn)算符的優(yōu)先級來保證的。其中,單目的正負(fù)運(yùn)算符的優(yōu)先級最高,其次是乘、除和求余,最后是加、減。優(yōu)先級相同的運(yùn)算符,則按它們的結(jié)合性進(jìn)行處理。所謂運(yùn)算符的結(jié)合性是指運(yùn)算符和操作數(shù)的結(jié)合方式,它有“從左至右”和“從右至左”兩種?!皬淖笾劣摇钡慕Y(jié)合是指運(yùn)算符左邊的操作數(shù)先與運(yùn)算符相結(jié)合,再與運(yùn)算符右邊的操作數(shù)進(jìn)行運(yùn)算;而“自右至左”的結(jié)合次序剛好相反,它是將運(yùn)算符右邊的操作數(shù)先與運(yùn)算符相結(jié)合。在算術(shù)運(yùn)算符中,除單目運(yùn)算符外,其余運(yùn)算符的結(jié)合性都是從左至右。要注意,只有當(dāng)兩個同級運(yùn)算符共用一個操作數(shù)時,結(jié)合性才會起作用。例如2*3+4*5,則2*3和4*5不會按其結(jié)合性來運(yùn)算,究竟是先計算2*3還是4*5由編譯器來決定。若有2*3*4,則因為兩個“*”運(yùn)算符共用一個操作數(shù)3,因此按其結(jié)合性來運(yùn)算,即先計算2*3,然后再與4進(jìn)行“*”運(yùn)算。算術(shù)運(yùn)算符(4)關(guān)于書寫格式。在使用運(yùn)算符進(jìn)行數(shù)值運(yùn)算時,往往要在雙目運(yùn)算符的兩邊加上一些空格,否則編譯器會做出與自己理解完全不同的結(jié)果。例如:-5*-6--7和-5?*?-6?-?-7 //注意空格結(jié)果是不一樣的。前者發(fā)生編譯錯誤,而后果的結(jié)果是37。但對于單目運(yùn)算符來說,雖然也可以與操作數(shù)之間存在空格,但最好與操作數(shù)寫在一起。02賦值運(yùn)算符1.左值和右值2.?dāng)?shù)值截取和數(shù)值溢出3.復(fù)合賦值4.多重賦值賦值運(yùn)算符1.左值和右值賦值運(yùn)算符“=”的結(jié)合性從右到左,其作用是將賦值符右邊操作數(shù)的值存儲到左邊的操作數(shù)所在的內(nèi)存空間中,顯然,左邊的操作數(shù)應(yīng)是一個左值。所謂左值(L-Value,L是Left的首字母),即出現(xiàn)在賦值運(yùn)算符左邊(Left)的操作數(shù),但它還必須滿足兩個條件:一是必須對應(yīng)于一塊內(nèi)存空間,二是所對應(yīng)的內(nèi)存空間中的內(nèi)容必須可以改變,也就是說左值的值必須可以改變。2.?dāng)?shù)值截取和數(shù)值溢出每一個合法的表達(dá)式在求值后都有一個確定的值和類型。對于賦值表達(dá)式來說,其值和類型就是左值的值和類型。例如:floatfTemp;fTemp=18; //fTemp是左值,整數(shù)18是右值對實(shí)型變量fTemp的賦值表達(dá)式“fTemp=18”完成后,該賦值表達(dá)式的類型是左值fTemp的類型float,表達(dá)式的值經(jīng)類型自動轉(zhuǎn)換后變成18.0f,即左值fTemp的值和類型。顯然,在賦值表達(dá)式中,當(dāng)右值的數(shù)據(jù)類型低于左值的數(shù)據(jù)類型時,C++會自動進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。但若右值的數(shù)據(jù)類型高于左值的數(shù)據(jù)類型,且不超過左值的范圍時,則C++會自動進(jìn)行數(shù)值截取。例如,若有“fTemp=18.0”,因為常量18.0默認(rèn)時是double型,高于fTemp指定的float型,但18.0沒有超出float型數(shù)值范圍。因而此時編譯后,會出現(xiàn)警告,但不會影響fTemp結(jié)果的正確性。賦值運(yùn)算符但如果一個數(shù)值超出一個數(shù)據(jù)類型所表示的數(shù)據(jù)范圍時,則會出現(xiàn)數(shù)值溢出。數(shù)值溢出的一個典型的特例是當(dāng)某數(shù)除以0,這種嚴(yán)重情況編譯器將報告錯誤并終止程序運(yùn)行。而超出一個數(shù)據(jù)類型所表示的數(shù)據(jù)范圍的溢出在編譯時往往不會顯示錯誤信息,也不會引起程序終止,因此在編程時需要特別小心?!纠鼸x_OverFlow】一個整數(shù)溢出的例子#include<iostream>usingnamespacestd;intmain(){ shortnTotal,nNum1,nNum2; nNum1=nNum2=1000; nTotal=nNum1*nNum2; cout<<nTotal<<"\n"; return0; }程序運(yùn)行后,輸出nTotal的計算結(jié)果16960。賦值運(yùn)算符3.復(fù)合賦值在C++中,規(guī)定了下列10種復(fù)合賦值運(yùn)算符:+= 加賦值 &= 位與賦值-= 減賦值 |= 位或賦值*= 乘賦值 ^= 位異或賦值/= 除賦值 <<= 左移位賦值%= 求余賦值 >>= 右移位賦值它們都是在賦值符“=”之前加上其他運(yùn)算符而構(gòu)成的,其中算術(shù)復(fù)合賦值運(yùn)算符的含義如表1.3所示,其他復(fù)合賦值運(yùn)算符的含義均與其相似。運(yùn)
算
符含
義例
子等效表示+=加賦值a+=ba=a+b-=減賦值a-=ba=a-b*=乘賦值a*=ba=a*b/=除賦值a/=ba=a/b%=求余賦值nNum%=8nNum=nNum%8賦值運(yùn)算符盡管復(fù)合賦值運(yùn)算符看起來有些古怪,但它卻能簡化代碼,使程序精練,更主要的是在編譯時能產(chǎn)生高效的執(zhí)行代碼。需要說明的是,在復(fù)合賦值運(yùn)算符之間不能有空格,例如+=不能寫成+=,否則編譯時將提示出錯信息。復(fù)合賦值運(yùn)算符的優(yōu)先級和賦值符“=”的優(yōu)先級一樣,在C++的所有運(yùn)算符中只高于逗號運(yùn)算符,而且復(fù)合賦值運(yùn)算符的結(jié)合性也和賦值符“=”一樣,也是從右至左。因此,在組成復(fù)雜的表達(dá)式時要特別小心。例如:a*=b-4/c+d等效于a=a*(b-4/c+d)而不等效于a=a*b-4/c+d賦值運(yùn)算符4.多重賦值所謂多重賦值是指在一個賦值表達(dá)式中出現(xiàn)兩個或更多的賦值符“=”,例如:nNum1=nNum2=nNum3=100 //若結(jié)尾有分號“;”,則表示是一條語句由于賦值符的結(jié)合性是從右至左的,因此上述的賦值是這樣的過程:首先對賦值表達(dá)式nNum3=100求值,即將100賦值給nNum3,同時該賦值表達(dá)式的結(jié)果是其左值nNum3,值為100。然后將nNum3的值賦給nNum2,這是第二個賦值表達(dá)式,該賦值表達(dá)式的結(jié)果是其左值nNum2,值也為100。最后將nNum2的值賦給nNum1,整個表達(dá)式的結(jié)果是左值nNum1。由于賦值是一個表達(dá)式,因而幾乎可以出現(xiàn)在程序的任何地方,由于賦值運(yùn)算符的等級較低,因此這時的賦值表達(dá)式兩邊應(yīng)加上圓括號。例如:a=7+(b=8) //賦值表達(dá)式值為15,a值為15,b值為8a=(c=7)+(b=8) //賦值表達(dá)式值為15,a值為15,c值為7,b值為8(a=6)=(c=7)+(b=8) //賦值表達(dá)式值為15,a值為15,c值為7,b值為8要注意上面最后一個表達(dá)式的運(yùn)算次序:由于圓括號運(yùn)算符的優(yōu)先級在該表達(dá)式中是最高的,因此先運(yùn)算(a=6)、(c=7)和(b=8),究竟這3個表達(dá)式誰先運(yùn)算,取決于編譯器。由于這三個表達(dá)式都是賦值表達(dá)式,其結(jié)果分別為它們的左值a、c和b,因此整個表達(dá)式等效于a=c+b,結(jié)果為a=15、b=8、c=7,整個表達(dá)式的結(jié)果是左值a。需要說明的是,當(dāng)賦值表達(dá)式出現(xiàn)在cout中時,需將賦值表達(dá)式兩邊加上圓括號。例如:cout<<(a=6)<<endl; //輸出結(jié)果為6cout<<(a=6)+(b=5)<<endl; //輸出結(jié)果為1103數(shù)據(jù)類型轉(zhuǎn)換1.自動轉(zhuǎn)換2.強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類型轉(zhuǎn)換1.自動轉(zhuǎn)換自動轉(zhuǎn)換是將數(shù)據(jù)類型按從低到高的順序自動進(jìn)行轉(zhuǎn)換,如圖1.10所示,箭頭的方向表示轉(zhuǎn)換的方向。由于這種轉(zhuǎn)換不會丟失有效的數(shù)據(jù)位,因而是安全的。例如,10+'a'+2*1.25-5.0/4L的運(yùn)算次序如下:(1)進(jìn)行2*1.25的運(yùn)算,將2和1.25都轉(zhuǎn)換成double型,結(jié)果為double型的2.5。(2)進(jìn)行5.0/4L的運(yùn)算,將長整型4L和5.0都轉(zhuǎn)換成double型,結(jié)果值為1.25。(3)進(jìn)行10+'a'的運(yùn)算,先將'a'轉(zhuǎn)換成int型整數(shù)97,運(yùn)算結(jié)果為107。(4)整數(shù)107和2.5相加,先將整數(shù)107轉(zhuǎn)換成double型,結(jié)果為double型,值為109.5。(5)進(jìn)行109.5-1.25的運(yùn)算,結(jié)果為double型的108.25。數(shù)據(jù)類型轉(zhuǎn)換2.強(qiáng)制轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換是在程序中通過指定數(shù)據(jù)類型來改變?nèi)鐖D1.10所示的類型轉(zhuǎn)換順序,將一個變量從其定義的類型改變成為另一種不同的類型。由于這種轉(zhuǎn)換可能會丟失有效的數(shù)據(jù)位,因而是不安全的。在強(qiáng)制轉(zhuǎn)換操作時,C++有下列兩種基本格式:(<類型名>)<表達(dá)式><類型名>(<表達(dá)式>)這里的類型名是任何合法的C++數(shù)據(jù)類型,如float、int等。通過類型的強(qiáng)制轉(zhuǎn)換可以將表達(dá)式(含常量、變量等)轉(zhuǎn)換成類型名指定的類型,如:doublef=3.56; intnNum;nNum=(int)f; //強(qiáng)制使double轉(zhuǎn)換成int,小數(shù)部分被截去或者nNum=int(f); //或者nNum=(int)(f);都是將nNum的值變?yōu)?。04關(guān)系運(yùn)算符關(guān)系運(yùn)算符關(guān)系運(yùn)算是邏輯運(yùn)算中比較簡單的一種。所謂關(guān)系運(yùn)算實(shí)際上是比較兩個操作數(shù)是否符合給定的條件。在C++中,若符合條件(“真”)或為非0,則關(guān)系表達(dá)式值為bool型的true,否則條件為“假”或為0時,則為bool型的false。由于關(guān)系運(yùn)算需要兩個操作數(shù),所以關(guān)系運(yùn)算符都是雙目運(yùn)算符,其結(jié)合性是從左至右。C++提供了下列6種關(guān)系運(yùn)算符:< 小于,
若表達(dá)式e1<e2成立,
則結(jié)果為true,否則為false<= 小于等于,
若表達(dá)式e1<=e2成立,
則結(jié)果為true,否則為false> 大于,
若表達(dá)式e1>e2成立,
則結(jié)果為true,否則為false>= 大于等于,
若表達(dá)式e1>=e2成立,
則結(jié)果為true,否則為false== 相等于,
若表達(dá)式e1==e2成立,
則結(jié)果為true,否則為false!= 不等于,
若表達(dá)式e1!=e2成立,
則結(jié)果為true,否則為false其中,前4種的優(yōu)先級相同且高于后面的2種。例如,若有表達(dá)式:a==b>c則等效于a==(b>c)。若設(shè)整型變量a=3、b=4、c=5,則表達(dá)式中,先運(yùn)算b>c,結(jié)果該條件不滿足,值為false(以0表示),然后再運(yùn)算a==0,顯然也為false,故整個表達(dá)式的值是false。需要注意的是,關(guān)系運(yùn)算符“==”不要誤寫成賦值運(yùn)算符“=”。為了避免這種情況發(fā)生,作為技巧,若操作數(shù)有常量,則應(yīng)將常量寫在“==”的左邊。如“3==a”,這樣即使不小心寫成“3=a”,由于3不能作為左值,因此編譯時會檢測出它的語法錯誤。05邏輯運(yùn)算符邏輯運(yùn)算符邏輯運(yùn)算符用于將多個關(guān)系表達(dá)式或邏輯量(true或false)組成一個邏輯表達(dá)式。同樣,邏輯表達(dá)式的結(jié)果也是bool型,要么為true,要么為false。C++提供了下列3種邏輯運(yùn)算符:! 邏輯非(單目)&& 邏輯與(雙目)|| 邏輯或(雙目)邏輯非“!”是指將操作數(shù)的值為true時變成false,為false時變成true。邏輯與“&&”是指當(dāng)兩個操作數(shù)都是true時,結(jié)果才為true,否則為false。邏輯或“||”是指當(dāng)兩個操作數(shù)中有一個是true時,結(jié)果就為true,而只有當(dāng)它們都為false時,結(jié)果才為false?!斑壿嫹恰薄斑壿嬇c”和“邏輯或”的優(yōu)先級依次從高到低,且“邏輯非”的優(yōu)先級還比算術(shù)運(yùn)算符和關(guān)系運(yùn)算符高,而“邏輯與”和“邏輯或”的優(yōu)先級卻比關(guān)系運(yùn)算符要低。邏輯運(yùn)算符需要說明的是,C++對邏輯表達(dá)式的運(yùn)算次序進(jìn)行了優(yōu)化。當(dāng)有e1&&e2時,若表達(dá)式e1為false,則表達(dá)式e2不會計算,因為無論e2是何值,整個表達(dá)式都為false。類似的,當(dāng)有e1||e2時,若e1為true,則e2也不會計算,因為無論e2是何值,整個表達(dá)式都為true。例如,若inta,b=3,c=0,則在下面的表達(dá)式中(a=0)&&(c=a+b); //注意這里的a=0是賦值表達(dá)式因(a=0)的表達(dá)式值為0(false),故(c=a+b)不會被執(zhí)行。這樣,a、b和c的值分別為0、3、0。若有(a=2)||(c=a+b); //注意這里的a=2是賦值表達(dá)式因(a=2)的表達(dá)式值為2(true),故(c=a+b)也不會被執(zhí)行(注意此時的邏輯符為“或”)。06位運(yùn)算符位運(yùn)算符位運(yùn)算符是對操作數(shù)按其在計算機(jī)內(nèi)表示的二進(jìn)制數(shù)逐位地進(jìn)行邏輯運(yùn)算或移位運(yùn)算,參與運(yùn)算的操作數(shù)只能是整型常量或整型變量。C++語言提供了6種位運(yùn)算符:~
按位求反(單目)& 按位與(雙目)^ 按位異或(雙目)| 按位或(雙目)<< 左移(雙目)>> 右移(雙目)按位求反“~”是將一個二進(jìn)制數(shù)的每一位求反,0變成1,1變成0。按位與“&”是將兩操作數(shù)對應(yīng)的每個二進(jìn)制位分別進(jìn)行邏輯與操作。按位異或“^”是將兩操作數(shù)對應(yīng)的每個二進(jìn)制位分別進(jìn)行異或操作,相同為0,不同為1。按位或“|”是將兩操作數(shù)對應(yīng)的每個二進(jìn)制位分別進(jìn)行邏輯或操作。位運(yùn)算符操作數(shù)<<移位的位數(shù)左移后,低位補(bǔ)0,移出的高位舍棄。例如:表達(dá)式4<<2的結(jié)果是16(二進(jìn)制為00010000),其中4是操作數(shù),二進(jìn)制為00000100,2是左移的位數(shù)。右移“>>”(兩個>符號連寫)是將左操作數(shù)的二進(jìn)制值向右移動指定的位數(shù),它的操作格式與“左移”相似,即具有下列格式:操作數(shù)>>移位的位數(shù)左移“<<”(兩個<符號連寫)是將左操作數(shù)的二進(jìn)制值向左移動指定的位數(shù),它具有下列格式:右移后,移出的低位舍棄。如果是無符號數(shù)則高位補(bǔ)0;如果是有符號數(shù),則高位補(bǔ)符號位(補(bǔ)1)或補(bǔ)0,不同的編譯器對此有不同的處理方法,VisualC++6.0采用的是補(bǔ)符號位(補(bǔ)1)的方法。07條件運(yùn)算符條件運(yùn)算符條件運(yùn)算符“?:”是C++中唯一的一個三目運(yùn)算符,它具有下列格式:<e1>?<e2>:<e3>其中,表達(dá)式e1是C++中可以產(chǎn)生true和false結(jié)果的任何表達(dá)式。其功能是:如果表達(dá)式e1的結(jié)果為true,則執(zhí)行表達(dá)式e2,否則執(zhí)行表達(dá)式e3。例如:nNum=(a>b)?10:8;當(dāng)(a>b)為true時,則表達(dá)式(a>b)?10:8的結(jié)果為10,從而nNum=10;否則(a>b)?10:8的結(jié)果為8,nNum=8。需要說明的是,由于條件運(yùn)算符“?:”的優(yōu)先級比較低,僅高于賦值運(yùn)算符,因此“nNum=(a>b)?10:8”中的條件表達(dá)式“(a>b)”兩邊可以不加圓括號。即可寫成:nNum=a>b?10:8;08sizeof運(yùn)算符sizeof運(yùn)算符sizeof的目的是返回操作數(shù)所占的內(nèi)存空間大?。ㄗ止?jié)數(shù)),它具有下列兩種格式:sizeof(<表達(dá)式>)sizeof(<數(shù)據(jù)類型>)例如:sizeof("Hello") //計算"Hello"所占內(nèi)存的字節(jié)大小,結(jié)果為6sizeof(int) //計算整型int所占內(nèi)存的字節(jié)數(shù)需要說明的是,由于同一類型的操作數(shù)在不同的計算機(jī)中占用的存儲字節(jié)數(shù)可能不同,因此sizeof的結(jié)果有可能不一樣。例如sizeof(int)的值可能是4,也可能是2。09逗號運(yùn)算符逗號運(yùn)算符逗號運(yùn)算符“,”是優(yōu)先級最低的運(yùn)算符,它用于把多個表達(dá)式連接起來,構(gòu)成一個逗號表達(dá)式。逗號表達(dá)式的一般形式為:表達(dá)式1,表達(dá)式2,表達(dá)式3,…,表達(dá)式n在計算時,C++將從左至右逐個計算每個表達(dá)式,最終整個表達(dá)式的結(jié)果是最后計算的那個表達(dá)式的類型和值,即表達(dá)式n的類型和值。例如:a=1,b=a+2,c=b+3該表達(dá)式依次從左至右計算,最終的類型和值為最后一個表達(dá)式“c=b+3”的類型和值,結(jié)果為左值c(c值為6)。要注意逗號運(yùn)算符“,”的優(yōu)先級是最低的,必要時要注意加上圓括號,以使逗號表達(dá)式的運(yùn)算次序先于其他表達(dá)式。例如:j=(i=12,i+8)則整個表達(dá)式可解釋為一個賦值表達(dá)式。圓括號中,i=12,i+8是逗號表達(dá)式,計算次序是先計算表達(dá)式i=12,然后再計算i+8。整個表達(dá)式的類型和值是j的類型和值(為20)。若不加上圓括號,則含義完全不一樣。試比較:j=i=12,i+810自增和自減自增和自減單目運(yùn)算符自增(++)和自減(--)為變量左值加1或減1提供一種非常有效的方法。++和自減--既可放在左值的左邊也可以出現(xiàn)在左值的右邊,分別稱為前綴運(yùn)算符和后綴運(yùn)算符。這里的左值可以是變量或結(jié)果為左值的表達(dá)式等,但不能是常量或其他右值。例如:inti=5;i++; //合法:后綴自增,等效于i=i+1;或i+=1;++i; //合法:前綴自增,等效于i=i+1;或i+=1;i--; //合法:后綴自減,等效于i=i-1;或i-=1;--i; //合法:前綴自減,等效于i=i-1;或i-=1;5++;或++5; //錯誤:5是常量,不能作左值(i+1)++;或++(i+1); //錯誤:i+1是一個右值表達(dá)式floatf1,f2=3.0f;f1=f2++; //合法:f1的值為3.0f,f2的值為4.0f(f1=5.0f)++; //合法:f1=5.0f表達(dá)式的結(jié)果是f1,可作為左值要注意前綴和后綴自增自減運(yùn)算符含義的不同。若前綴運(yùn)算符和后綴運(yùn)算符僅用于某個變量的增1和減1,則這兩者是等價的。例如,若a的初值為5,a++和++a都是使a變成6。但如果將這兩個運(yùn)算符和其他的運(yùn)算符組合在一起,在求值次序上就會產(chǎn)生根本的不同。自增和自減
如果用前綴運(yùn)算符對一個變量增1(減1),則在將該變量增1(減1)后,用新的值在表達(dá)式中進(jìn)行其他的運(yùn)算。
如果用后綴運(yùn)算符對一個變量增1(減1),則用該變量的原值在表達(dá)式進(jìn)行其他的運(yùn)算后,再將該變量增1(減1)。例如:a=5; b=++a; //A:相當(dāng)于a=a+1;b=a;和a=5; b=a++; //B:相當(dāng)于b=a;a=a+1;運(yùn)行后,a值的結(jié)果都是6,但b的結(jié)果卻不一樣,前者(A)為6,后者(B)為5。自增和自減還需說明的是:(1)前綴自增自減表達(dá)式的結(jié)果仍為一個左值,而后綴自增自減表達(dá)式的結(jié)果不是左值。例如:inta=3;(++a)++; //A:合法++a++; //B:錯誤++(++a); //C:合法a++++; //D:錯誤++++a; //E:合法在ANSI/ISOC++中,由于后綴自增自減的運(yùn)算符優(yōu)先級比前綴的要高,因此++a++等效于++(a++)。在C++中,對于等級相同的單目運(yùn)算符來說,哪一個運(yùn)算符靠近操作數(shù),就跟哪個運(yùn)算符先結(jié)合。即a++++等效于(a++)++,++++a等效于++(++a)。這也是為什么后綴自增自減運(yùn)算符的結(jié)合性是“從左至右”,而前綴自增自減運(yùn)算符的結(jié)合性是“從右至左”的原因了。A中,++a仍可作為左值,因此(++a)++是合法的。B中,++a++等效于++(a++),由于a++不可以作為左值,所以++a++是不合法的。類似的,可對C、D和E的結(jié)果進(jìn)行分析。自增和自減(2)自增或自減運(yùn)算符是兩個“+”或兩個“-”的一個整體,中間不能有空格。如果有多于兩個“+”或兩個“-”連寫情況,則編譯會首先識別自增或自減運(yùn)算符。例如:inta=1,b=3,c;c=a++b; //A:錯誤c=a+++b; //B:合法c=a++++b; //C:錯誤c=a+++++b; //D:錯誤A中,編譯會將其理解為a++?b。由于b前面沒有運(yùn)算符,因而會出現(xiàn)錯誤提示:缺少“;”(在標(biāo)識符“b”的前面)。B中,編譯會將其理解為a++?+?b,因此是合法的,結(jié)果c為4。C中,編譯會將其理解為a++?++?b,即為(a++)++?b。由于a++不能作為左值,因此會出現(xiàn)錯誤提示:“++”需要左值。且由于b前面沒有運(yùn)算符,因而還有另一條與A相同的錯誤提示。D中,編譯將其理解為a++?++?+?b,即為(a++)++?+?b。由于a++不能作為左值,因此會出現(xiàn)錯誤提示:“++”需要左值。所以,在書寫這些表達(dá)式時,一定要有意識地加上一些空格或圓括號。例如,對于D,若寫成:c=a++?+?++b;第1章
基本C++語言——基本語句01順序語句和塊1.說明語句2.表達(dá)式語句3.塊語句順序語句和塊1.說明語句在C++中,把完成對數(shù)據(jù)結(jié)構(gòu)的定義和描述、對變量或標(biāo)識符常量的屬性說明(如初值、類型等)稱為說明語句或聲明語句。說明語句的目的是用來在程序中引入一個新的標(biāo)識符,本身一般不執(zhí)行操作。例如:inta=8,b; //變量定義intsum(intx,inty) //函數(shù)定義,函數(shù)的使用以后會討論{ return(x+y);}classCStudent //類聲明,以后還會討論{ //…};順序語句和塊2.表達(dá)式語句表達(dá)式語句是C++程序中最簡單也是最常用的語句。任何一個表達(dá)式加上分號就是一個表達(dá)式語句,例如:x+y;nNum=5;這里的“x+y;”是一個由算術(shù)運(yùn)算符“+”構(gòu)成的表達(dá)式語句,其作用是完成“x+y”的操作,但由于不保留計算結(jié)果,所以無實(shí)際意義?!皀Num=5;”是一個由賦值運(yùn)算符“=”構(gòu)成的表達(dá)式語句,簡稱為賦值語句,其作用是改變nNum變量的值。在書寫格式上,可以將幾個簡單的表達(dá)式語句同時寫在一行上,但此時的語句之間必須插入一些空格以提高程
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 玻璃制品的節(jié)能照明設(shè)計考核試卷
- 2024項目管理考試的深入研究試題及答案
- 多功能復(fù)合材料考核試卷
- 電子專業(yè)音頻設(shè)備市場動態(tài)考核試卷
- 腸道微生物群落分析的意義試題及答案
- 2025年內(nèi)部審計審查試題及答案
- 2024年微生物未來發(fā)展預(yù)測試題及答案
- 拍賣行業(yè)監(jiān)管政策動態(tài)監(jiān)測考核試卷
- 細(xì)菌生理特性的檢驗方法試題及答案
- 定制白鋼屏風(fēng)施工方案
- 公司收款委托書模板
- 宏觀經(jīng)濟(jì)學(xué)全套課件(完整)
- JT-T-808-2019道路運(yùn)輸車輛衛(wèi)星定位系統(tǒng)終端通信協(xié)議及數(shù)據(jù)格式
- 鍺γ射線譜儀校準(zhǔn)規(guī)范
- 七年級下冊數(shù)學(xué)平行線中拐點(diǎn)問題
- 計算機(jī)基礎(chǔ)知識題庫1000道含完整答案(歷年真題)
- 河北省唐山市豐潤區(qū)2023-2024學(xué)年部編版八年級下學(xué)期5月期中歷史試題
- 走進(jìn)歌劇世界智慧樹知到期末考試答案2024年
- 20G520-1-2鋼吊車梁(6m-9m)2020年合訂本
- 城市綜合安全風(fēng)險監(jiān)測預(yù)警平臺解決方案( PPT)
- (高清版)TDT 1036-2013 土地復(fù)墾質(zhì)量控制標(biāo)準(zhǔn)
評論
0/150
提交評論