C語言程序設(shè)計(jì)課件:編寫C程序的基礎(chǔ)知識(shí)_第1頁
C語言程序設(shè)計(jì)課件:編寫C程序的基礎(chǔ)知識(shí)_第2頁
C語言程序設(shè)計(jì)課件:編寫C程序的基礎(chǔ)知識(shí)_第3頁
C語言程序設(shè)計(jì)課件:編寫C程序的基礎(chǔ)知識(shí)_第4頁
C語言程序設(shè)計(jì)課件:編寫C程序的基礎(chǔ)知識(shí)_第5頁
已閱讀5頁,還剩158頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

編寫C程序的基礎(chǔ)知識(shí)1.1C程序的編寫、調(diào)試和運(yùn)行1.2算法1.3程序中的數(shù)據(jù)1.4常用表達(dá)式和運(yùn)算符 1.1C程序的編寫、調(diào)試和運(yùn)行

1.1.1C程序的結(jié)構(gòu)

1.?C語言程序的結(jié)構(gòu)分析

在使用C語言編寫程序時(shí),必須按其規(guī)定的格式進(jìn)行編寫。下面從幾個(gè)簡(jiǎn)單的C語言程序入手,分析C語言程序的結(jié)構(gòu)特點(diǎn)和書寫格式。圖1-1例1-1程序運(yùn)行結(jié)果

程序分析如下:

(1)這是一個(gè)完整的C程序,包含一個(gè)main函數(shù)(也稱為主函數(shù))。

(2)“main()”為主函數(shù)的函數(shù)首部,隨后的“{……}”為主函數(shù)的函數(shù)體。

(3)該程序中只有一條語句“printf(”Hello,world!\n“);”,該語句能夠在屏幕上輸出“Hello,world!”,語句以分號(hào)“;”為結(jié)束符。

(4)“/*……*/”是對(duì)程序起到說明作用的注釋部分,程序執(zhí)行時(shí)并不執(zhí)行注釋部分。

(5)“#include<stdio.h>”是編譯預(yù)處理命令。printf是系統(tǒng)提供的標(biāo)準(zhǔn)庫函數(shù)之一,使用這些函數(shù)時(shí),應(yīng)該在程序開始處使用編譯預(yù)處理命令,將相應(yīng)的頭文件包含進(jìn)來。常用的系統(tǒng)標(biāo)準(zhǔn)庫函數(shù)及對(duì)應(yīng)的頭文件見附錄D。圖1-2例1-2程序運(yùn)行結(jié)果程序分析如下:

(1)函數(shù)體由聲明部分(也稱為定義部分)和執(zhí)行部分組成。

(2)聲明部分是函數(shù)體中使用的變量定義及某些函數(shù)的聲明。

(3)執(zhí)行部分由語句構(gòu)成,用來完成函數(shù)所要實(shí)現(xiàn)的功能。圖1-3例1-3程序運(yùn)行結(jié)果

程序分析如下:

(1)該程序由主函數(shù)main及函數(shù)名為hello、star的函數(shù)組成。

(2)在主函數(shù)main中使用到了hello、star函數(shù),我們稱之為調(diào)用。關(guān)于函數(shù)的具體知識(shí)將在第5單元進(jìn)行詳細(xì)介紹。

2.?C語言程序的結(jié)構(gòu)特點(diǎn)

從上面的例子可以總結(jié)出C程序結(jié)構(gòu)的主要特點(diǎn):

(1)函數(shù)是組成C語言程序的基本單元。編寫C程序其實(shí)就是定義一個(gè)個(gè)函數(shù)。函數(shù)構(gòu)成如圖1-4所示。圖1-4函數(shù)構(gòu)成

(2)一個(gè)C程序中有且僅有一個(gè)主函數(shù)即main函數(shù),可以沒有或有多個(gè)其他函數(shù)。主函數(shù)的位置沒有特別要求,只要不嵌套定義在其他函數(shù)內(nèi)部。

(3)一個(gè)C程序總是從main函數(shù)開始執(zhí)行,main函數(shù)執(zhí)行結(jié)束,整個(gè)程序即結(jié)束。

3.C語言程序的書寫格式

從上面的例子也可以總結(jié)出C程序的書寫格式:

(1)?C程序使用分號(hào)“;”作為語句的終止符,復(fù)合語句除外。

(2)?C程序書寫格式自由,一條語句可以分多行寫,一行上也可以寫多條語句。

(3)C語言嚴(yán)格區(qū)分大小寫。C程序習(xí)慣上用小寫字母,但符號(hào)常量、宏定義等習(xí)慣用大寫字母,所有的關(guān)鍵字必須采用小寫字母。

(4)在程序中使用注釋對(duì)程序進(jìn)行說明和解釋,可增強(qiáng)程序的可讀性。注釋部分的格式如下:

/*注釋內(nèi)容*/

(5)適當(dāng)采用縮進(jìn)格式很有必要。采用縮進(jìn)格式,可使程序更加清晰、易讀。1.1.2C程序的調(diào)試與運(yùn)行

1.調(diào)試運(yùn)行步驟

從編寫一個(gè)C程序到運(yùn)行并得到結(jié)果一般需要經(jīng)過四個(gè)步驟:編輯、編譯、連接、運(yùn)行。此過程如圖1-5所示。圖1-5C程序調(diào)試運(yùn)行步驟

(1)編輯:將編寫的C語言源程序輸入到計(jì)算機(jī)中以文件的形式保存起來。C語言源程序的擴(kuò)展名為“c”,在VisualC++6.0集成開發(fā)環(huán)境中通常將C程序保存為擴(kuò)展名為“cpp”的文件,如“f.c”或“f.cpp”。

(2)編譯:C語言源程序編輯好之后,應(yīng)將其編譯為二進(jìn)制的目標(biāo)代碼。在編譯時(shí),還會(huì)對(duì)源程序進(jìn)行語法檢查,如果源程序存在語法錯(cuò)誤,用戶應(yīng)該返回編輯狀態(tài),根據(jù)錯(cuò)誤提示信息查找錯(cuò)誤并改正,再次重新編譯,直到?jīng)]有語法錯(cuò)誤,生成目標(biāo)程序文件,擴(kuò)展文件名為“obj”,如“f.obj”。

(3)連接:將各個(gè)模塊的二進(jìn)制目標(biāo)代碼與系統(tǒng)標(biāo)準(zhǔn)模塊進(jìn)行連接處理,得到最終的可執(zhí)行文件。連接成功將生成可執(zhí)行文件,擴(kuò)展文件名為“exe”,如“f.exe”。

(4)運(yùn)行:可執(zhí)行文件沒有語法錯(cuò)誤,但可能有設(shè)計(jì)上的錯(cuò)誤而導(dǎo)致運(yùn)行結(jié)果不正確。若運(yùn)行結(jié)果不正確,還需要返回到編輯狀態(tài)查找并修改錯(cuò)誤,重新編譯、連接、運(yùn)行,直至運(yùn)行結(jié)果正確。

2.在VisualC++6.0集成開發(fā)環(huán)境中運(yùn)行C程序

C語言的集成開發(fā)環(huán)境有TurboC、BorlandC、VisualC++等。VisualC++6.0功能強(qiáng)大、靈活性好,是目前較為流行的C語言集成開發(fā)環(huán)境。下面以具體的例子為例,介紹在VisualC++?6.0集成開發(fā)環(huán)境中編輯、編譯、連接、運(yùn)行C程序的方法。

(1)創(chuàng)建工作文件夾。

在用VisualC++6.0進(jìn)行C程序設(shè)計(jì)時(shí),一般先要?jiǎng)?chuàng)建一個(gè)工作文件夾,以便集中管理和查找文件。如創(chuàng)建文件夾“C:\源程序”。

