




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、C+程序設計(第二版) 第1章 C+基礎知識 程序設計語言是人類在計算機上解決實際問題的一種工具。當一個求解問題能夠用數學模型表達時,人們會考慮用某種程序設計語言將該問題的數學模型表示成計算機可以接受的程序形式,再由計算機自動處理這個程序,生成人們所需要的結果。 1.1 程序設計語言的基本概念1. 面向過程的結構化程序設計語言2. 面向對象的程序設計語言有兩類:一類是完全面向對象的語言,另一類是兼顧面向過程和面向對象的混合式語言。C+語言就是后一種形式的典型代表。 1.2 C+程序的基本結構 1.2.1 C+程序結構 一般來說,C+程序的結構包含聲明區(qū)、函數區(qū)兩個部分,在任何一個區(qū)內都可以隨時
2、插入程序的注釋。 【例1.1】從鍵盤輸入圓的半徑,求圓的面積。程序代碼如下:/*ex1_1.cpp*#include using namespace std;#define PI 3.14159float sum(float x);void main() float r,s; coutr; s=sum(r); coutr=r s= sendl;float sum(float x) return PI*x*x;1聲明區(qū)聲明區(qū)在函數之外。程序的聲明區(qū)可能需要編寫:(1)包含文件,如例1.1中的#include ;(2)宏定義,如例1.1中的#define PI 3.14159;(3)函數聲明,如例
3、1.1中的float sum(float x);(4)條件編譯;(5)全局變量聲明;(6)結構體等的定義;(7)類的定義。2函數區(qū)一個程序由一個主函數main()和多個(可以是0個 )其他函數組成。每個函數都是由函數聲明部分與函數體部分組成。程序的執(zhí)行從main()函數開始。函數聲明部分包括函數返回值類型、函數名、函數的形式參數。函數體部分是用一對花括號括起來的完成該函數所表達的功能的語句的集合。語句可以是數據描述語句或數據操作語句。 任何一種程序設計語言可用下面的模型描述:一種程序設計語言的模型與人類的自然語言模型是一致的,都遵守這種模型。讀者可以借鑒人類自然語言的學習方法來學習某種程序設計
4、語言。1.2.2 C+程序的書寫格式C+程序的書寫格式比較靈活,書寫程序時可以任意換行,一行內可以書寫多條語句,一條語句可以書寫在多行上,只要每條語句以分號(;)結束即可。也因為如此,所以C+程序可讀性差,為了提高程序的可讀性,C+程序的書寫格式有如下約定:(1)C+程序中,每行一般書寫一條語句;語句較短時,多條語句可書寫在一行內。語句較長時,一條語句可寫在多行上。 (2)C+程序中,每條語句以分號結束,表示一條語句的結束,但函數說明行和聲明區(qū)的多數語句后不用分號。語句前面沒有標號,只有goto語句的轉向目標語句前加標號。(3)C+程序中,使用向右縮進方法表達程序中的層次結構,如花括號內的函數
5、體、循環(huán)語句的循環(huán)體、if語句的if體和else體一般都向右縮進幾個字符?;ɡㄌ柺呛瘮刁w或復合語句的定界符。(4)C+程序中,可使用多行注釋或單行注釋以增強程序的可讀性。多行注釋以“/*”開始,以“*/”結束,占據多行。單行注釋以“/”開始,占據一行。1.3 一個應用程序的開發(fā)過程 1.3.1 Visual C+ 6.0開發(fā)環(huán)境 采用Visual C+ 6.0開發(fā)環(huán)境 ;這是一個集編輯、編譯、鏈接、調試運行于一體的集成環(huán)境,即在一個程序的控制下可以分步或一次性地完成編輯、編譯、鏈接、調試運行工作。1.3.2 一個應用程序的開發(fā)過程 1啟動Visual C+ 6.0開發(fā)環(huán)境 2創(chuàng)建工程項目 3打
6、開項目文件 4創(chuàng)建C+源程序文件并添加到項目文件中 5編譯、鏈接與運行程序 在上頁圖中單擊“Compile”按鈕進行編譯,單擊“Build”按鈕進行編譯與鏈接(在沒有編譯的情況下),單擊“Execute Program”按鈕進行編譯、鏈接和運行(在沒有編譯、鏈接的情況下)。例1.1程序所建立的項目的運行結果如下:1.4 C+的詞法規(guī)則 一個程序包含兩個方面的主要內容:數據描述和數據操作。數據是操作的對象,數據的存儲方式決定于該數據的數據類型,描述數據就是定義數據的類型。數據類型的定義表現(xiàn)在常量、變量等的定義之中,而常量、變量又是一種程序設計語言的基本單詞。除了常量、變量之外,一種程序設計語言還
7、有標識符、運算符、關鍵字、分隔符等基本單詞,這些單詞的構成(書寫規(guī)則)都必須遵守該語言的詞法規(guī)則。本節(jié)介紹的就是C+中各種單詞的構詞規(guī)則。請讀者結合前面的語言模型圖學習本節(jié)內容并思考本節(jié)內容屬于語言模型圖的哪個環(huán)節(jié)。由一種語言提供的字符集中的字符構造的單詞必須遵守該語言的詞法規(guī)則。在一種語言中,單詞涉及標識符、關鍵字、運算符、常量、變量、注釋符、分隔符等。C+也不例外。本節(jié)只討論C+中的基本詞法規(guī)則。 1.4.1 C+的字符集組成 C+的字符集包括如下字符:(1)26個小寫字母:az。(2)26個大寫字母:AZ。(3)10個數字:09。(4)標點和特殊字符:+ - * / , : ; ? ”
8、| ! # % & ( ) 空格。(5)空字符:ASCII碼為0的字符,用作字符串的結束符。1.4.2 C+的單詞及其構詞規(guī)則 單詞由若干個合法字符組成,下面介紹常用的單詞。1標識符 標識符是由字母、下畫線和數字組成的字符序列,第一個字母必須是字母或下畫線,不能是數字。標識符中的字母大小寫是不同的。標識符用來命名C+程序中的常量、變量、函數、語句標號及類型定義符等。有一部分標識符是系統(tǒng)定義的。本小節(jié)關心的是用戶定義的標識符。 在定義標識符時,要注意以下幾點:(1)要遵守上面的構成標識符的規(guī)則。Aa、ABC、A_Y、ycx11、_name是合法標識符。而5xyz、m.x、!abc、x-y是非法標
9、識符。(2)系統(tǒng)已經使用的關鍵字、函數名或其他已定義的單詞不能再定義成標識符。(3)定義標識符時盡可能讓標識符有意義,便于閱讀,即做到“見名知義”。 2關鍵字關鍵字(又稱保留字)是被系統(tǒng)定義了的已具有特定含義的標識符。3運算符運算符與操作數連接組成表達式。連接一個操作數的運算符稱為單目運算符,連接兩個操作數的運算符稱為雙目運算符,連接三個操作數的運算符稱為三目運算符。有關運算符的種類、功能、優(yōu)先級和結合性等問題將在1.7節(jié)中詳細介紹。 4常量常量是在程序中不改變的量。C+程序中的常量有:整型常量、浮點型常量、字符常量和字符串常量4種。將在1.6節(jié)中詳細介紹。5變量變量是在程序中可以改變的量。變
10、量有三要素:名字、類型和值。某個變量的值被改變后,將一直保持到下一次被改變。變量是一種標識符,其命名完全與標識符相同。將在1.6節(jié)中詳細介紹其特性。 6注釋符注釋符的作用是在程序中標識注釋信息。在C+程序中,可使用多行注釋或單行注釋增強程序的可讀性。多行注釋以“/*”開始,以“*/”結束,占據多行。單行注釋以“/”開始,占據一行?!?*”、“*/”、“/”就是注釋符。7分隔符分隔符有:空格符、換行符、水平制表符等,用作其他單詞之間的分隔符;逗號(,),多作多個變量或多個參數之間的分隔符;分號(;),主要用于for語句的for關鍵字后的圓括號內,作分隔符;冒號(:),用來標識語句標號和開關語句,
11、常用于switch的case關鍵字后。 1.5 C+基本數據類型 表1-2 C+基本數據類型基本型(int)短整型(short)長整型(long)無符號整型(unsigned int)無符號短整型(unsigned short int)無符號長整型(unsigned long int)有符號整型(signed int)有符號短整型(signed short int)有符號長整型(signed long int)字符型(char)單精度浮點型(float)雙精度浮點型(double)長雙精度浮點型(long double)4244244241488-2 147 483 6482 147 483
12、647-32 76832 767-2 147 483 6482 147 483 64704 294 967 295065 53504 294 967 295-2 147 483 6482 147 483 647-32 76832 767-2 147 483 6482 147 483 6470255-3.410383.41038-1.7103081.710308-1.7103081.710308數 據 類 型字節(jié)數數據表達范圍1.6 常量與變量 常量與變量是C+中最基本的數據描述形式。本節(jié)只介紹常量和變量的基本概念,包括4種常量和基本數據類型的變量。關于構造類型的變量將在后續(xù)章節(jié)中介紹。 1.6
13、.1 常量常量是在程序中不改變的量。C+程序中有4種常量:整型常量、浮點型常量、字符常量和字符串常量。 1整型常量C+程序中,整型常量和浮點常量統(tǒng)稱數值常量。整型常量有三種形式:十進制、八進制和十六進制。十進制常量的寫法就是算術表達方式,如12、345都是合法的十進制常量。八進制常量在數值前要加上一個零(0),如011、077都是合法的八進制常量。十六進制常量的寫法是在數值前加上一個零(0)和一個字母X(大小寫均可),如0X11、0 xF都是合法的十六進制常量,分別等于十進制數17和15。 2浮點型常量浮點型常量又稱實數型常量。分為十進制數形式和指數形式兩種表示方法。(1)十進制數形式的浮點型
14、常量的書寫格式:.其中小數點不能省略。如1.2345、1.0、1.、.12345均是合法的浮點型常量。(2)指數形式的浮點型常量的書寫格式:.E其中,指數形式表示符“E”大小寫均可。.部分允許不含小數點的,或含小數點的,必須是整數。如12E-3、0.1E2、.12345E6、0E0等均是合法的。 【例1.2】浮點型常量的運用。程序代碼如下:/*ex1_2.cpp*#include #include using namespace std;void main() int x=77; float a; double b; long double c; a=88.123000000000000000
15、00f; b=-1.69901234567890123456789e308; c=-1.69901234567890123456789e308; coutx=xendl; couta=setprecision(7)aendl; couta=setiosflags(ios:scientific)aendl; coutsetprecision(20)b=b; couttc=cendl;程序的運行結果如下:3字符常量字符常量是一個用單引號括起來的字符。單引號是字符常量的定界符,單引號本身表示成。在C+中,字符常量具有整數值,其值是該字符的ASCII碼。一個字符常量可以與整數進行加減運算。下面的程序給
16、出了字符與整數進行加減運算的實例。【例1.3】字符常量的運用。程序代碼如下:/*ex1_3.cpp*#include #include Using namespace std;void main() char a,b,c,d; a=A; b=B; c=a+3; d=; coutatbtcendl; couthexint(a)tint(b)tint(c)endl; coutdendl; 程序的運行結果如下: ABD 414244 4字符串常量字符串常量是用雙引號括起來的若干個字符組成的字符序列。雙引號是字符串常量的定界符,雙引號本身表示成“”。“”是一個空字符串,空字符串中沒有任何有效字符,只有
17、一個字符串結束符。在C+程序中,任何一個字符串常量都有一個結束符,該結束符是ASCII碼值為0的空字符,表示為0。字符常量與字符串常量是不同的,表現(xiàn)在:(1)表示形式不同。前者用單引號括起來,后者用雙引號括起來。(2)存放它們的對象不同。前者存放在字符變量中,后者存放在字符數組或字符指針指定的位置。如,char c=A, s5=ABCD;(3)存放字符串常量時要加一個結束符,而存放字符常量則不需要。所以A與“A”不同。且其占用的內存空間也不同,A占1個字節(jié);“A”占2個字節(jié),前一字節(jié)存放字符A,后一字節(jié)存放結束符。(4)對它們進行的運算也不同。字符與字符、字符與整數間可作加減運算;而字符串只能
18、作連接運算。 【例1.4】字符串常量的運用。程序代碼如下:/*ex1_4.cpp*#include using namespace std;void main() char s180,s280; couts1s2; couts1ts2endl;程序的運行結果如下:5符號常量符號常量是一個用來替代常量(前面討論的4種常量)的標識符。這個標識符當然叫符號常量。(1)增強程序的可讀性。標識符可以定義得有意義,如用PI表示圓周率。(2)書寫簡單,不易出錯。有的常量直接書寫很長,容易出錯,如圓周率3.141 592 6用PI代之,既簡單又不容易出錯。(3)修改程序方便。 例如:#define PI 3.
19、1415926#define SIZE 100 1.6.2 變量 變量是在程序中可以改變的量,變量有名字、類型和值三個要素。變量的類型包括存儲類和數據類型兩個方面。某個變量的值被改變后,將一直保持到下一次被改變。 1變量的定義變量在使用前必須定義。格式如下: ;例如:int a,b,c; a、b、c為整型變量;缺省存儲類,要看是定義在函數體內還是函數體外來確定是自動類還是外部類;static double x,y10; x、y是靜態(tài)雙精度變量,y是數組2變量的數據類型變量的基本數據類型有:整型、浮點型和字符型。變量的構造數據類型稱自定義類型。它由若干個數據類型相同或不相同的變量所構成的類型。如
20、數組、結構體、共用體、類都是構造數據類型。3變量的存儲類變量的存儲類定義變量的有效性范圍,即作用域。C+中有4類:自動存儲類(auto)、寄存器存儲類(register)、靜態(tài)存儲類(static)和外部存儲類(extern)。 (1)自動存儲類某一變量定義成自動存儲類后,其作用域在定義它的函數體或分程序內,自動存儲類變量只能定義在函數體或分程序內。變量的生存期在作用域內,即執(zhí)行完定義它的函數后,該變量即被釋放。這類變量的安全性最好,在不同的函數中可以定義相同名字的變量,互不影響。在函數體內定義自動存儲類變量時可以省去說明符auto。前面程序中定義的變量都省去了存儲類說明符auto,它們都是自
21、動存儲類變量。 (2)寄存器存儲類寄存器存儲類的變量與自動存儲類的變量有相同的作用域和生存期。定義這類變量必須加存儲類說明符register,并且只能定義在函數體或分程序內。這類變量有可能被存放在CPU的空閑通用寄存器中,當CPU中沒有空閑通用寄存器時,當作自動存儲類變量。一旦變量存入CPU的寄存器中,則變量的訪問效率將大大提高,這是因為訪問內存比訪問CPU寄存器花的時間長得多。 (3)靜態(tài)存儲類靜態(tài)存儲類分為內部靜態(tài)存儲類和外部靜態(tài)存儲類。內部靜態(tài)存儲類變量定義在函數體或分程序內,其作用域在定義它(們)的函數體或分程序內。而外部靜態(tài)存儲類變量定義在函數體或分程序外,其作用域在定義它(們)的文
22、件內,可見兩者的作用域是不同的。內部靜態(tài)存儲類和外部靜態(tài)存儲類變量有相同的生存期,都被存放在內存的靜態(tài)區(qū)域,靜態(tài)變量在程序結束時才釋放內存。要定義靜態(tài)存儲類變量,必須加存儲類說明符static。 (4)外部存儲類外部存儲類變量的作用域是整個程序,包含該程序的各個文件。生存期是整個程序,在程序結束時才釋放內存。 表1-2 各種存儲類特性的比較存 儲 類 別自動類寄存器類內部靜態(tài)類外部靜態(tài)類靜態(tài)類外部類或分程序內在定義它的文件內程序的各個文件程序結束前有效離開定義體即消失存取速度快安全性好在定義它的函數體安全性差同自動類作 用 域生 存 期其 他外部存儲類變量可以定義在函數體內、外,定義在函數體外
23、時可以不加存儲類說明符,但在說明一個外部存儲類變量時,必須加存儲類說明符extern。有如下兩種情況要在引用外部存儲類變量前,對其進行說明。 在一個文件中,在定義前引用外部存儲類變量必須說明。 在多個文件的程序中,在一個文件中定義,在另一個文件中引用,引用前要說明。 【例1.5】定義在前、引用在后的外部存儲類變量(輸出結果與例1.4類似)。程序代碼如下:/*ex1_5.cpp*#include using namespace std;char s180, s280;void main() couts1s2; couts1ts2endl;【例1.6】定義在后、引用在前的外部存儲類變量(輸出結果與
24、例1.4類似)。程序代碼如下:/*ex1_6.cpp*#include using namespace std;void main() extern char s180, s280;/說明外部存儲類變量 couts1s2; couts1ts2endl; char s180, s280;4變量的值變量的值是變量三要素之一。可以在定義變量時對變量賦初值(變量初始化),也可以在引用變量時通過其他方法(賦值表達式、cin、scanf函數等)對變量賦值。變量初始化格式:=,=,;如果外部類和靜態(tài)類變量不進行初始化,那么它們由編譯程序賦以“零值”(數值型變量賦數值0,字符型變量賦空字符)。如果自動類和寄存
25、器類變量不進行初始化,那么它們不具有有意義的值,必須通過賦值后才能引用。外部類和靜態(tài)類變量初始化是在編譯時給定的。即在第一次執(zhí)行定義或說明時給定,以后進入所定義的函數體或分程序不再賦初值。而自動類和寄存器類變量的初始化是在每次進入函數體或分程序時重新定義初值。 可見,變量有定義和引用兩個方面。變量的定義涉及變量名稱、存儲類和數據類型。引用即使用,通常先定義,后使用。例1.6是特例,但在使用前必須說明。引用一個變量,其值是否有意義是一個重要的問題。如在一個函數內定義內部靜態(tài)存儲類的變量,離開這個函數后,雖然變量仍然存在,但它的值可能無效了,所以不能引用。下面是一些合法的定義:int a=1,b=
26、2,c=3;static char xyz=A,buffer10=Hello;double a5=1.12345,2.23456,3.34567,4.45678,5.56789float s=1+2+3;關于在引用變量時通過賦值表達式、cin、scanf函數等方式對變量賦值,在前面的實例中已大量使用。值得一提的是賦值表達式,在下面的程序段中: int a; a=12;“a=12”是一個賦值表達式。C+允許表達式當作語句使用,其后要加分號,所以“a=12;”是賦值表達式語句?!癮=12”這個表達式有雙重意義:表達式“a=12”具有12的值,另外表達式“a=12”的副作用使變量a具有12的值。給變
27、量賦值正是利用了這種副作用。這是C+與其他高級程序設計語言不同的地方,其他語言稱“a=12”是賦值語句。 1.7 運算符與表達式 C+的表達式包括算術表達式、關系表達式、邏輯表達式、賦值表達式、條件表達式和逗號表達式。C+的類型轉換包含隱含轉換和強制轉換兩種方法。任何表達式后加“;”構成表達式語句。 1.7.1 算術運算符與算術表達式 1算術運算符算術運算符有:(1)單目運算符:-(取負)、+(增1)、-(減1)。 (2)雙目運算符:+(加)、-(減)、*(乘)、/(除)、%(取余)。 單目運算符的優(yōu)先級高于雙目運算符的優(yōu)先級,雙目運算符中的 *、/、% 的優(yōu)先級高于 +、- 的優(yōu)先級。+(增
28、1)運算可寫在變量前或變量后,分別稱作前綴運算和后綴運算。如果定義一個變量i,前綴運算記為:+i,后綴運算記為:i+。這樣形成了前綴運算表達式+i和后綴運算表達式i+,在C+中,兩個表達式都對變量i進行增1運算,這是此兩類表達式的副作用。但把兩個表達式分別賦給變量a和b時,則a和b取不同的結果(見例1.7和例1.8)。 【例1.7】前綴,后綴運算表達式的運用。程序代碼如下:/*ex1_7.cpp*#include using namespace std;void main() int i=10, a, b, j=i+10, x, y;/初值可以是包含有值的變量的表達式 a=+i; couta=
29、ati=iendl;/注意本行語句與下行語句的位置 b=i+; coutb=bti=iendl; x=-j; coutx=xtj=jendl; y=j-; couty=ytj=jendl; 程序的運行結果如下:取余運算只能用于兩個整型數的運算。功能是求兩個整型數相除的余數。用下面的公式:余數=被除數-商除數注意:5%-3=2,而-5%3=-2?!纠?.8】取余運算。程序代碼如下:/*ex1_8.cpp*#include using namespace std;void main() int a,b; a=5%-3; b=-5%3; couta=atb=b(大于)=(大于等于)=(等于)!=(不
30、等于)前4個關系運算符的優(yōu)先級高于后2個。 關系運算符是雙目運算符。一個關系運算符的兩邊都需要操作數,操作數是算術表達式。關系運算的結果在C+中是整型值,關系成立時,結果為1,否則為0。在這一點上與其他程序語言不同,其他程序語言的關系表達式值是邏輯值。C+關系表達式的值可以參與整型運算。關系運算的結合性是從左至右。 2關系表達式關系表達式是由關系運算符把算術表達式連接起來的式子。它在C+程序中通常用作條件。使用關系表達式應注意兩個問題:(1)關系表達式的值為整型數據。 (2)在數學中,y0時,表達式“x+yx”是永真的。但在用計算機語言判斷關系表達式“x+yx”時,可能會得出不真的結論。這種情
31、況往往出現(xiàn)在x和y兩個數差別很大,一個很大,另一個則小到了語言表達精度以下,以致這個很小的數對相加結果不產生影響。 【例1.9】關系表達式的運用。程序代碼如下:/*ex1_9.cpp*#define EPS 1.0E-16#include using namespace std;void main() double x, y; bool z; x=5.0; y=EPS; z=x+yx; coutx=xty=ytz=zendl;程序的運行結果如下:1.7.3 邏輯運算符與邏輯表達式1邏輯運算符在C+中,邏輯運算符有以下幾種:!:邏輯求反(又稱邏輯非,單目運算符)&:邏輯與(雙目運算符)|:邏輯或
32、(雙目運算符)邏輯運算符的優(yōu)先級從高到低依次是: !、&、|。邏輯運算符的結合性是從左至右(單目除外)。 2邏輯表達式邏輯表達式是由邏輯運算符與操作數組成的式子。C+規(guī)定:邏輯表達式中非0的操作數為真,0操作數為假。這說明C+的邏輯運算符的操作數可以是算術表達式、關系表達式、邏輯表達式。這與其他程序語言不同。邏輯運算的結果為真時用1表示,為假時用0表示。邏輯運算結果的類型也是整型。【例1.10】邏輯表達式的運用。程序代碼如下:/*ex1_10.cpp*#include using namespace std;void main() int a, b, c, d; bool e; a=5; b=
33、0; c=!b; d=a&b; e=a|b; coutatbtctdte:右移位運算符:左移位運算符都是雙目運算符,優(yōu)先級相同,高于邏輯位運算符優(yōu)先級。移位運算符左邊是要移位的操作數,右邊是要移位的位數。移位運算表達式寫為:或:右移位操作是將操作數化成二進制數,將操作數右移指定位數,移出的二進制位丟棄,左邊補0或符號位(根據編譯決定)。左移位操作是將操作數化成二進制數,將操作數左移指定位數,移出的二進制位丟棄,右邊補0。【例1.11】邏輯位運算和移位運算。程序代碼如下:/*ex1_11.cpp*#include using namespace std;void main() int a, b;
34、 a=13; b=8; couta=ata=aendl; couta&b=(a&b)endl; coutab=(ab)endl; couta|b=(a|b)endl; cout2=2)endl; couta2=(a2)endl; cout2=2)endl;程序的運行結果如下: 1.7.5 賦值運算符與賦值表達式1賦值運算符賦值運算符有11種,均為雙目運算符,優(yōu)先級僅高于逗號運算符,結合性是從右至左。11種賦值運算符中有1個基本賦值運算符,10個復合賦值運算符,分別為:(1)=:基本賦值運算符(2)+=:加賦值運算符(3)-=:減賦值運算符(4)*=:乘賦值運算符(5)/=:除賦值運算符(6)%
35、=:取余賦值運算符(7)&=:位與賦值運算符(8)=:位異或賦值運算符(9)|=:位或賦值運算符(10)=:位右移賦值運算符2賦值表達式賦值表達式是由賦值運算符與操作數組成的式子。對應11種賦值運算符有相應的11種賦值表達式。先介紹基本賦值表達式,書寫為:=上句在C+中稱賦值表達式。在C+中允許表達式構成語句,只要在賦值表達式后面加上“;”,即:=;賦值表達式執(zhí)行的結果使賦值表達式本身具有一個值,就是賦值運算符(=)右邊表達式的值。還有一個副作用:使賦值運算符(=)左邊的變量具有右邊表達式的值。前面的所有實例中出現(xiàn)的賦值表達式正是利用這種副作用對變量賦值。可以通過下面的實例理解賦值表達式具有值
36、這一概念。【例1.12】賦值表達式的值及其副作用。程序代碼如下:/*ex1_12.cpp*#include using namespace std;void main() int c=1, a, b; coutc=cendl; a=b=c=10; couta=atb=btc=c ta=b=c=10=(a=b=c=10)endl; couta+=2=(a+=2)endl; a+=a; couta=aendl;程序的運行結果如下:其他復合賦值運算符組成復合賦值表達式的形式類似基本賦值表達式,表達形式如下: += 等價于 =+-= 等價于 =-*= 等價于 =*/= 等價于 =/%= 等價于 =%&
37、= 等價于 =&= 等價于 =|= 等價于 =|=等價于 =等價于 =復合賦值表達式比基本賦值表達式書寫簡單、編譯時生成的目標代碼少,因而運行效率高。 使用賦值表達式應注意以下問題:(1)可以使用賦值表達式連續(xù)賦值。例如:int a,b,c;a=b=c=1;表達式a=b=c=1使3個變量均擁有值1。由于賦值運算符的結合性是從右至左,所以變量c和表達式c=1先擁有值1,然后變量b和表達式b=c=1擁有值1,最后才是變量a和表達式a=b=c=1擁有值1。(2)使用賦值表達式多用來改變變量的值,賦值表達式本身的值用得少。在賦值表達式中,賦值運算符左邊的變量稱左值,右邊的表達式稱右值。計算時,先計算右
38、值,再轉換其類型為與左值相同的類型,將右值賦給左值,同時賦值表達式具有右值的值。右值類型轉換過程是自動完成的,但轉換時有數據精度損失。 1.7.6 三目運算符與三目條件表達式在C+中只有一個三目運算符?:,三目條件表達式格式如下:?:先計算,當非0時,三目條件表達式取的值,否則取的值。三目條件表達式的功能可以解釋成一個簡單的條件語句(參見第2章)。三目運算符 ?: 的結合性是從右至左?!纠?.13】三目條件表達式的運用。程序代碼如下:/*ex1_13.cpp*#include using namespace std;void main() int a=1,b=2,c=3; coutab?a:b
39、 = (ab?a:b)endl; coutb?b-:+a = b?b-:+a)endl; coutb?+a:+b = b?+a:+b)endl; coutb?a:bc?b:c = b?a:bc?b:c)endl;程序的運行結果如下: ab?b-:+a = 2 c+=ab?+a:+b = 6 ab?a:bc?b:c = 6 程序中有4個cout語句,第1個cout語句輸出三目條件表達式的值,顯然是1。在第2個cout語句中,三目條件表達式的值取+a的值,結果是2。因為ab為0,b-并沒有執(zhí)行,故b的值仍然是2。第2個cout語句已修改了變量a的值,使a=2。在第3個cout語句中,由于三目運算符
40、的優(yōu)先級高于賦值運算符,所以先計算三目條件表達式ab?+a:+b,由于ab為0,所以三目條件表達式取+b的值,結果是3;再計算賦值表達式c+=3,結果是6。此行cout語句修改了b、c兩變量的值,使b=3、c=6。在第4個cout語句中,由于三目運算符是從右結合的,所以先計算bc?b:c,結果為6;再計算ab?a:6,結果為6。 1.7.7 逗號運算符與逗號表達式逗號在C+中可以作為分隔符或運算符。逗號運算符為雙目運算符,它的優(yōu)先級最低,結合性是從左至右。逗號運算符用來連接兩個或兩個以上的表達式,形成逗號表達式。計算逗號表達式時,從左至右依次計算各個表達式,逗號表達式的值取最后一個表達式的值。
41、多用在for循環(huán)語句的for關鍵字后的圓括號內,圓括號內由分號分隔的表達式可以是逗號表達式。注意例1.15中倒數第二行的輸出結果。 【例1.14】逗號表達式的運用。程序代碼如下:/*ex1_14.cpp*#include using namespace std;void main() int a=1, b=2, c=3; couta=atb=btc=cendl; c=(a=10, b=a*2, b*2); couta=atb=btc=cendl; couta,b,c,c*3= (a,b,c,c*3):用于結構體、共用體變量。(4)sizeof:計算一數據類型或一表達式占用內存的字節(jié)數。例如,s
42、izeof(int) 或 sizeof()(5)強制類型:作用于一表達式,使表達式的類型強制性轉換為指定類型。例如,(int)(a+b+1.234567)C+的優(yōu)先級和結合性比較復雜,通過下面的總結,可以記?。撼罡呒壓妥畹图壨?,其他運算符的優(yōu)先級是“一二三賦值”。最高級是圓括號、下標、點、箭頭;最低級是逗號。“一二三賦值”分別指單目、雙目、三目、賦值運算符,它們的優(yōu)先級也是按此順序。這樣分出了6大類優(yōu)先級。在雙目運算符中,有10級,順序是:算術(除求負值運算外分2級)、移位、關系(分2級)、邏輯位(除按位取反運算外分3級)、邏輯(除邏輯非運算外分2級)。單目、三目、賦值運算符的結合性是從右至
43、左,其他運算符的結合性是從左至右。 【例1.15】運算符的優(yōu)先級和結合性。程序代碼如下:/*ex1_15.cpp*#include using namespace std;void main() int x,y,z; x=!-5+312; y=x-(-1); coutx=xty=yendl; z=xy?x-y?x:y:x*y; coutsizeof(int)=sizeof(int) tsizeof(z)=sizeof(z)endl; coutx=xty=ytz=z2;的計算順序是:第一步先計算單目運算,單目運算有兩個: !和-,按從右至左的結合性,先計算-5,再計算 !(-5),結果為0;第二
44、步計算算術運算0+31;第三步計算右移運算,結果為7,即x=7。語句y=x-(-1);中間有三個-,前兩個是減1單目運算,后一個是算術減運算。計算順序是:第一步計算x-,使x=6,這是減1表達式的副作用,并不計算在y=x-(-1);語句中,所以語句y=x-(-1);變?yōu)閥=7-(-1),結果使y=8。這時要注意x的值因為副作用發(fā)生了變化,即x=6。所以在第一條cout語句輸出時x=6、y=8。 語句z=xy?x-y?x:y:x*y;中有單目運算,先計算之,-y的結果表明為7,故語句變成z=xy?x7?x:y:x*y;,語句中有兩個三目表達式,三目表達式中的“?”和“:”分別相當于前圓括號“(”
45、和后圓括號“)”,成對出現(xiàn)。按從右至左的結合性,先找最右邊的“?”,再找與之最近匹配的“:”,得其表達式為:x7?x:y,結果取x的值6。從而整個語句變成z=xy?6:x*y;,所以z=6。在這條語句中,x的值沒改變,y的值變?yōu)?,故在第三條cout語句輸出時x=6、y=7、z=6。1.7.10 類型轉換C+的數據類型轉換靈活,表現(xiàn)在它的許多數據類型之間具有自動(隱含)轉換功能,當然也可以使用強制類型轉換功能。(1)隱含自動轉換,從低類型向高類型轉換char型和short型自動轉換為int型;unsigned char型和unsigned short型自動轉換為unsigned型;float型
46、自動轉換為double型。 (2)在各類數值型數據進行混合運算時,系統(tǒng)自動將參與運算的各類數據類型轉換為它們之間數據類型最高的類型。在C+中,數據類型從低到高的類型順序為:int (short,char)unsigned(unsigned short,unsigned char)longdouble(float)(3)在賦值表達式中,系統(tǒng)自動將賦值運算符右邊的表達式的數據類型轉換為左邊變量的類型。在這種轉換中,從低類型向高類型的轉換是保值的,從高類型向低類型的轉換是不保值的(即轉換有數據精度損失)。 (4)強制轉換格式是:()使表達式的類型強制轉換成說明的數據類型。強制轉換可能是不保值的。強制
47、轉換是一次性的,例如:int x=1,y=2,z=3;coutsizeof(double)(x*y*z); 第二行語句中,表達式強制為double型,下次再出現(xiàn)表達式x*y*z時,又是整型。 【例1.16】類型轉換。程序代碼如下:/*ex1_16.cpp*#include using namespace std;void main() int x=1,y=2,z=3; double x1=1.234567; double y1; cout混合表達式占用字節(jié)數:sizeof(x+y+z+x1)endl; cout賦值表達式占用字節(jié)數:sizeof(y1=x+y+z+A)endl; cout強制成
48、int型占用字節(jié)數:sizeof(int)(x1*2)endl; coutx1*2= x1*2endl; coutsizeof(x1*2)=sizeof(x1*2)endl; cout強制成int型后,x1*2=(int)(x1*2)endl;程序的運行結果如下:混合表達式占用字節(jié)數:8賦值表達式占用字節(jié)數:8強制成int型占用字節(jié)數:4x1*2=2.46913sizeof(x1*2)=8強制成int型后,x1*2=2C+程序設計(第二版) 106第2章 程序控制結構2.1 順序結構 2.2 選擇結構 2.3 循環(huán)結構 2.4 控制轉向語句 2.5 程序實例 107按照語句出現(xiàn)的先后順序依次執(zhí)
49、行。2.1 順序結構 語句1語句2圖2.1 順序結構流程圖1082.1.1 定義語句說明語句在C+程序中,一個標識符(變量名、常量名、函數名、對象名等)在使用之前必須先定義,通知編譯器為其分配存儲空間,或告訴編譯器它的存在及其特征。例如:int x=1,y=2;const double PI=3.14159;float score303;1092.1.2 表達式語句形式: ;可以進行的操作通常包括賦值操作,復合賦值操作,增量、減量操作,函數調用操作和輸入輸出操作。例如:n+;-m;abs(x);cinxy;coutx+y;s=x+y;m=n=t;a=10,b=20;z*=w;1102.1.3
50、復合語句形式: 作用:當程序中某個位置在語法上只允許一條語句,而在語義上要執(zhí)行多條語句才能完成某個操作時,需要使用復合語句。例如:if(x=0) couta; coutb; 1112.1.4 空語句形式: ; 作用: 當程序中某個位置在語法上需要一條語句,而在語義上又不 要求執(zhí)行任何動作時,可放上一條空語句。一般適用于在循環(huán)語句中做空循環(huán)體例如: for (m = 0; m1000; m+) ;1122.1.5 基本輸入輸出在C+中,所有輸入輸出是通過輸入輸出流來實現(xiàn)的。在C+中,將數據從一個對象到另一個對象的流動抽象為“流”。在iostream庫中包含一個標準輸入流對象cin和一個標準輸出流
51、對象cout,分別用來實現(xiàn)從鍵盤讀取數據,以及將數據在屏幕上輸出。要使用cin和cout,需要在C+程序開頭加上如下包含命令:#include / 新標準中的頭文件名using namespace std; / 引入std名字空間中的標識符1131. 標準輸入流cincin負責從鍵盤讀取數據,使用提取運算符“”就可以將鍵盤鍵入的數據讀入到變量中。語法格式: cin變量1變量2變量n; 變量可以是任意數據類型,輸入時各個數據之間用空格鍵、Tab鍵或Enter鍵分隔。 例如:int x,y;cinxy;鍵盤上輸入:58x5鍵盤y8鍵盤1142. 標準輸出流cout負責將數據輸出到屏幕上,使用插入運
52、算符“”就可以將數據顯示在屏幕上當前光標所在位置。語法格式: cout表達式1表達式2表達式n; 表達式可以是任意類型的,數據輸出的格式由系統(tǒng)自動決定。115格式控制符說明示例語句結果endl輸出換行符cout123endl456;123456dec整數按十進制輸出coutdec18;18hex整數按十六進制輸出couthex18;12oct整數按八進制輸出coutoct18;22setw(int n)設置數據輸出的寬度coutasetw(3)b;a b(中間有2個空格)116格式控制符說明示例語句結果setfill(char c)設置填充字符coutsetfill(#)setw(6)123;
53、#123setprecision(int n)設置浮點數的精度(有效數字位數或小數位數)coutsetprecision(5)63.3156;63.316setiosflags(ios:fixed)定點格式輸出coutsetiosflags(ios:fixed) 32.1456789;32.145679setiosflags(ios:scientific)指數格式輸出coutsetiosflags(ios:scientific) 72.3456789;7.234568e+001117【例2.1】 cout應用示例#include using namespace std;int main() i
54、nt x=12,y=83; double pai_1=3.14159265; float pai_2=3.141f; char ch1=a,ch2=b; bool ok=true; coutx=xendl; couty=yendl; coutpai_1=pai_1,pai_2=pai_2endl; coutch1=ch1,ch2=ch2endl; coutok=okendl; cout!ok=!okendl; return 0;x=12y=83pai_1=3.14159,pai_2=3.141ch1=a,ch2=bok=1!ok=0118【例2.2】 使用格式控制符輸出數據#include #
55、include using namespace std;int main()int a=35; double b=21.3456789; cout1234567890123endl; coutdeca hexa octaendl; coutbendl; coutsetprecision(4)bendl; coutsetw(10)bendl; coutsetw(10)setfill(*)bendl; coutsetiosflags(ios:scientific)bendl; coutsetprecision(3)bendl; coutsetprecision(2)bb,則將a、b交換,否則不交換
56、。兩數交換可采用借助于第三個變量間接交換的方法 if(ab)t=a;a=b;b=t;122#include using namespace std;int main()int a,b,t;cout請輸入兩個整數a,b:ab; if(ab)t=a;a=b;b=t; coutabendl; return 0;a=a+b;b=a-b;a=a-b; 請輸入兩個整數a,b:85 404085a=ab;b=ab;a=ab; 1232if- else語句(雙分支) if(表達式) 語句1 else 語句2true表達式語句1false語句2雙分支if語句流程圖124【例2.4】輸入一個年份,判斷是否為閏年。
57、分析 閏年的年份可以被4整除而不能被100整除,或者能被400整除。 #include using namespace std;int main()int year;coutyear;if(year%4=0 & year%100 !=0)|(year%400=0) coutyear年是閏年endl;else coutyear年不是閏年endl; return 0;1253if- else if 語句(多分支)if(表達式1) 語句1 else if(表達式2) 語句2 else if (表達式n) 語句n else 語句n+1falsefalsefalsetruetrue表達式1表達式2表達式
58、n語句n語句n+1語句2語句1true126【例2.5】根據x的值,計算分段函數y的值。y的計算公式為:(x0)(0 x15)(15x30)(x30)127#include #include using namespace std;int main() double x,y; coutx; if(x0) y=fabs(x); else if(x15) y=exp(x)*cos(x); else if(x30) y=pow(x,5); else y=(7+9*x)*log(x); couty=y0) if(y0) coutx與y均大于0; else coutx大于0,y小于等于0;注意:如何使之
59、與第一個if配對?130【例2.6】從鍵盤上輸入兩個字符,比較其大小,輸出大于、等于和小于的判斷結果。#include using namespace std;int main()char ch1,ch2;coutch1ch2;if(ch1!=ch2) if(ch1ch2) coutch1大于ch2endl; else coutch1小于ch2endl;elsecoutch1等于ch2endl; return 0;請輸入兩個字符:h dh大于d請輸入兩個字符:X YX小于Y請輸入兩個字符:& &等于&1312.2.2 switch語句switch (表達式) case 常量表達式1: 語句1
60、case 常量表達式2: 語句2 case 常量表達式n: 語句n default: 語句序列n+1 注意:表達式只能是整型、字符型或枚舉型注意:常量表達式1n的值必須各不相同。132有無無false有無falsetrue計算表達式的值常量表達式1語句1break常量表達式2語句2break無有false常量表達式ntrue語句nbreakdefault語句n+1true有switch語句執(zhí)行流程133【例2.7】將輸入的百分制成績按以下規(guī)定轉換成相應的等級: 成 績 等級10090 優(yōu)秀 8980 良好 7970 中等 6960 及格 590 不及格 134#include using na
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工會競爭游戲活動方案
- 平鄉(xiāng)三中教師活動方案
- 平安產險專場活動方案
- 工會游泳訓練活動方案
- 小學生植樹活動方案
- 師傅充值活動策劃方案
- 小學知識進校園活動方案
- 展會清倉活動方案
- 小店美甲店活動方案
- 少兒賽事活動方案
- 2022年廣東高考成績一分一段表重磅出爐
- 新版病人搬運(輪椅)操作評分標準
- 重癥監(jiān)護ICU護理實習生出科考試試題及答案
- GB/Z 22074-2008塑料外殼式斷路器可靠性試驗方法
- GB/T 32360-2015超濾膜測試方法
- GB/T 15558.1-2015燃氣用埋地聚乙烯(PE)管道系統(tǒng)第1部分:管材
- 中藥學全套(完整版)課件
- 工程施工停止點檢查表
- 國開??啤锻鈬膶W》十年期末考試題庫及答案
- 《滅火器維修》GA95-2015(全文)
- 浙江義務教育學校校園飲水質量提升工程建設和維護浙江教育廳
評論
0/150
提交評論