(2)啟動(dòng)VisualC++6.0。

選擇“開始”→“程序”→“MicrosoftVisualStudio6.0”→“MicrosoftVisualC++6.0”,運(yùn)行VisualC++6.0,進(jìn)入VisualC++6.0開發(fā)環(huán)境,如圖1-6所示。圖1-6VisualC++6.0開發(fā)環(huán)境

(3)創(chuàng)建C源程序文件。

選擇“文件”菜單→“新建”命令,或直接按【Ctrl】+【N】組合鍵打開“新建”對(duì)話框。選擇“文件”選項(xiàng)卡中的“C++SourceFile”,在右邊的“文件”文本框中輸入文件名,如“1-4”;單擊“目錄”文本框右側(cè)的

按鈕修改保存文件的位置,如“C:\源程序”,如圖1-7所示;單擊“確定”按鈕,即可進(jìn)入VisualC++6.0的代碼編輯區(qū)編輯程序。圖1-7新建C程序

(4)編輯代碼并保存。

①編輯代碼:在代碼編輯區(qū)輸入1-4.cpp的源代碼,完成后如圖1-8所示。源代碼如下:

【例1-4】

編輯、編譯、連接、運(yùn)行如下C程序。

②保存源程序文件:選擇“文件”菜單→“保存”命令(“另存為”命令可修改文件名或文件存放位置),也可單擊工具欄中的“保存”按鈕

來保存文件。圖1-8在編輯區(qū)編輯源程序

(5)編譯。

選擇“組建”菜單(由于漢化版本不同,有的版本此處為“編譯”菜單)→“編譯”命令,也可單擊工具欄的“編譯”按鈕

,或按【Ctrl】+【F7】組合鍵,在彈出的“創(chuàng)建默認(rèn)項(xiàng)目工作空間”對(duì)話框中選擇“是”按鈕,如圖1-9所示,然后系統(tǒng)開始對(duì)當(dāng)前的源程序進(jìn)行編譯。圖1-9“創(chuàng)建默認(rèn)項(xiàng)目工作空間”對(duì)話框

若編譯過程中沒有發(fā)現(xiàn)語法錯(cuò)誤,則在輸出區(qū)窗口中顯示如圖1-10所示的編譯信息。圖1-10輸出區(qū)窗口中的編譯信息

(6)連接。

選擇“組建”菜單→“組建”命令,也可單擊工具欄的“連接”按鈕

,或按【F7】鍵進(jìn)行連接。若連接沒有錯(cuò)誤,則在輸出區(qū)窗口中顯示如圖1-11所示的連接信息。圖1-11輸出區(qū)窗口中的連接信息

(7)運(yùn)行。

選擇“組建”菜單→“執(zhí)行”命令,也可單擊工具欄的“執(zhí)行”按鈕

,或按【Ctrl】+【F5】組合鍵運(yùn)行程序,即可看到控制臺(tái)程序窗口中的運(yùn)行結(jié)果,如圖1-12所示。圖1-12程序1-4.cpp的運(yùn)行結(jié)果

(8)關(guān)閉工作空間。

完成了對(duì)程序的操作后,應(yīng)保存好已經(jīng)建立的程序與數(shù)據(jù),并關(guān)閉工作空間。選擇“文件”菜單→“關(guān)閉工作空間”命令,可關(guān)閉工作空間。

關(guān)閉工作空間后,可重復(fù)以上步驟,進(jìn)行其他程序文件的操作。

3.編譯錯(cuò)誤的處理

若在編譯過程中系統(tǒng)發(fā)現(xiàn)程序存在編譯錯(cuò)誤,會(huì)將錯(cuò)誤信息、顯示在輸出區(qū)窗口中,如圖1-13所示。圖1-13存在語法錯(cuò)誤的程序1-4.cpp的編譯結(jié)果

源程序錯(cuò)誤分為三種類型:致命錯(cuò)誤fatalerror、一般錯(cuò)誤error和警告warning。致命錯(cuò)誤通常是內(nèi)部編譯錯(cuò)誤。一般錯(cuò)誤指程序的語法錯(cuò)誤、磁盤或內(nèi)存存取錯(cuò)誤或命令錯(cuò)誤。發(fā)生致命錯(cuò)誤及一般錯(cuò)誤時(shí),必須采取一些適當(dāng)?shù)拇胧┎⒅匦戮幾g,只有修改這兩類錯(cuò)誤后,程序才能繼續(xù)連接、運(yùn)行。警告并不阻止編譯進(jìn)行,它指出一些值得懷疑的情況,可以說warning是編譯器為程序員提供的友善建議和意見,我們應(yīng)當(dāng)認(rèn)真查看產(chǎn)生warning的原因。

錯(cuò)誤信息中指出了錯(cuò)誤所在行號(hào)和錯(cuò)誤原因(可將輸出區(qū)的垂直滾動(dòng)條向上拖動(dòng)),如圖1-14所示。雙擊錯(cuò)誤信息,將會(huì)在編輯區(qū)提示錯(cuò)誤在程序中的大致位置,通常是錯(cuò)誤所在的行或附近。查找出錯(cuò)誤,修改后重新編譯直至成功,方可連接、運(yùn)行。圖1-14編譯錯(cuò)誤信息

1.2算

計(jì)算機(jī)盡管可以完成許多極其復(fù)雜的工作,但實(shí)質(zhì)上這些工作都是按照人們事先編好的程序進(jìn)行的,所以人們常把程序稱為計(jì)算機(jī)的靈魂。有這樣一個(gè)著名的公式:

程序?=?算法?+?數(shù)據(jù)結(jié)構(gòu)

這個(gè)公式說明:對(duì)于面向過程的程序設(shè)計(jì)語言而言,程序由算法和數(shù)據(jù)結(jié)構(gòu)兩大要素構(gòu)成。其中,數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)的組織和表示形式;而算法就是進(jìn)行操作的方法和步驟,是程序的靈魂。這里我們重點(diǎn)討論算法。1.2.1算法的定義和特性

1.算法的定義

算法是為解決一個(gè)具體問題而采用的確定、有效的方法和操作步驟。

【例1-5】

已知圓的半徑為10,求其面積。描述解決該問題的算法。

算法描述如下:

(1)半徑r=10;

(2)面積s=πr2;

(3)輸出面積s,結(jié)束。

【例1-6】

有三只杯子:A杯中裝滿酒,B杯中裝滿醋,C杯是空杯。利用C杯將A杯與B杯裝的東西對(duì)換。描述解決該問題的算法。

算法描述如下:

(1)?A杯倒入C杯;

(2)?B杯倒入A杯;

(3)?C杯倒入B杯,結(jié)束。

2.算法的特性

計(jì)算機(jī)所能執(zhí)行的算法必需具備以下五個(gè)特性。

(1)有窮性。計(jì)算機(jī)按照算法的規(guī)定執(zhí)行有限次數(shù)的操作后終止。

(2)確定性。算法中的每個(gè)步驟都應(yīng)是確定的,不允許有歧義。

(3)可行性。算法中規(guī)定的每個(gè)操作都是計(jì)算機(jī)可以執(zhí)行的操作。

(4)?0或多個(gè)輸入。算法可以無輸入,也可以在程序運(yùn)行時(shí)由用戶通過輸入設(shè)備(如鍵盤)將需要使用到的一組數(shù)據(jù)輸入到計(jì)算機(jī)中。

(5)?1或多個(gè)輸出。算法的實(shí)現(xiàn)以得到處理結(jié)果為目的,沒有輸出的算法是沒有任何意義的。1.2.2算法的描述

進(jìn)行算法設(shè)計(jì)時(shí),可以使用不同的算法描述工具,如自然語言、流程圖、偽代碼、計(jì)算機(jī)語言等。

1.自然語言

自然語言就是人們?nèi)粘I钪惺褂玫恼Z言。自然語言比較符合人們?nèi)粘5乃季S習(xí)慣,通俗易懂,初學(xué)者容易掌握。但其描述文字顯得冗長,表達(dá)時(shí)容易出現(xiàn)疏漏,并引起理解上的歧義,不易直接轉(zhuǎn)化為程序。

2.流程圖

流程圖是一種流傳很廣的描述算法的方法。這種以特定的圖形符號(hào)加上說明來描述算法的圖,稱為流程圖。

1)傳統(tǒng)的流程圖

傳統(tǒng)的流程圖由一些圖框和流程線組成。其中:圖框表示各種操作的類型,圖框中的文字和符號(hào)表示操作的內(nèi)容,文字可以用中文、英文,也可以用數(shù)學(xué)上的寫法,還可以用計(jì)算機(jī)命令,但要簡(jiǎn)潔、明了、易懂,決不能有二義性;流程線表示操作的先后次序、流程走向。常用的符號(hào)及其功能如圖1-15所示。圖1-15常用的流程圖符號(hào)

【例1-7】

畫出火車站托運(yùn)行李按重量w計(jì)算費(fèi)用f的算法流程圖,收費(fèi)標(biāo)準(zhǔn)如下:圖1-16例1-7的傳統(tǒng)流程圖

2)?N-S流程圖

傳統(tǒng)流程圖中靈活的流程線是程序中隱藏問題的禍根。針對(duì)這一弊病,美國學(xué)者I.Nassi和B.Shneiderman提出了一種新的流程圖形式,稱為N-S流程圖。這種流程圖完全去掉了流程線,算法的每一步都用一個(gè)矩形框來描述,將一個(gè)個(gè)矩形框按執(zhí)行的次序連接起來就是一個(gè)完整的算法描述。

例1-7的N-S流程圖如圖1-17所示。圖1-17例1-7的N-S流程圖

3.偽代碼

偽代碼是介于自然語言和計(jì)算機(jī)語言之間的一種偽碼,它不受計(jì)算機(jī)語言嚴(yán)格語法的限制,描述算法靈活方便,易于轉(zhuǎn)化為計(jì)算機(jī)程序。

4.計(jì)算機(jī)語言

用計(jì)算機(jī)語言描述算法就是計(jì)算機(jī)程序,在計(jì)算機(jī)上執(zhí)行就可得到結(jié)果。1.2.3常用算法舉例

有了正確算法,方能使用計(jì)算機(jī)編程語言進(jìn)行程序設(shè)計(jì)。因此我們?cè)诖颂幭日莆找恍┳罨A(chǔ)的算法,了解程序設(shè)計(jì)基本思路,為后續(xù)學(xué)習(xí)編寫程序打下基礎(chǔ)。

無論算法有多復(fù)雜,其基本結(jié)構(gòu)只有三種:順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。

1.順序結(jié)構(gòu)

順序結(jié)構(gòu)的程序算法描述最為簡(jiǎn)單,只要按照解決問題的順序?qū)懗霾襟E即可,算法步驟執(zhí)行次序?yàn)樽陨隙?,依次?zhí)行。例1-1和例1-2均為順序結(jié)構(gòu)。例1-2的算法描述如圖1-18所示。圖1-18例1-2的流程圖

2.選擇結(jié)構(gòu)

選擇結(jié)構(gòu)對(duì)給定的條件進(jìn)行判斷,根據(jù)判斷的結(jié)果來控制程序的流程。例1-7為選擇結(jié)構(gòu)。

【例1-8】

輸入兩個(gè)數(shù)給變量a和b,輸出較大的數(shù)值。

算法描述如圖1-19所示。

可用不同的算法解決同一問題。如例1-8的算法還可以用圖1-20來描述。圖1-19例1-8的流程圖1圖1-20例1-8的流程圖2

3.循環(huán)結(jié)構(gòu)

【例1-9】

求s=1?+?2?+?3?+?4?+?…?+?100。

按照人可以理解的自然語言方式描述算法如下:

(1)?1?+?2?+?3?+?4?+?…?+?100→s;

(2)輸出s,結(jié)束。

雖然人可以理解步驟(1)中“…”的含義,但計(jì)算機(jī)是不能理解的,違反了算法的確定性原則,無法轉(zhuǎn)化為計(jì)算機(jī)程序。

考慮到一個(gè)步驟中將算式全部寫出不現(xiàn)實(shí),將其拆分成若干步,描述如下:

(1)?s=0;

(2)?s+1→s;

(3)?s+2→s;

(4)?s+3→s;

(101)?s+100→s;

(102)輸出s,結(jié)束。

這樣描述每一步驟簡(jiǎn)練,但步驟太多,同樣其中的“…”不能省略。

因此,我們需要考慮的是有沒有方法能夠自動(dòng)地完成上面的步驟(2)~步驟(101)。仔細(xì)觀察步驟(2)~步驟(101)可以發(fā)現(xiàn),這100個(gè)步驟的內(nèi)容非常相似,只是加入到s中的數(shù)值從1變化到了100。是否可以只寫1個(gè)步驟,同時(shí)想辦法讓它重復(fù)執(zhí)行100次呢?重復(fù)執(zhí)行某些步驟的結(jié)構(gòu)就是循環(huán)結(jié)構(gòu)。上述算法改寫為循環(huán)算法如下:

(1)?s=0,i=1;

(2)?s+i→s,i+1→i;

(3)?i≤100轉(zhuǎn)步驟(2),否則轉(zhuǎn)下一步;

(4)輸出s,結(jié)束。

上面的算法描述只需要4個(gè)步驟,但實(shí)際上步驟(2)會(huì)在步驟(3)的控制下重復(fù)100次,這便是循環(huán)結(jié)構(gòu),即描述一遍,執(zhí)行若干遍。該算法可用如圖1-21所示的流程圖來描述。圖1-21例1-9的流程圖1.2.4算法拓展

【例1-10】

輸入三個(gè)數(shù)給變量a、b、c,輸出最大的數(shù)值。

按照例1-8的第一種算法思路求解本題,該算法可用如圖1-22所示的流程圖來描述。圖1-22例1-10的流程圖1

按照例1-8的第二種算法思路求解本題,該算法可用如圖1-23所示的流程圖來描述。

對(duì)比圖1-22及圖1-23兩種算法,都可以求解問題,但第二種算法更簡(jiǎn)單,且可以拓展到4個(gè)數(shù)、5個(gè)數(shù)、…、n個(gè)數(shù),當(dāng)然若數(shù)較多,可使用循環(huán)結(jié)構(gòu)。圖1-23例1-10的流程圖2圖1-24例1-11的流程圖

【例1-11】

輸入10個(gè)數(shù),輸出最大的數(shù)值。

繼續(xù)按照例1-10的第二種算法思路求解本題,但由于是10個(gè)數(shù),要重復(fù)比較9次,因此使用循環(huán)結(jié)構(gòu)。該算法可用如圖1-24所示的流程圖來描述。

【例1-12】

設(shè)我國2010年的人口是13億,若放開計(jì)劃生育,按5%的年增長率,哪一年達(dá)到20億?

我們應(yīng)逐漸適應(yīng)計(jì)算機(jī)程序求解問題的思路。計(jì)算機(jī)求解該題的思路是使用循環(huán)結(jié)構(gòu)重復(fù)計(jì)算,即圖1-25例1-12的流程圖

這個(gè)算法循環(huán)的次數(shù)我們無需知道,s每一年(即每循環(huán)一次)都在增加,必然會(huì)超出20,s超出20則停止循環(huán),此時(shí)的y值即問題的答案。 1.3程序中的數(shù)據(jù)

1.3.1變量與常量

1.標(biāo)識(shí)符命名規(guī)則

在程序中有許多需要命名的對(duì)象,如變量、符號(hào)常量、函數(shù)、自定義類型等,為這些對(duì)象所取的名稱稱為標(biāo)識(shí)符。每種程序設(shè)計(jì)語言都規(guī)定了自己的標(biāo)識(shí)符的命名規(guī)則。

C語言標(biāo)識(shí)符的命名規(guī)則如下:

(1)只能由字母、數(shù)字和下劃線三種字符組成;

(2)第一個(gè)字符只能為英文字母或下劃線“_”;

(3)標(biāo)識(shí)符不允許與關(guān)鍵字重名。

例如,下面是合法的標(biāo)識(shí)符:

abcdx12345m_n_op_123for

以下是非法的標(biāo)識(shí)符:

3dmax123a+bx.y-123for

還需注意的是:

(1)要考慮標(biāo)識(shí)符的有效長度。標(biāo)識(shí)符的最大長度根據(jù)每個(gè)C編譯系統(tǒng)規(guī)定有所不同,但組成標(biāo)識(shí)符的字符個(gè)數(shù)不要太多,一般不要超過32個(gè)。

(2)要考慮標(biāo)識(shí)符的易讀性。標(biāo)識(shí)符在命名時(shí)盡量做到“望名見義”,方能達(dá)到提高易讀性的目的。如代表總和的變量名用s或sum,代表平均分的變量名用aver,代表年份的變量名用y或year等。

2.變量

計(jì)算機(jī)程序中的變量用于保存數(shù)據(jù),對(duì)應(yīng)計(jì)算機(jī)硬件內(nèi)存儲(chǔ)器的一個(gè)或者多個(gè)存儲(chǔ)單元。在程序運(yùn)行過程中,變量的值可以被改變。

1)變量三要素

變量具有三要素:名稱、類型和值。變量的名稱用來區(qū)分并引用不同的變量;變量的類型表明變量用來存放什么類型的數(shù)據(jù);在變量的存儲(chǔ)單元中存放的數(shù)據(jù)稱為變量的值。

2)變量定義

C語言中的變量遵循“先定義,后使用”的原則,即必須先對(duì)將要使用的變量進(jìn)行變量定義才能使用該變量。

變量定義的一般形式如下:

類型說明符

變量名1[,變量名2,…];

其中,方括號(hào)內(nèi)的內(nèi)容為可選項(xiàng)。

例如:

inta,b; /*定義a、b為整型變量*/

floatx,y;

/*定義x、y為實(shí)型變量*/

charc; /*定義c為字符型變量*/

定義變量時(shí)應(yīng)注意:

(1)變量定義必須在變量使用之前進(jìn)行,一般放在函數(shù)體的聲明部分。

(2)允許同時(shí)定義同一數(shù)據(jù)類型的多個(gè)變量,各變量名之間用逗號(hào)分隔。

(3)最后一個(gè)變量名之后必須以“;”號(hào)結(jié)束。

(4)類型說明符與變量名之間至少要用一個(gè)空格分隔。

4)對(duì)變量的基本操作

變量一旦定義后,就可以通過引用變量來進(jìn)行賦值、取值等操作。所謂引用變量,就是使用變量名來引用變量的內(nèi)存空間。由于變量是內(nèi)存空間的一個(gè)標(biāo)識(shí),因此對(duì)變量的操作也就是對(duì)其內(nèi)存空間的操作。

有兩個(gè)對(duì)變量的基本操作:一是向變量中存入數(shù)據(jù),這個(gè)操作被稱為給變量賦值,變量中的舊值將被替換為賦予的新值;二是取得變量當(dāng)前的值,以便在程序運(yùn)行過程中使用,這個(gè)操作被稱為“取值”,取值操作不會(huì)改變變量中的值。例如:

inta,b; /*定義a、b為整型變量*/

a=3; /*給a賦值*/

b=a; /*取a值并賦值給b*/

其中,“=”是賦值運(yùn)算符?!癮=3;”是對(duì)變量的賦值操作,即將運(yùn)算符“=”右側(cè)的數(shù)據(jù)3存儲(chǔ)到左側(cè)變量a的內(nèi)存空間中(賦值操作)。而“b=a;”包括兩個(gè)過程:先獲取a的內(nèi)存空間中存儲(chǔ)的值3(取值操作),然后將該值3存儲(chǔ)到b的內(nèi)存空間中(賦值操作)。其操作過程可用圖1-26來表示。圖1-26變量賦值、取值操作

3.常量

常量是在程序運(yùn)行過程中值保持固定不變的數(shù)據(jù)。

1)常量

在C程序中,為了能給變量直接賦初值或用數(shù)據(jù)參與運(yùn)算,經(jīng)常需要使用數(shù)值、字符、字符串等。這些數(shù)據(jù)通常能直接從字面形式判別其類型,稱為字面常量,或稱為直接常量。如1、-3、0為整數(shù),1.2、-3.6為實(shí)數(shù),'a'、'B'為字符,"China"為字符串等。

2)符號(hào)常量

在C語言中還可為常量命名,稱為符號(hào)常量。符號(hào)常量跟變量一樣必須遵循“先定義,后使用”的原則,常量命名遵循標(biāo)識(shí)符命名規(guī)則。

C語言中定義符號(hào)常量的一般形式如下:

#define符號(hào)常量名

常量

其中“#define”是宏定義命令的專用定義符,在后面單元中將講到。例如:

#definePI3.14159

#defineMAX100

以上定義符號(hào)常量PI為常數(shù)3.14159,符號(hào)常量MAX為常數(shù)100,在該程序中但凡出現(xiàn)“PI”之處,就以數(shù)值3.14159替換,但凡出現(xiàn)“MAX”之處,就以數(shù)值100替換。

需要注意的是,符號(hào)常量仍是常量,不允許改變符號(hào)常量的值,企圖對(duì)符號(hào)常量進(jìn)行賦值的操作是不合法的。

符號(hào)常量名一般采用大寫字母,而變量名采用小寫字母。1.3.2基本數(shù)據(jù)類型

為了能將程序中指定的數(shù)據(jù)精確地用相應(yīng)的內(nèi)存單元來存儲(chǔ)和操作,C語言內(nèi)部預(yù)定義了一些數(shù)據(jù)類型,這些類型稱為基本數(shù)據(jù)類型,其名稱是預(yù)定義的關(guān)鍵字。同時(shí),為了在程序中能直接訪問內(nèi)存單元,C語言還提供了指針類型。除此之外,C語言還允許用戶根據(jù)基本數(shù)據(jù)類型和指針類型構(gòu)造出更為復(fù)雜的數(shù)據(jù)類型,如數(shù)組、結(jié)構(gòu)體、共用體等用于多個(gè)或多項(xiàng)數(shù)據(jù)的描述。C語言中的數(shù)據(jù)類型可分為基本類型、構(gòu)造類型、指針類型和空類型四類,如圖1-27所示。圖1-27C語言的數(shù)據(jù)類型

1.整數(shù)類型

1)數(shù)據(jù)類型

C語言的整數(shù)類型有6種。其中,有符號(hào)類型3種:基本整型(int)、短整型(short或shortint)、長整型(long或longint);無符號(hào)類型3種:無符號(hào)基本整型(unsigned或unsignedint)、無符號(hào)短整型(unsignedshort或unsignedshortint)、無符號(hào)長整型(unsignedlong或unsignedlongint)。

short、int、long的存儲(chǔ)空間大小不同,如圖1-28所示。需要注意的是,ANSIC的int類型整數(shù)在計(jì)算機(jī)中是用2字節(jié)的連續(xù)內(nèi)存單元來存儲(chǔ)的,但是VisualC++6.0所支持的int為4字節(jié)。由于本書的開發(fā)環(huán)境為VisualC++6.0,因此本書中的int及unsignedint類型是按照4字節(jié)存儲(chǔ)的形式講解的。個(gè)別例題有可能在不同的編譯系統(tǒng)中,由于int及unsignedint類型存儲(chǔ)為2或4字節(jié)的不同而導(dǎo)致得到不同的運(yùn)行結(jié)果。圖1-28不同整型的存儲(chǔ)空間大小

2)整型常量

(1)整型常量的表示方法。

整型常量就是整數(shù),在C語言中,整數(shù)可用十進(jìn)制、八進(jìn)制和十六進(jìn)制三種形式表示。

①十進(jìn)制形式。十進(jìn)制形式整數(shù),其數(shù)碼為0~9,數(shù)值前可以有+、-符號(hào)。注意,十進(jìn)制整數(shù)的數(shù)值前面不允許加0,如0123不是十進(jìn)制整數(shù)。

以下各數(shù)是合法的十進(jìn)制整型常量:

135

-246 67890

以下各數(shù)不是合法的十進(jìn)制整型常量:

3. 0396 26D

②八進(jìn)制形式。八進(jìn)制形式整數(shù),其數(shù)碼為0~7,必須以0開頭,即以0作為八進(jìn)制數(shù)的前綴。

以下各數(shù)是合法的八進(jìn)制整型常量:

011 0102 0177777

以下各數(shù)不是合法的八進(jìn)制整型常量:

123

0129

③十六進(jìn)制形式。十六進(jìn)制形式整數(shù),其數(shù)碼為0~9及A~F或a~f,必須以0x或0X開頭,即以0x或0X作為十六進(jìn)制數(shù)的前綴。

以下各數(shù)是合法的十六進(jìn)制整型常量:

0x11

0XA9 0xabcd

以下各數(shù)不是合法的十六進(jìn)制整型常量:

23AB 0x5H

(2)整型常量的類型。

整型常量也有其類型,具體判別方法如下:

①如不特別指明,一個(gè)整型常量被認(rèn)為是int類型。

②如果一個(gè)整型常量加后綴L或l,則被認(rèn)為是long類型,如123L、-78l。

③如果一個(gè)整型常量加后綴U或u,則被認(rèn)為是unsigned類型,如3U、-1u。-1u被理解為無符號(hào)數(shù),即4294967295。

3)整型變量

使用整型的六種類型說明符之一對(duì)變量進(jìn)行定義后,就可以使用整型變量了。

【例1-13】

整型變量的定義與使用。圖1-29例1-13程序運(yùn)行結(jié)果

2.實(shí)數(shù)類型

由于計(jì)算機(jī)中的實(shí)型數(shù)據(jù)是以浮點(diǎn)形式表示的,即小數(shù)點(diǎn)的位置可以是浮動(dòng)的,因此實(shí)型數(shù)據(jù)也稱為浮點(diǎn)型數(shù)據(jù)。

1)數(shù)據(jù)類型

C語言的實(shí)數(shù)類型有三種:?jiǎn)尉葘?shí)型(float)、雙精度實(shí)型(double)、長雙精度實(shí)型(longdouble)。但由于longdouble類型在不同的編譯系統(tǒng)中存儲(chǔ)字節(jié)數(shù)不同,有的是8字節(jié),有的是10、12或16字節(jié),且該類型使用不多,因此不展開講解。

float、double、longdouble類型數(shù)據(jù)的存儲(chǔ)空間大小不同,如圖1-30所示。圖1-30不同實(shí)型的存儲(chǔ)空間大小

有效數(shù)字是指數(shù)據(jù)在計(jì)算機(jī)中存儲(chǔ)時(shí)能夠精確表示的數(shù)字位數(shù)。實(shí)型數(shù)據(jù)的存儲(chǔ)形式?jīng)Q定了能提供的有效位數(shù)有限,有效數(shù)字位數(shù)以外的數(shù)字是不準(zhǔn)確的,因此實(shí)型數(shù)據(jù)的表示可能存在誤差。

(2)實(shí)型常量的類型。

實(shí)型常量的類型判別方法如下:

①如不特別指明,一個(gè)實(shí)型常量被認(rèn)為是double類型。

②如果一個(gè)實(shí)型常量加后綴F或f,則被認(rèn)為是float類型,如12.56F、2.1e5f。

3)實(shí)型變量

使用實(shí)型的三種類型說明符之一對(duì)變量進(jìn)行定義后,就可以使用實(shí)型變量了。

程序運(yùn)行結(jié)果如圖1-31所示。注意本例的輸出結(jié)果出現(xiàn)誤差,并非預(yù)期的8888.888880的結(jié)果,這是因?yàn)閱尉葘?shí)型數(shù)據(jù)的有效數(shù)字位數(shù)只有6~7位。圖1-31例1-14程序運(yùn)行結(jié)果

3.字符類型

計(jì)算機(jī)處理的數(shù)據(jù)不僅有整數(shù)、實(shí)數(shù),還包括字符這樣的非數(shù)值數(shù)據(jù)。在C語言中字符數(shù)據(jù)包括字符和字符串兩種。

1)數(shù)據(jù)類型

C語言的字符類型關(guān)鍵字為char,所占存儲(chǔ)空間為1字節(jié)。字符型數(shù)據(jù)在計(jì)算機(jī)中存儲(chǔ),是字符的ASCII碼值的二進(jìn)制形式。

2)字符常量

C語言中有兩種形式的字符常量:普通字符和轉(zhuǎn)義字符。

(1)普通字符:用單引號(hào)括起來的單個(gè)字符,如‘a(chǎn)’、‘Y’、‘@’、‘5’。

(2)轉(zhuǎn)義字符:以“\”開頭的具有特殊含義的字符。轉(zhuǎn)義字符有其特定的含義,不同于字符原本的含義,故稱其為“轉(zhuǎn)義”字符。常用的轉(zhuǎn)義字符及其含義見表1-3。圖1-32例1-15程序運(yùn)行結(jié)果

3)字符型變量

使用類型說明符char對(duì)變量進(jìn)行定義后,就可以使用字符型變量了。

由于字符型變量在內(nèi)存中存放的是字符的ASCII碼值,因此也可以把它們看成是整型量。字符型數(shù)據(jù)與整型數(shù)據(jù)之間的轉(zhuǎn)換比較方便。字符數(shù)據(jù)可以參與算術(shù)運(yùn)算,也可以與整型量相互賦值,還可以按照整數(shù)形式輸出。圖1-33例1-16程序運(yùn)行結(jié)果

字符

‘a(chǎn)’

的ASCII值為97,字符

‘A’

的ASCII值為65。變量的輸出形式取決于printf函數(shù)格式控制字符串中的格式符:當(dāng)格式符為“%c”時(shí),輸出的形式為字符;當(dāng)格式符為“%d”時(shí),輸出的形式為整數(shù)。

【例1-17】

大小寫字母的轉(zhuǎn)換。

#include<stdio.h>

main()

{ charc1,c2;

c1='a'; c2='B';

c1=c1-32; c2=c2+32;

printf("%c,%c\n",c1,c2);

}

圖1-34例1-17程序運(yùn)行結(jié)果

4.字符串常量

C語言中的字符串常量是由一對(duì)雙引號(hào)括起的字符序列。以下字符串均為合法的字符串常量:

“Howareyou”“12345”“x”“”(空串)

字符串中字符的個(gè)數(shù)稱為字符串的長度,以上4個(gè)字符串的長度分別為11、5、1、0。

字符串在計(jì)算機(jī)中存儲(chǔ),是將一個(gè)個(gè)字符按順序放在連續(xù)的存儲(chǔ)單元中,每一個(gè)字符占1字節(jié)存儲(chǔ)單元保存其ASCII碼值,最后還要額外使用1字節(jié)存儲(chǔ)單元保存字符串結(jié)束符'\0'。因此,長度為n的字符串需要n+1字節(jié)的存儲(chǔ)單元保存。上面的4個(gè)字符串在內(nèi)存中所占的字節(jié)數(shù)分別為12、6、2、1?!纠?-18】

字符串的長度及在內(nèi)存中所占字節(jié)數(shù)。

#include<stdio.h>

#include<string.h>

main()

{ printf("%d\n",strlen("Hello"));

printf("%d\n",sizeof("Hello"));

printf("%d\n",strlen("ab\nc\103de"));

printf("%d\n",sizeof("ab\nc\103de"));

}

圖1-35例1-18程序運(yùn)行結(jié)果1.3.3知識(shí)拓展——數(shù)據(jù)的表示方法

1.內(nèi)存單元的概念

為了便于內(nèi)存管理,通常將8位(bit)組成一個(gè)基本的內(nèi)存單元,稱為1字節(jié)(Byte)。為了便于內(nèi)存單元的訪問,計(jì)算機(jī)系統(tǒng)還為每一個(gè)內(nèi)存單元分配了一個(gè)相對(duì)固定的編碼,該編碼就是內(nèi)存單元的地址。

2.原碼、反碼和補(bǔ)碼

在計(jì)算機(jī)內(nèi)部,所有的信息要用二進(jìn)制來表示,二進(jìn)制表示的數(shù)值稱為機(jī)器數(shù)。不考慮正、負(fù)的機(jī)器數(shù)稱為無符號(hào)數(shù),考慮正、負(fù)的機(jī)器數(shù)稱為有符號(hào)數(shù)。為了在計(jì)算機(jī)中正確地表示有符號(hào)數(shù),通常規(guī)定最高位為符號(hào)位,并用0表示正,用1表示負(fù),余下各位表示數(shù)值。整數(shù)常用的表示方式有原碼、反碼、補(bǔ)碼。

1)原碼

原碼表示法在數(shù)值前面增加了一位符號(hào)位,即最高位為符號(hào)位:正數(shù)的該位為0,負(fù)數(shù)的該位為1(0有兩種表示:+0和-0),其余位表示數(shù)值的大小。如數(shù)值11的原碼為00001011,-11的原碼為10001011。

原碼的符號(hào)位不能直接參與運(yùn)算,必須和其他位分開,這就增加了硬件的開銷和復(fù)雜性。

2)反碼

反碼表示法規(guī)定:正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對(duì)其原碼逐位取反,但符號(hào)位除外。如數(shù)值11的反碼為00001011,-11的反碼為11110100。

3)補(bǔ)碼

補(bǔ)碼表示法規(guī)定:正數(shù)的補(bǔ)碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。如數(shù)值11的補(bǔ)碼為00001011,-11的補(bǔ)碼為11110101。

對(duì)于整數(shù)來說,在計(jì)算機(jī)內(nèi)部都是用補(bǔ)碼來存儲(chǔ)的。

(1)用補(bǔ)碼理解整數(shù)類型的表示范圍。

1字節(jié)(8位)存儲(chǔ)單元存儲(chǔ)二進(jìn)制數(shù)補(bǔ)碼的有符號(hào)數(shù)范圍是:

00000000~01111111~10000000~11111111

0127-128-1

-128~127即-27~27-1。

2字節(jié)(16位)存儲(chǔ)單元存儲(chǔ)二進(jìn)制數(shù)補(bǔ)碼的有符號(hào)數(shù)范圍是-32?768~32?767,即-215~215-1。4字節(jié)的有符號(hào)數(shù)范圍則是-231~231-1。

1字節(jié)(8位)存儲(chǔ)單元存儲(chǔ)二進(jìn)制數(shù)補(bǔ)碼的無符號(hào)數(shù)范圍是00000000~11111111,最高位的0或1不再是符號(hào)位而是數(shù)值部分,則數(shù)據(jù)范圍為0~255,即0~28-1。

2字節(jié)存儲(chǔ)單元存儲(chǔ)二進(jìn)制數(shù)補(bǔ)碼的無符號(hào)數(shù)范圍是0~65?535,即0~216-1。4字節(jié)的無符號(hào)數(shù)范圍則是0~232-1。(2)用補(bǔ)碼理解有符號(hào)數(shù)、無符號(hào)數(shù)的轉(zhuǎn)換。

【例1-19】

有符號(hào)數(shù)、無符號(hào)數(shù)的轉(zhuǎn)換。

#include<stdio.h>

main()

{ unsignedshorta;

a=-1;

printf(“%u\n”,a);

}

程序運(yùn)行結(jié)果如圖1-36所示。圖1-36例1-19程序運(yùn)行結(jié)果

例1-19中變量a為unsignedshort類型,是用2字節(jié)存儲(chǔ)的無符號(hào)數(shù)。-1的補(bǔ)碼為1111111111111111,賦值給a時(shí),由于a是無符號(hào)數(shù),最高位的1不是符號(hào)位而表示數(shù)值215。1111111111111111=215+214+…+21+20=216-1=65535。

3.字符數(shù)據(jù)的表示

計(jì)算機(jī)中的字符數(shù)據(jù)也需用二進(jìn)制編碼才能在計(jì)算機(jī)中存儲(chǔ)、傳輸并進(jìn)行處理,即字符編碼。英文字符包括數(shù)字、字母、符號(hào)、控制符號(hào)等。目前廣泛采用美國標(biāo)準(zhǔn)信息交換編碼(AmericanStandardCodeInformationInterchange,ASCII)作為英文字符的編碼標(biāo)準(zhǔn),該編碼已被國際標(biāo)準(zhǔn)化組織ISO采用,成為一種國際通用的信息交換用標(biāo)準(zhǔn)代碼。附錄B中列出了ASCII碼字符集。

1.4常用表達(dá)式和運(yùn)算符

1.4.1表達(dá)式、運(yùn)算符概述

1.表達(dá)式

表達(dá)式是由運(yùn)算對(duì)象(操作數(shù))、運(yùn)算符(操作符)按照C語言的語法規(guī)則構(gòu)成的符號(hào)序列。表達(dá)式可以通過運(yùn)算產(chǎn)生一個(gè)結(jié)果或完成某種操作。正是由于C語言具有豐富的多種類型的表達(dá)式,才得以體現(xiàn)出C語言所具有的表達(dá)能力強(qiáng)、使用靈活、適應(yīng)性好的特點(diǎn)。

2.運(yùn)算符

C語言的運(yùn)算符很豐富,運(yùn)算符是C語言用于描述對(duì)數(shù)據(jù)進(jìn)行運(yùn)算的符號(hào)。

運(yùn)算符可按其運(yùn)算對(duì)象的個(gè)數(shù)分為3類:?jiǎn)文窟\(yùn)算符、雙目運(yùn)算符、三目運(yùn)算符。

運(yùn)算符還可以按其功能分為算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、條件運(yùn)算符、邏輯運(yùn)算符、賦值運(yùn)算符、逗號(hào)運(yùn)算符、位運(yùn)算符及其他運(yùn)算符等。

3.優(yōu)先級(jí)和結(jié)合性

當(dāng)一個(gè)表達(dá)式中出現(xiàn)多種不同的運(yùn)算符時(shí),如何進(jìn)行運(yùn)算?這涉及運(yùn)算符的兩個(gè)重要概念,即優(yōu)先級(jí)和結(jié)合性(又稱結(jié)合方向)。

優(yōu)先級(jí)指不同運(yùn)算符進(jìn)行運(yùn)算時(shí)的優(yōu)先次序。C語言規(guī)定了各個(gè)運(yùn)算符的優(yōu)先等級(jí),用數(shù)值來反映優(yōu)先等級(jí)的高低,數(shù)值越小,優(yōu)先級(jí)越高。在同一表達(dá)式中出現(xiàn)不同運(yùn)算符時(shí),優(yōu)先級(jí)較高的運(yùn)算符將優(yōu)先進(jìn)行運(yùn)算,如數(shù)學(xué)中四則運(yùn)算的“先乘除后加減”。C語言中,通常所有單目運(yùn)算符的優(yōu)先級(jí)高于雙目運(yùn)算符的優(yōu)先級(jí)。()、[]、->、·?的優(yōu)先級(jí)最高,而逗號(hào)運(yùn)算符的優(yōu)先級(jí)最低。

結(jié)合性是指同一表達(dá)式中相同優(yōu)先級(jí)的多個(gè)運(yùn)算是自左向右還是自右向左進(jìn)行運(yùn)算,如數(shù)學(xué)中的四則運(yùn)算就是自左向右運(yùn)算。通常,在C語言中,單目運(yùn)算符的結(jié)合方向是自右向左;雙目運(yùn)算符的結(jié)合方向大部分是自左向右,只有賦值和復(fù)合賦值運(yùn)算符的結(jié)合方向是自右向左;三目運(yùn)算符的結(jié)合方向是自右向左。

關(guān)于C語言運(yùn)算符的含義、類型、優(yōu)先級(jí)、結(jié)合性等問題見附錄C。

1.4.2算術(shù)運(yùn)算符及表達(dá)式

數(shù)值的算術(shù)運(yùn)算是程序中常見的。C語言中的算術(shù)運(yùn)算符只能實(shí)現(xiàn)四則運(yùn)算等基本功能,沒有乘方、開方等運(yùn)算符,這些功能是通過頭文件“math.h”中定義的數(shù)學(xué)函數(shù)來實(shí)現(xiàn)的(詳見附錄D)。

1.算術(shù)運(yùn)算符

1)單目算術(shù)運(yùn)算符

(1)?+:正號(hào)運(yùn)算符,優(yōu)先級(jí)2級(jí),具有右結(jié)合性,如+3,+1.25。

(2)?-:負(fù)號(hào)運(yùn)算符,優(yōu)先級(jí)2級(jí),具有右結(jié)合性,如-a。

2)雙目算術(shù)運(yùn)算符

(1)?*:乘法運(yùn)算符,優(yōu)先級(jí)3級(jí),具有左結(jié)合性,如3*2,a*b。

(2)?/:除法運(yùn)算符,優(yōu)先級(jí)3級(jí),具有左結(jié)合性,如5?/?2,a/b。

(3)?%:求余運(yùn)算符,優(yōu)先級(jí)3級(jí),具有左結(jié)合性,注意要求%兩側(cè)運(yùn)算對(duì)象均為整型數(shù)據(jù)。求余運(yùn)算結(jié)果的符號(hào)與被除數(shù)(左操作數(shù))的符號(hào)相同。

求余運(yùn)算符也稱為求模運(yùn)算符,它最常用的功能如下:

①用a%b是否等于0判斷a是否能被b整除。

②用x%10截取x的個(gè)位數(shù),用x%100截取x的低2位數(shù)等。

(4)?+?:加法運(yùn)算符,優(yōu)先級(jí)4級(jí),具有左結(jié)合性。

(5)?-?:減法運(yùn)算符,優(yōu)先級(jí)4級(jí),具有左結(jié)合性。

2.算術(shù)表達(dá)式

算術(shù)表達(dá)式是用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象連接起來的、符合C語言語法規(guī)則的式子。

使用算術(shù)表達(dá)式時(shí)應(yīng)注意以下幾點(diǎn):

(1)操作數(shù)類型自動(dòng)轉(zhuǎn)換。

①雙目算術(shù)運(yùn)算對(duì)象的數(shù)據(jù)類型一致。運(yùn)算對(duì)象的數(shù)據(jù)類型一致時(shí),運(yùn)算結(jié)果的類型也將一致(char、short類型除外)。如當(dāng)運(yùn)算對(duì)象均為整數(shù)時(shí),運(yùn)算結(jié)果也為整數(shù),故5?/?2的結(jié)果是2。

②雙目算術(shù)運(yùn)算對(duì)象的數(shù)據(jù)類型不一致。若運(yùn)算對(duì)象的數(shù)據(jù)類型不一致,系統(tǒng)自動(dòng)按規(guī)律先將運(yùn)算對(duì)象轉(zhuǎn)換為同一類型,然后再進(jìn)行運(yùn)算。C語言編譯器會(huì)自動(dòng)將低類型的操作數(shù)向高類型進(jìn)行轉(zhuǎn)換,稱為類型的自動(dòng)轉(zhuǎn)換。轉(zhuǎn)換的規(guī)則如圖1-37所示。圖1-37標(biāo)準(zhǔn)類型數(shù)據(jù)參與算術(shù)運(yùn)算的轉(zhuǎn)換規(guī)則

圖中:橫向箭頭表示必須的轉(zhuǎn)換,如兩個(gè)char類型數(shù)據(jù)參與算術(shù)運(yùn)算,盡管類型相同,但兩者仍要先轉(zhuǎn)換為int類型再進(jìn)行算術(shù)運(yùn)算,運(yùn)算結(jié)果也為int類型??v向箭頭表示當(dāng)算術(shù)運(yùn)算符兩側(cè)的運(yùn)算對(duì)象為不同類型時(shí)的轉(zhuǎn)換方向,如一個(gè)double型數(shù)據(jù)與一個(gè)int型數(shù)據(jù)一起運(yùn)算,需要由低向高先將int型數(shù)據(jù)轉(zhuǎn)換為double型,然后再進(jìn)行運(yùn)算,運(yùn)算結(jié)果為double型。這些轉(zhuǎn)換由系統(tǒng)自動(dòng)進(jìn)行,使用時(shí)只需要了解這種轉(zhuǎn)換、知道結(jié)果的類型即可。

注意:在VisualC++6.0中,float類型數(shù)據(jù)無需轉(zhuǎn)換為double類型即可參與算術(shù)運(yùn)算。

(2)代數(shù)式與表達(dá)式。

為了能讓C程序進(jìn)行數(shù)值計(jì)算,還必須將代數(shù)式寫成C語言合法的表達(dá)式。例如,若有代數(shù)式:

②適當(dāng)加上圓括號(hào)。使用圓括號(hào)可以改變表達(dá)式的運(yùn)算順序,還應(yīng)有意識(shí)地加上一些圓括號(hào)來增強(qiáng)程序可讀性,多層括號(hào)均使用圓括號(hào)“()”,注意左右括號(hào)必須成對(duì)出現(xiàn)。事實(shí)上,()也是運(yùn)算符,它的優(yōu)先級(jí)最高,所以先求解括號(hào)內(nèi)的子表達(dá)式。

③數(shù)據(jù)類型。由于算術(shù)表達(dá)式運(yùn)算時(shí)操作數(shù)的數(shù)據(jù)類型對(duì)結(jié)果的數(shù)據(jù)類型是有影響的,因此在書寫表達(dá)式時(shí)要注意。如:

若將表達(dá)式寫成1/2*a*b*c,則無論a、b、c的值是多少,表達(dá)式的結(jié)果均為0。這是因?yàn)榘凑账阈g(shù)表達(dá)式的運(yùn)算規(guī)則,首先計(jì)算1/2,其結(jié)果為0,再乘以其他數(shù)據(jù)結(jié)果也必然為0了。為了保證計(jì)算結(jié)果的正確性,應(yīng)盡可能將操作數(shù)的類型寫成表達(dá)式中的最高類型,即上述表達(dá)式應(yīng)寫成1.0/2.0*a*b*c。圖1-38例1-20程序運(yùn)行結(jié)果

例1-20中,表達(dá)式i/100可截取變量i百位以上的數(shù)據(jù),結(jié)果為2;表達(dá)式i%10可獲取i個(gè)位上的數(shù)值,結(jié)果為6;表達(dá)式i/10%10先截取變量i十位以上的數(shù)據(jù)25,再由%10獲取個(gè)位上的數(shù)值,結(jié)果為5;a、b、c分別獲取了i?(變量i當(dāng)前的數(shù)值為一個(gè)3位數(shù)256)的百、十、個(gè)位數(shù)。

表達(dá)式9/2*f1,先計(jì)算9/2,結(jié)果為4,4*f1為8.0,故f2的值為8.0。1.4.3賦值運(yùn)算符及表達(dá)式

賦值運(yùn)算符用來構(gòu)成賦值表達(dá)式給變量進(jìn)行賦值操作。

1.普通賦值運(yùn)算符及表達(dá)式

1)賦值運(yùn)算符

賦值運(yùn)算符用賦值符號(hào)“=”表示,其功能為將賦值運(yùn)算符右側(cè)的數(shù)據(jù)賦給賦值運(yùn)算符左側(cè)的變量。

賦值運(yùn)算符的優(yōu)先級(jí)很低,僅高于逗號(hào)運(yùn)算符,具有右結(jié)合性。

2)賦值表達(dá)式

由賦值運(yùn)算符將一個(gè)變量和一個(gè)表達(dá)式連接起來的表達(dá)

式稱做賦值表達(dá)式。它的一般形式如下:

變量名=表達(dá)式

賦值表達(dá)式將賦值運(yùn)算符右側(cè)的表達(dá)式的運(yùn)算結(jié)果賦給賦值運(yùn)算符左側(cè)的變量。注意:賦值表達(dá)式中,賦值運(yùn)算符的左側(cè)必須是變量。圖1-39例1-21程序運(yùn)行結(jié)果

例1-21中,表達(dá)式a=b=8是合法的,在表達(dá)式中出現(xiàn)了2個(gè)賦值運(yùn)算符,優(yōu)先級(jí)相同,由于賦值運(yùn)算符具有右結(jié)合性,因此先求解子表達(dá)式b=8,b賦值為8,然后再求解子表達(dá)式a=b,a賦值為8。

3)賦值表達(dá)式的類型轉(zhuǎn)換

當(dāng)賦值運(yùn)算符兩側(cè)運(yùn)算對(duì)象的數(shù)據(jù)類型不同時(shí),系統(tǒng)也將進(jìn)行自動(dòng)類型轉(zhuǎn)換,但該自動(dòng)轉(zhuǎn)換的規(guī)則不同于算術(shù)運(yùn)算的由低向高的轉(zhuǎn)換規(guī)則。

賦值運(yùn)算的類型轉(zhuǎn)換規(guī)則為:將賦值運(yùn)算符右側(cè)表達(dá)式的類型轉(zhuǎn)換為左側(cè)變量的類型。因?yàn)樽髠?cè)的變量一經(jīng)定義,其數(shù)據(jù)類型不再改變,當(dāng)中存放的數(shù)據(jù)自然是此數(shù)據(jù)類型。

2.復(fù)合賦值運(yùn)算符及表達(dá)式

1)復(fù)合賦值運(yùn)算符

C語言還允許賦值運(yùn)算符“=”與算術(shù)運(yùn)算符和位運(yùn)算符聯(lián)合使用,構(gòu)成復(fù)合賦值運(yùn)算符,使得表達(dá)式更加精練。

復(fù)合賦值運(yùn)算符有:

+=、-=、*=、/=、%=、|=、&=、^=、<<=、>>=

所有賦值運(yùn)算符的優(yōu)先級(jí)全部相同,為14級(jí),均具右結(jié)合性。2)復(fù)合賦值表達(dá)式

復(fù)合賦值表達(dá)式的一般形式如下:

變量名

復(fù)合賦值運(yùn)算符

表達(dá)式

復(fù)合賦值表達(dá)式的作用等價(jià)于:

變量名=變量名運(yùn)算符(表達(dá)式)

圖1-40例1-22程序運(yùn)行結(jié)果1.4.4自增、自減運(yùn)算符及表達(dá)式

自增、自減運(yùn)算符為變量加1、減1提供了簡(jiǎn)單有效的方法。

1.一般使用方法

(1)?++:自增運(yùn)算符,使變量的值增加1。

(2)?--:自減運(yùn)算符,使變量的值減少1。

兩者均為單目運(yùn)算符,優(yōu)先級(jí)2級(jí),具有右結(jié)合性。

當(dāng)自增表達(dá)式單獨(dú)形成語句使用時(shí),無論是其前置運(yùn)算形式“++變量”,還是其后置運(yùn)算形式“變量++”,都是僅對(duì)變量自增1,兩種形式?jīng)]有區(qū)別。自減表達(dá)式亦然。圖1-41例1-23程序運(yùn)行結(jié)果

2.前置、后置運(yùn)算應(yīng)用于表達(dá)式的區(qū)別

自增、自減的前置、后置表達(dá)式單獨(dú)使用時(shí)是沒有區(qū)別的,但當(dāng)它們作為子表達(dá)式出現(xiàn)在其他表達(dá)式內(nèi)部時(shí)就有著明顯的區(qū)別。

1)前置運(yùn)算

前置運(yùn)算:將?++?或?--?運(yùn)算符置于變量之前,一般形式如下:

++變量

--變量

其功能是使變量的值增、減1,然后再以變化后的變量值參與表達(dá)式中的其他運(yùn)算,即先增減、后運(yùn)算。

2)后置運(yùn)算

后置運(yùn)算:將?++?或?--?運(yùn)算符置于變量之后,一般形式如下:

變量++

變量--

其功能是變量先參與表達(dá)式中的其他運(yùn)算,然后再使變量的值增、減1,即先運(yùn)算、后增減。圖1-42例1-24程序運(yùn)行結(jié)果

3.關(guān)于自增、自減運(yùn)算符及表達(dá)式的說明

(1)自增、自減運(yùn)算符實(shí)際上也是做賦值運(yùn)算,因此不能應(yīng)用于常量和表達(dá)式,其操作對(duì)象只能是變量。如6--、(a+3)++是非法的表達(dá)式。

(2)一般自增、自減表達(dá)式或是以表達(dá)式語句的形式出現(xiàn),或是出現(xiàn)在for循環(huán)語句中使循環(huán)控制變量加、減1,或應(yīng)用于指針變量,使指針指向下、上一個(gè)地址。將自增、自減表達(dá)式應(yīng)用于另一個(gè)表達(dá)式內(nèi)部的形式,初學(xué)者在尚未熟練掌握時(shí)盡量不要使用。

(3)盡量不要使用諸如i+++j、(i++)+(i++)此類容易產(chǎn)生歧義的形式。1.4.5逗號(hào)運(yùn)算符及表達(dá)式

逗號(hào)運(yùn)算符“,”用于將多個(gè)表達(dá)式連接起來,構(gòu)成一個(gè)逗號(hào)表達(dá)式。逗號(hào)運(yùn)算符又稱順序求值運(yùn)算符。

逗號(hào)運(yùn)算符為雙目運(yùn)算符,其優(yōu)先級(jí)是C中所有運(yùn)算符中最低的,為15級(jí),具有左結(jié)合性。

逗號(hào)運(yùn)算符可以擴(kuò)展為n元運(yùn)算的形式:

表達(dá)式1,表達(dá)式2,…

溫馨提示

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

評(píng)論

0/150

提交評(píng)論