版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
編寫C程序的基礎知識1.1C程序的編寫、調(diào)試和運行1.2算法1.3程序中的數(shù)據(jù)1.4常用表達式和運算符 1.1C程序的編寫、調(diào)試和運行
1.1.1C程序的結構
1.?C語言程序的結構分析
在使用C語言編寫程序時,必須按其規(guī)定的格式進行編寫。下面從幾個簡單的C語言程序入手,分析C語言程序的結構特點和書寫格式。圖1-1例1-1程序運行結果
程序分析如下:
(1)這是一個完整的C程序,包含一個main函數(shù)(也稱為主函數(shù))。
(2)“main()”為主函數(shù)的函數(shù)首部,隨后的“{……}”為主函數(shù)的函數(shù)體。
(3)該程序中只有一條語句“printf(”Hello,world!\n“);”,該語句能夠在屏幕上輸出“Hello,world!”,語句以分號“;”為結束符。
(4)“/*……*/”是對程序起到說明作用的注釋部分,程序執(zhí)行時并不執(zhí)行注釋部分。
(5)“#include<stdio.h>”是編譯預處理命令。printf是系統(tǒng)提供的標準庫函數(shù)之一,使用這些函數(shù)時,應該在程序開始處使用編譯預處理命令,將相應的頭文件包含進來。常用的系統(tǒng)標準庫函數(shù)及對應的頭文件見附錄D。圖1-2例1-2程序運行結果程序分析如下:
(1)函數(shù)體由聲明部分(也稱為定義部分)和執(zhí)行部分組成。
(2)聲明部分是函數(shù)體中使用的變量定義及某些函數(shù)的聲明。
(3)執(zhí)行部分由語句構成,用來完成函數(shù)所要實現(xiàn)的功能。圖1-3例1-3程序運行結果
程序分析如下:
(1)該程序由主函數(shù)main及函數(shù)名為hello、star的函數(shù)組成。
(2)在主函數(shù)main中使用到了hello、star函數(shù),我們稱之為調(diào)用。關于函數(shù)的具體知識將在第5單元進行詳細介紹。
2.?C語言程序的結構特點
從上面的例子可以總結出C程序結構的主要特點:
(1)函數(shù)是組成C語言程序的基本單元。編寫C程序其實就是定義一個個函數(shù)。函數(shù)構成如圖1-4所示。圖1-4函數(shù)構成
(2)一個C程序中有且僅有一個主函數(shù)即main函數(shù),可以沒有或有多個其他函數(shù)。主函數(shù)的位置沒有特別要求,只要不嵌套定義在其他函數(shù)內(nèi)部。
(3)一個C程序總是從main函數(shù)開始執(zhí)行,main函數(shù)執(zhí)行結束,整個程序即結束。
3.C語言程序的書寫格式
從上面的例子也可以總結出C程序的書寫格式:
(1)?C程序使用分號“;”作為語句的終止符,復合語句除外。
(2)?C程序書寫格式自由,一條語句可以分多行寫,一行上也可以寫多條語句。
(3)C語言嚴格區(qū)分大小寫。C程序習慣上用小寫字母,但符號常量、宏定義等習慣用大寫字母,所有的關鍵字必須采用小寫字母。
(4)在程序中使用注釋對程序進行說明和解釋,可增強程序的可讀性。注釋部分的格式如下:
/*注釋內(nèi)容*/
(5)適當采用縮進格式很有必要。采用縮進格式,可使程序更加清晰、易讀。1.1.2C程序的調(diào)試與運行
1.調(diào)試運行步驟
從編寫一個C程序到運行并得到結果一般需要經(jīng)過四個步驟:編輯、編譯、連接、運行。此過程如圖1-5所示。圖1-5C程序調(diào)試運行步驟
(1)編輯:將編寫的C語言源程序輸入到計算機中以文件的形式保存起來。C語言源程序的擴展名為“c”,在VisualC++6.0集成開發(fā)環(huán)境中通常將C程序保存為擴展名為“cpp”的文件,如“f.c”或“f.cpp”。
(2)編譯:C語言源程序編輯好之后,應將其編譯為二進制的目標代碼。在編譯時,還會對源程序進行語法檢查,如果源程序存在語法錯誤,用戶應該返回編輯狀態(tài),根據(jù)錯誤提示信息查找錯誤并改正,再次重新編譯,直到?jīng)]有語法錯誤,生成目標程序文件,擴展文件名為“obj”,如“f.obj”。
(3)連接:將各個模塊的二進制目標代碼與系統(tǒng)標準模塊進行連接處理,得到最終的可執(zhí)行文件。連接成功將生成可執(zhí)行文件,擴展文件名為“exe”,如“f.exe”。
(4)運行:可執(zhí)行文件沒有語法錯誤,但可能有設計上的錯誤而導致運行結果不正確。若運行結果不正確,還需要返回到編輯狀態(tài)查找并修改錯誤,重新編譯、連接、運行,直至運行結果正確。
2.在VisualC++6.0集成開發(fā)環(huán)境中運行C程序
C語言的集成開發(fā)環(huán)境有TurboC、BorlandC、VisualC++等。VisualC++6.0功能強大、靈活性好,是目前較為流行的C語言集成開發(fā)環(huán)境。下面以具體的例子為例,介紹在VisualC++?6.0集成開發(fā)環(huán)境中編輯、編譯、連接、運行C程序的方法。
(1)創(chuàng)建工作文件夾。
在用VisualC++6.0進行C程序設計時,一般先要創(chuàng)建一個工作文件夾,以便集中管理和查找文件。如創(chuàng)建文件夾“C:\源程序”。
(2)啟動VisualC++6.0。
選擇“開始”→“程序”→“MicrosoftVisualStudio6.0”→“MicrosoftVisualC++6.0”,運行VisualC++6.0,進入VisualC++6.0開發(fā)環(huán)境,如圖1-6所示。圖1-6VisualC++6.0開發(fā)環(huán)境
(3)創(chuàng)建C源程序文件。
選擇“文件”菜單→“新建”命令,或直接按【Ctrl】+【N】組合鍵打開“新建”對話框。選擇“文件”選項卡中的“C++SourceFile”,在右邊的“文件”文本框中輸入文件名,如“1-4”;單擊“目錄”文本框右側的
按鈕修改保存文件的位置,如“C:\源程序”,如圖1-7所示;單擊“確定”按鈕,即可進入VisualC++6.0的代碼編輯區(qū)編輯程序。圖1-7新建C程序
(4)編輯代碼并保存。
①編輯代碼:在代碼編輯區(qū)輸入1-4.cpp的源代碼,完成后如圖1-8所示。源代碼如下:
【例1-4】
編輯、編譯、連接、運行如下C程序。
②保存源程序文件:選擇“文件”菜單→“保存”命令(“另存為”命令可修改文件名或文件存放位置),也可單擊工具欄中的“保存”按鈕
來保存文件。圖1-8在編輯區(qū)編輯源程序
(5)編譯。
選擇“組建”菜單(由于漢化版本不同,有的版本此處為“編譯”菜單)→“編譯”命令,也可單擊工具欄的“編譯”按鈕
,或按【Ctrl】+【F7】組合鍵,在彈出的“創(chuàng)建默認項目工作空間”對話框中選擇“是”按鈕,如圖1-9所示,然后系統(tǒng)開始對當前的源程序進行編譯。圖1-9“創(chuàng)建默認項目工作空間”對話框
若編譯過程中沒有發(fā)現(xiàn)語法錯誤,則在輸出區(qū)窗口中顯示如圖1-10所示的編譯信息。圖1-10輸出區(qū)窗口中的編譯信息
(6)連接。
選擇“組建”菜單→“組建”命令,也可單擊工具欄的“連接”按鈕
,或按【F7】鍵進行連接。若連接沒有錯誤,則在輸出區(qū)窗口中顯示如圖1-11所示的連接信息。圖1-11輸出區(qū)窗口中的連接信息
(7)運行。
選擇“組建”菜單→“執(zhí)行”命令,也可單擊工具欄的“執(zhí)行”按鈕
,或按【Ctrl】+【F5】組合鍵運行程序,即可看到控制臺程序窗口中的運行結果,如圖1-12所示。圖1-12程序1-4.cpp的運行結果
(8)關閉工作空間。
完成了對程序的操作后,應保存好已經(jīng)建立的程序與數(shù)據(jù),并關閉工作空間。選擇“文件”菜單→“關閉工作空間”命令,可關閉工作空間。
關閉工作空間后,可重復以上步驟,進行其他程序文件的操作。
3.編譯錯誤的處理
若在編譯過程中系統(tǒng)發(fā)現(xiàn)程序存在編譯錯誤,會將錯誤信息、顯示在輸出區(qū)窗口中,如圖1-13所示。圖1-13存在語法錯誤的程序1-4.cpp的編譯結果
源程序錯誤分為三種類型:致命錯誤fatalerror、一般錯誤error和警告warning。致命錯誤通常是內(nèi)部編譯錯誤。一般錯誤指程序的語法錯誤、磁盤或內(nèi)存存取錯誤或命令錯誤。發(fā)生致命錯誤及一般錯誤時,必須采取一些適當?shù)拇胧┎⒅匦戮幾g,只有修改這兩類錯誤后,程序才能繼續(xù)連接、運行。警告并不阻止編譯進行,它指出一些值得懷疑的情況,可以說warning是編譯器為程序員提供的友善建議和意見,我們應當認真查看產(chǎn)生warning的原因。
錯誤信息中指出了錯誤所在行號和錯誤原因(可將輸出區(qū)的垂直滾動條向上拖動),如圖1-14所示。雙擊錯誤信息,將會在編輯區(qū)提示錯誤在程序中的大致位置,通常是錯誤所在的行或附近。查找出錯誤,修改后重新編譯直至成功,方可連接、運行。圖1-14編譯錯誤信息
1.2算
法
計算機盡管可以完成許多極其復雜的工作,但實質上這些工作都是按照人們事先編好的程序進行的,所以人們常把程序稱為計算機的靈魂。有這樣一個著名的公式:
程序?=?算法?+?數(shù)據(jù)結構
這個公式說明:對于面向過程的程序設計語言而言,程序由算法和數(shù)據(jù)結構兩大要素構成。其中,數(shù)據(jù)結構是指數(shù)據(jù)的組織和表示形式;而算法就是進行操作的方法和步驟,是程序的靈魂。這里我們重點討論算法。1.2.1算法的定義和特性
1.算法的定義
算法是為解決一個具體問題而采用的確定、有效的方法和操作步驟。
【例1-5】
已知圓的半徑為10,求其面積。描述解決該問題的算法。
算法描述如下:
(1)半徑r=10;
(2)面積s=πr2;
(3)輸出面積s,結束。
【例1-6】
有三只杯子:A杯中裝滿酒,B杯中裝滿醋,C杯是空杯。利用C杯將A杯與B杯裝的東西對換。描述解決該問題的算法。
算法描述如下:
(1)?A杯倒入C杯;
(2)?B杯倒入A杯;
(3)?C杯倒入B杯,結束。
2.算法的特性
計算機所能執(zhí)行的算法必需具備以下五個特性。
(1)有窮性。計算機按照算法的規(guī)定執(zhí)行有限次數(shù)的操作后終止。
(2)確定性。算法中的每個步驟都應是確定的,不允許有歧義。
(3)可行性。算法中規(guī)定的每個操作都是計算機可以執(zhí)行的操作。
(4)?0或多個輸入。算法可以無輸入,也可以在程序運行時由用戶通過輸入設備(如鍵盤)將需要使用到的一組數(shù)據(jù)輸入到計算機中。
(5)?1或多個輸出。算法的實現(xiàn)以得到處理結果為目的,沒有輸出的算法是沒有任何意義的。1.2.2算法的描述
進行算法設計時,可以使用不同的算法描述工具,如自然語言、流程圖、偽代碼、計算機語言等。
1.自然語言
自然語言就是人們?nèi)粘I钪惺褂玫恼Z言。自然語言比較符合人們?nèi)粘5乃季S習慣,通俗易懂,初學者容易掌握。但其描述文字顯得冗長,表達時容易出現(xiàn)疏漏,并引起理解上的歧義,不易直接轉化為程序。
2.流程圖
流程圖是一種流傳很廣的描述算法的方法。這種以特定的圖形符號加上說明來描述算法的圖,稱為流程圖。
1)傳統(tǒng)的流程圖
傳統(tǒng)的流程圖由一些圖框和流程線組成。其中:圖框表示各種操作的類型,圖框中的文字和符號表示操作的內(nèi)容,文字可以用中文、英文,也可以用數(shù)學上的寫法,還可以用計算機命令,但要簡潔、明了、易懂,決不能有二義性;流程線表示操作的先后次序、流程走向。常用的符號及其功能如圖1-15所示。圖1-15常用的流程圖符號
【例1-7】
畫出火車站托運行李按重量w計算費用f的算法流程圖,收費標準如下:圖1-16例1-7的傳統(tǒng)流程圖
2)?N-S流程圖
傳統(tǒng)流程圖中靈活的流程線是程序中隱藏問題的禍根。針對這一弊病,美國學者I.Nassi和B.Shneiderman提出了一種新的流程圖形式,稱為N-S流程圖。這種流程圖完全去掉了流程線,算法的每一步都用一個矩形框來描述,將一個個矩形框按執(zhí)行的次序連接起來就是一個完整的算法描述。
例1-7的N-S流程圖如圖1-17所示。圖1-17例1-7的N-S流程圖
3.偽代碼
偽代碼是介于自然語言和計算機語言之間的一種偽碼,它不受計算機語言嚴格語法的限制,描述算法靈活方便,易于轉化為計算機程序。
4.計算機語言
用計算機語言描述算法就是計算機程序,在計算機上執(zhí)行就可得到結果。1.2.3常用算法舉例
有了正確算法,方能使用計算機編程語言進行程序設計。因此我們在此處先掌握一些最基礎的算法,了解程序設計基本思路,為后續(xù)學習編寫程序打下基礎。
無論算法有多復雜,其基本結構只有三種:順序結構、選擇結構、循環(huán)結構。
1.順序結構
順序結構的程序算法描述最為簡單,只要按照解決問題的順序寫出步驟即可,算法步驟執(zhí)行次序為自上而下,依次執(zhí)行。例1-1和例1-2均為順序結構。例1-2的算法描述如圖1-18所示。圖1-18例1-2的流程圖
2.選擇結構
選擇結構對給定的條件進行判斷,根據(jù)判斷的結果來控制程序的流程。例1-7為選擇結構。
【例1-8】
輸入兩個數(shù)給變量a和b,輸出較大的數(shù)值。
算法描述如圖1-19所示。
可用不同的算法解決同一問題。如例1-8的算法還可以用圖1-20來描述。圖1-19例1-8的流程圖1圖1-20例1-8的流程圖2
3.循環(huán)結構
【例1-9】
求s=1?+?2?+?3?+?4?+?…?+?100。
按照人可以理解的自然語言方式描述算法如下:
(1)?1?+?2?+?3?+?4?+?…?+?100→s;
(2)輸出s,結束。
雖然人可以理解步驟(1)中“…”的含義,但計算機是不能理解的,違反了算法的確定性原則,無法轉化為計算機程序。
考慮到一個步驟中將算式全部寫出不現(xiàn)實,將其拆分成若干步,描述如下:
(1)?s=0;
(2)?s+1→s;
(3)?s+2→s;
(4)?s+3→s;
…
(101)?s+100→s;
(102)輸出s,結束。
這樣描述每一步驟簡練,但步驟太多,同樣其中的“…”不能省略。
因此,我們需要考慮的是有沒有方法能夠自動地完成上面的步驟(2)~步驟(101)。仔細觀察步驟(2)~步驟(101)可以發(fā)現(xiàn),這100個步驟的內(nèi)容非常相似,只是加入到s中的數(shù)值從1變化到了100。是否可以只寫1個步驟,同時想辦法讓它重復執(zhí)行100次呢?重復執(zhí)行某些步驟的結構就是循環(huán)結構。上述算法改寫為循環(huán)算法如下:
(1)?s=0,i=1;
(2)?s+i→s,i+1→i;
(3)?i≤100轉步驟(2),否則轉下一步;
(4)輸出s,結束。
上面的算法描述只需要4個步驟,但實際上步驟(2)會在步驟(3)的控制下重復100次,這便是循環(huán)結構,即描述一遍,執(zhí)行若干遍。該算法可用如圖1-21所示的流程圖來描述。圖1-21例1-9的流程圖1.2.4算法拓展
【例1-10】
輸入三個數(shù)給變量a、b、c,輸出最大的數(shù)值。
按照例1-8的第一種算法思路求解本題,該算法可用如圖1-22所示的流程圖來描述。圖1-22例1-10的流程圖1
按照例1-8的第二種算法思路求解本題,該算法可用如圖1-23所示的流程圖來描述。
對比圖1-22及圖1-23兩種算法,都可以求解問題,但第二種算法更簡單,且可以拓展到4個數(shù)、5個數(shù)、…、n個數(shù),當然若數(shù)較多,可使用循環(huán)結構。圖1-23例1-10的流程圖2圖1-24例1-11的流程圖
【例1-11】
輸入10個數(shù),輸出最大的數(shù)值。
繼續(xù)按照例1-10的第二種算法思路求解本題,但由于是10個數(shù),要重復比較9次,因此使用循環(huán)結構。該算法可用如圖1-24所示的流程圖來描述。
【例1-12】
設我國2010年的人口是13億,若放開計劃生育,按5%的年增長率,哪一年達到20億?
我們應逐漸適應計算機程序求解問題的思路。計算機求解該題的思路是使用循環(huán)結構重復計算,即圖1-25例1-12的流程圖
這個算法循環(huán)的次數(shù)我們無需知道,s每一年(即每循環(huán)一次)都在增加,必然會超出20,s超出20則停止循環(huán),此時的y值即問題的答案。 1.3程序中的數(shù)據(jù)
1.3.1變量與常量
1.標識符命名規(guī)則
在程序中有許多需要命名的對象,如變量、符號常量、函數(shù)、自定義類型等,為這些對象所取的名稱稱為標識符。每種程序設計語言都規(guī)定了自己的標識符的命名規(guī)則。
C語言標識符的命名規(guī)則如下:
(1)只能由字母、數(shù)字和下劃線三種字符組成;
(2)第一個字符只能為英文字母或下劃線“_”;
(3)標識符不允許與關鍵字重名。
例如,下面是合法的標識符:
abcdx12345m_n_op_123for
以下是非法的標識符:
3dmax123a+bx.y-123for
還需注意的是:
(1)要考慮標識符的有效長度。標識符的最大長度根據(jù)每個C編譯系統(tǒng)規(guī)定有所不同,但組成標識符的字符個數(shù)不要太多,一般不要超過32個。
(2)要考慮標識符的易讀性。標識符在命名時盡量做到“望名見義”,方能達到提高易讀性的目的。如代表總和的變量名用s或sum,代表平均分的變量名用aver,代表年份的變量名用y或year等。
2.變量
計算機程序中的變量用于保存數(shù)據(jù),對應計算機硬件內(nèi)存儲器的一個或者多個存儲單元。在程序運行過程中,變量的值可以被改變。
1)變量三要素
變量具有三要素:名稱、類型和值。變量的名稱用來區(qū)分并引用不同的變量;變量的類型表明變量用來存放什么類型的數(shù)據(jù);在變量的存儲單元中存放的數(shù)據(jù)稱為變量的值。
2)變量定義
C語言中的變量遵循“先定義,后使用”的原則,即必須先對將要使用的變量進行變量定義才能使用該變量。
變量定義的一般形式如下:
類型說明符
變量名1[,變量名2,…];
其中,方括號內(nèi)的內(nèi)容為可選項。
例如:
inta,b; /*定義a、b為整型變量*/
floatx,y;
/*定義x、y為實型變量*/
charc; /*定義c為字符型變量*/
定義變量時應注意:
(1)變量定義必須在變量使用之前進行,一般放在函數(shù)體的聲明部分。
(2)允許同時定義同一數(shù)據(jù)類型的多個變量,各變量名之間用逗號分隔。
(3)最后一個變量名之后必須以“;”號結束。
(4)類型說明符與變量名之間至少要用一個空格分隔。
4)對變量的基本操作
變量一旦定義后,就可以通過引用變量來進行賦值、取值等操作。所謂引用變量,就是使用變量名來引用變量的內(nèi)存空間。由于變量是內(nèi)存空間的一個標識,因此對變量的操作也就是對其內(nèi)存空間的操作。
有兩個對變量的基本操作:一是向變量中存入數(shù)據(jù),這個操作被稱為給變量賦值,變量中的舊值將被替換為賦予的新值;二是取得變量當前的值,以便在程序運行過程中使用,這個操作被稱為“取值”,取值操作不會改變變量中的值。例如:
inta,b; /*定義a、b為整型變量*/
a=3; /*給a賦值*/
b=a; /*取a值并賦值給b*/
其中,“=”是賦值運算符。“a=3;”是對變量的賦值操作,即將運算符“=”右側的數(shù)據(jù)3存儲到左側變量a的內(nèi)存空間中(賦值操作)。而“b=a;”包括兩個過程:先獲取a的內(nèi)存空間中存儲的值3(取值操作),然后將該值3存儲到b的內(nèi)存空間中(賦值操作)。其操作過程可用圖1-26來表示。圖1-26變量賦值、取值操作
3.常量
常量是在程序運行過程中值保持固定不變的數(shù)據(jù)。
1)常量
在C程序中,為了能給變量直接賦初值或用數(shù)據(jù)參與運算,經(jīng)常需要使用數(shù)值、字符、字符串等。這些數(shù)據(jù)通常能直接從字面形式判別其類型,稱為字面常量,或稱為直接常量。如1、-3、0為整數(shù),1.2、-3.6為實數(shù),'a'、'B'為字符,"China"為字符串等。
2)符號常量
在C語言中還可為常量命名,稱為符號常量。符號常量跟變量一樣必須遵循“先定義,后使用”的原則,常量命名遵循標識符命名規(guī)則。
C語言中定義符號常量的一般形式如下:
#define符號常量名
常量
其中“#define”是宏定義命令的專用定義符,在后面單元中將講到。例如:
#definePI3.14159
#defineMAX100
以上定義符號常量PI為常數(shù)3.14159,符號常量MAX為常數(shù)100,在該程序中但凡出現(xiàn)“PI”之處,就以數(shù)值3.14159替換,但凡出現(xiàn)“MAX”之處,就以數(shù)值100替換。
需要注意的是,符號常量仍是常量,不允許改變符號常量的值,企圖對符號常量進行賦值的操作是不合法的。
符號常量名一般采用大寫字母,而變量名采用小寫字母。1.3.2基本數(shù)據(jù)類型
為了能將程序中指定的數(shù)據(jù)精確地用相應的內(nèi)存單元來存儲和操作,C語言內(nèi)部預定義了一些數(shù)據(jù)類型,這些類型稱為基本數(shù)據(jù)類型,其名稱是預定義的關鍵字。同時,為了在程序中能直接訪問內(nèi)存單元,C語言還提供了指針類型。除此之外,C語言還允許用戶根據(jù)基本數(shù)據(jù)類型和指針類型構造出更為復雜的數(shù)據(jù)類型,如數(shù)組、結構體、共用體等用于多個或多項數(shù)據(jù)的描述。C語言中的數(shù)據(jù)類型可分為基本類型、構造類型、指針類型和空類型四類,如圖1-27所示。圖1-27C語言的數(shù)據(jù)類型
1.整數(shù)類型
1)數(shù)據(jù)類型
C語言的整數(shù)類型有6種。其中,有符號類型3種:基本整型(int)、短整型(short或shortint)、長整型(long或longint);無符號類型3種:無符號基本整型(unsigned或unsignedint)、無符號短整型(unsignedshort或unsignedshortint)、無符號長整型(unsignedlong或unsignedlongint)。
short、int、long的存儲空間大小不同,如圖1-28所示。需要注意的是,ANSIC的int類型整數(shù)在計算機中是用2字節(jié)的連續(xù)內(nèi)存單元來存儲的,但是VisualC++6.0所支持的int為4字節(jié)。由于本書的開發(fā)環(huán)境為VisualC++6.0,因此本書中的int及unsignedint類型是按照4字節(jié)存儲的形式講解的。個別例題有可能在不同的編譯系統(tǒng)中,由于int及unsignedint類型存儲為2或4字節(jié)的不同而導致得到不同的運行結果。圖1-28不同整型的存儲空間大小
2)整型常量
(1)整型常量的表示方法。
整型常量就是整數(shù),在C語言中,整數(shù)可用十進制、八進制和十六進制三種形式表示。
①十進制形式。十進制形式整數(shù),其數(shù)碼為0~9,數(shù)值前可以有+、-符號。注意,十進制整數(shù)的數(shù)值前面不允許加0,如0123不是十進制整數(shù)。
以下各數(shù)是合法的十進制整型常量:
135
-246 67890
以下各數(shù)不是合法的十進制整型常量:
3. 0396 26D
②八進制形式。八進制形式整數(shù),其數(shù)碼為0~7,必須以0開頭,即以0作為八進制數(shù)的前綴。
以下各數(shù)是合法的八進制整型常量:
011 0102 0177777
以下各數(shù)不是合法的八進制整型常量:
123
0129
③十六進制形式。十六進制形式整數(shù),其數(shù)碼為0~9及A~F或a~f,必須以0x或0X開頭,即以0x或0X作為十六進制數(shù)的前綴。
以下各數(shù)是合法的十六進制整型常量:
0x11
0XA9 0xabcd
以下各數(shù)不是合法的十六進制整型常量:
23AB 0x5H
(2)整型常量的類型。
整型常量也有其類型,具體判別方法如下:
①如不特別指明,一個整型常量被認為是int類型。
②如果一個整型常量加后綴L或l,則被認為是long類型,如123L、-78l。
③如果一個整型常量加后綴U或u,則被認為是unsigned類型,如3U、-1u。-1u被理解為無符號數(shù),即4294967295。
3)整型變量
使用整型的六種類型說明符之一對變量進行定義后,就可以使用整型變量了。
【例1-13】
整型變量的定義與使用。圖1-29例1-13程序運行結果
2.實數(shù)類型
由于計算機中的實型數(shù)據(jù)是以浮點形式表示的,即小數(shù)點的位置可以是浮動的,因此實型數(shù)據(jù)也稱為浮點型數(shù)據(jù)。
1)數(shù)據(jù)類型
C語言的實數(shù)類型有三種:單精度實型(float)、雙精度實型(double)、長雙精度實型(longdouble)。但由于longdouble類型在不同的編譯系統(tǒng)中存儲字節(jié)數(shù)不同,有的是8字節(jié),有的是10、12或16字節(jié),且該類型使用不多,因此不展開講解。
float、double、longdouble類型數(shù)據(jù)的存儲空間大小不同,如圖1-30所示。圖1-30不同實型的存儲空間大小
有效數(shù)字是指數(shù)據(jù)在計算機中存儲時能夠精確表示的數(shù)字位數(shù)。實型數(shù)據(jù)的存儲形式?jīng)Q定了能提供的有效位數(shù)有限,有效數(shù)字位數(shù)以外的數(shù)字是不準確的,因此實型數(shù)據(jù)的表示可能存在誤差。
(2)實型常量的類型。
實型常量的類型判別方法如下:
①如不特別指明,一個實型常量被認為是double類型。
②如果一個實型常量加后綴F或f,則被認為是float類型,如12.56F、2.1e5f。
3)實型變量
使用實型的三種類型說明符之一對變量進行定義后,就可以使用實型變量了。
程序運行結果如圖1-31所示。注意本例的輸出結果出現(xiàn)誤差,并非預期的8888.888880的結果,這是因為單精度實型數(shù)據(jù)的有效數(shù)字位數(shù)只有6~7位。圖1-31例1-14程序運行結果
3.字符類型
計算機處理的數(shù)據(jù)不僅有整數(shù)、實數(shù),還包括字符這樣的非數(shù)值數(shù)據(jù)。在C語言中字符數(shù)據(jù)包括字符和字符串兩種。
1)數(shù)據(jù)類型
C語言的字符類型關鍵字為char,所占存儲空間為1字節(jié)。字符型數(shù)據(jù)在計算機中存儲,是字符的ASCII碼值的二進制形式。
2)字符常量
C語言中有兩種形式的字符常量:普通字符和轉義字符。
(1)普通字符:用單引號括起來的單個字符,如‘a(chǎn)’、‘Y’、‘@’、‘5’。
(2)轉義字符:以“\”開頭的具有特殊含義的字符。轉義字符有其特定的含義,不同于字符原本的含義,故稱其為“轉義”字符。常用的轉義字符及其含義見表1-3。圖1-32例1-15程序運行結果
3)字符型變量
使用類型說明符char對變量進行定義后,就可以使用字符型變量了。
由于字符型變量在內(nèi)存中存放的是字符的ASCII碼值,因此也可以把它們看成是整型量。字符型數(shù)據(jù)與整型數(shù)據(jù)之間的轉換比較方便。字符數(shù)據(jù)可以參與算術運算,也可以與整型量相互賦值,還可以按照整數(shù)形式輸出。圖1-33例1-16程序運行結果
字符
‘a(chǎn)’
的ASCII值為97,字符
‘A’
的ASCII值為65。變量的輸出形式取決于printf函數(shù)格式控制字符串中的格式符:當格式符為“%c”時,輸出的形式為字符;當格式符為“%d”時,輸出的形式為整數(shù)。
【例1-17】
大小寫字母的轉換。
#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程序運行結果
4.字符串常量
C語言中的字符串常量是由一對雙引號括起的字符序列。以下字符串均為合法的字符串常量:
“Howareyou”“12345”“x”“”(空串)
字符串中字符的個數(shù)稱為字符串的長度,以上4個字符串的長度分別為11、5、1、0。
字符串在計算機中存儲,是將一個個字符按順序放在連續(xù)的存儲單元中,每一個字符占1字節(jié)存儲單元保存其ASCII碼值,最后還要額外使用1字節(jié)存儲單元保存字符串結束符'\0'。因此,長度為n的字符串需要n+1字節(jié)的存儲單元保存。上面的4個字符串在內(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程序運行結果1.3.3知識拓展——數(shù)據(jù)的表示方法
1.內(nèi)存單元的概念
為了便于內(nèi)存管理,通常將8位(bit)組成一個基本的內(nèi)存單元,稱為1字節(jié)(Byte)。為了便于內(nèi)存單元的訪問,計算機系統(tǒng)還為每一個內(nèi)存單元分配了一個相對固定的編碼,該編碼就是內(nèi)存單元的地址。
2.原碼、反碼和補碼
在計算機內(nèi)部,所有的信息要用二進制來表示,二進制表示的數(shù)值稱為機器數(shù)。不考慮正、負的機器數(shù)稱為無符號數(shù),考慮正、負的機器數(shù)稱為有符號數(shù)。為了在計算機中正確地表示有符號數(shù),通常規(guī)定最高位為符號位,并用0表示正,用1表示負,余下各位表示數(shù)值。整數(shù)常用的表示方式有原碼、反碼、補碼。
1)原碼
原碼表示法在數(shù)值前面增加了一位符號位,即最高位為符號位:正數(shù)的該位為0,負數(shù)的該位為1(0有兩種表示:+0和-0),其余位表示數(shù)值的大小。如數(shù)值11的原碼為00001011,-11的原碼為10001011。
原碼的符號位不能直接參與運算,必須和其他位分開,這就增加了硬件的開銷和復雜性。
2)反碼
反碼表示法規(guī)定:正數(shù)的反碼與其原碼相同;負數(shù)的反碼是對其原碼逐位取反,但符號位除外。如數(shù)值11的反碼為00001011,-11的反碼為11110100。
3)補碼
補碼表示法規(guī)定:正數(shù)的補碼與其原碼相同;負數(shù)的補碼是在其反碼的末位加1。如數(shù)值11的補碼為00001011,-11的補碼為11110101。
對于整數(shù)來說,在計算機內(nèi)部都是用補碼來存儲的。
(1)用補碼理解整數(shù)類型的表示范圍。
1字節(jié)(8位)存儲單元存儲二進制數(shù)補碼的有符號數(shù)范圍是:
00000000~01111111~10000000~11111111
0127-128-1
-128~127即-27~27-1。
2字節(jié)(16位)存儲單元存儲二進制數(shù)補碼的有符號數(shù)范圍是-32?768~32?767,即-215~215-1。4字節(jié)的有符號數(shù)范圍則是-231~231-1。
1字節(jié)(8位)存儲單元存儲二進制數(shù)補碼的無符號數(shù)范圍是00000000~11111111,最高位的0或1不再是符號位而是數(shù)值部分,則數(shù)據(jù)范圍為0~255,即0~28-1。
2字節(jié)存儲單元存儲二進制數(shù)補碼的無符號數(shù)范圍是0~65?535,即0~216-1。4字節(jié)的無符號數(shù)范圍則是0~232-1。(2)用補碼理解有符號數(shù)、無符號數(shù)的轉換。
【例1-19】
有符號數(shù)、無符號數(shù)的轉換。
#include<stdio.h>
main()
{ unsignedshorta;
a=-1;
printf(“%u\n”,a);
}
程序運行結果如圖1-36所示。圖1-36例1-19程序運行結果
例1-19中變量a為unsignedshort類型,是用2字節(jié)存儲的無符號數(shù)。-1的補碼為1111111111111111,賦值給a時,由于a是無符號數(shù),最高位的1不是符號位而表示數(shù)值215。1111111111111111=215+214+…+21+20=216-1=65535。
3.字符數(shù)據(jù)的表示
計算機中的字符數(shù)據(jù)也需用二進制編碼才能在計算機中存儲、傳輸并進行處理,即字符編碼。英文字符包括數(shù)字、字母、符號、控制符號等。目前廣泛采用美國標準信息交換編碼(AmericanStandardCodeInformationInterchange,ASCII)作為英文字符的編碼標準,該編碼已被國際標準化組織ISO采用,成為一種國際通用的信息交換用標準代碼。附錄B中列出了ASCII碼字符集。
1.4常用表達式和運算符
1.4.1表達式、運算符概述
1.表達式
表達式是由運算對象(操作數(shù))、運算符(操作符)按照C語言的語法規(guī)則構成的符號序列。表達式可以通過運算產(chǎn)生一個結果或完成某種操作。正是由于C語言具有豐富的多種類型的表達式,才得以體現(xiàn)出C語言所具有的表達能力強、使用靈活、適應性好的特點。
2.運算符
C語言的運算符很豐富,運算符是C語言用于描述對數(shù)據(jù)進行運算的符號。
運算符可按其運算對象的個數(shù)分為3類:單目運算符、雙目運算符、三目運算符。
運算符還可以按其功能分為算術運算符、關系運算符、條件運算符、邏輯運算符、賦值運算符、逗號運算符、位運算符及其他運算符等。
3.優(yōu)先級和結合性
當一個表達式中出現(xiàn)多種不同的運算符時,如何進行運算?這涉及運算符的兩個重要概念,即優(yōu)先級和結合性(又稱結合方向)。
優(yōu)先級指不同運算符進行運算時的優(yōu)先次序。C語言規(guī)定了各個運算符的優(yōu)先等級,用數(shù)值來反映優(yōu)先等級的高低,數(shù)值越小,優(yōu)先級越高。在同一表達式中出現(xiàn)不同運算符時,優(yōu)先級較高的運算符將優(yōu)先進行運算,如數(shù)學中四則運算的“先乘除后加減”。C語言中,通常所有單目運算符的優(yōu)先級高于雙目運算符的優(yōu)先級。()、[]、->、·?的優(yōu)先級最高,而逗號運算符的優(yōu)先級最低。
結合性是指同一表達式中相同優(yōu)先級的多個運算是自左向右還是自右向左進行運算,如數(shù)學中的四則運算就是自左向右運算。通常,在C語言中,單目運算符的結合方向是自右向左;雙目運算符的結合方向大部分是自左向右,只有賦值和復合賦值運算符的結合方向是自右向左;三目運算符的結合方向是自右向左。
關于C語言運算符的含義、類型、優(yōu)先級、結合性等問題見附錄C。
1.4.2算術運算符及表達式
數(shù)值的算術運算是程序中常見的。C語言中的算術運算符只能實現(xiàn)四則運算等基本功能,沒有乘方、開方等運算符,這些功能是通過頭文件“math.h”中定義的數(shù)學函數(shù)來實現(xiàn)的(詳見附錄D)。
1.算術運算符
1)單目算術運算符
(1)?+:正號運算符,優(yōu)先級2級,具有右結合性,如+3,+1.25。
(2)?-:負號運算符,優(yōu)先級2級,具有右結合性,如-a。
2)雙目算術運算符
(1)?*:乘法運算符,優(yōu)先級3級,具有左結合性,如3*2,a*b。
(2)?/:除法運算符,優(yōu)先級3級,具有左結合性,如5?/?2,a/b。
(3)?%:求余運算符,優(yōu)先級3級,具有左結合性,注意要求%兩側運算對象均為整型數(shù)據(jù)。求余運算結果的符號與被除數(shù)(左操作數(shù))的符號相同。
求余運算符也稱為求模運算符,它最常用的功能如下:
①用a%b是否等于0判斷a是否能被b整除。
②用x%10截取x的個位數(shù),用x%100截取x的低2位數(shù)等。
(4)?+?:加法運算符,優(yōu)先級4級,具有左結合性。
(5)?-?:減法運算符,優(yōu)先級4級,具有左結合性。
2.算術表達式
算術表達式是用算術運算符和括號將運算對象連接起來的、符合C語言語法規(guī)則的式子。
使用算術表達式時應注意以下幾點:
(1)操作數(shù)類型自動轉換。
①雙目算術運算對象的數(shù)據(jù)類型一致。運算對象的數(shù)據(jù)類型一致時,運算結果的類型也將一致(char、short類型除外)。如當運算對象均為整數(shù)時,運算結果也為整數(shù),故5?/?2的結果是2。
②雙目算術運算對象的數(shù)據(jù)類型不一致。若運算對象的數(shù)據(jù)類型不一致,系統(tǒng)自動按規(guī)律先將運算對象轉換為同一類型,然后再進行運算。C語言編譯器會自動將低類型的操作數(shù)向高類型進行轉換,稱為類型的自動轉換。轉換的規(guī)則如圖1-37所示。圖1-37標準類型數(shù)據(jù)參與算術運算的轉換規(guī)則
圖中:橫向箭頭表示必須的轉換,如兩個char類型數(shù)據(jù)參與算術運算,盡管類型相同,但兩者仍要先轉換為int類型再進行算術運算,運算結果也為int類型??v向箭頭表示當算術運算符兩側的運算對象為不同類型時的轉換方向,如一個double型數(shù)據(jù)與一個int型數(shù)據(jù)一起運算,需要由低向高先將int型數(shù)據(jù)轉換為double型,然后再進行運算,運算結果為double型。這些轉換由系統(tǒng)自動進行,使用時只需要了解這種轉換、知道結果的類型即可。
注意:在VisualC++6.0中,float類型數(shù)據(jù)無需轉換為double類型即可參與算術運算。
(2)代數(shù)式與表達式。
為了能讓C程序進行數(shù)值計算,還必須將代數(shù)式寫成C語言合法的表達式。例如,若有代數(shù)式:
②適當加上圓括號。使用圓括號可以改變表達式的運算順序,還應有意識地加上一些圓括號來增強程序可讀性,多層括號均使用圓括號“()”,注意左右括號必須成對出現(xiàn)。事實上,()也是運算符,它的優(yōu)先級最高,所以先求解括號內(nèi)的子表達式。
③數(shù)據(jù)類型。由于算術表達式運算時操作數(shù)的數(shù)據(jù)類型對結果的數(shù)據(jù)類型是有影響的,因此在書寫表達式時要注意。如:
若將表達式寫成1/2*a*b*c,則無論a、b、c的值是多少,表達式的結果均為0。這是因為按照算術表達式的運算規(guī)則,首先計算1/2,其結果為0,再乘以其他數(shù)據(jù)結果也必然為0了。為了保證計算結果的正確性,應盡可能將操作數(shù)的類型寫成表達式中的最高類型,即上述表達式應寫成1.0/2.0*a*b*c。圖1-38例1-20程序運行結果
例1-20中,表達式i/100可截取變量i百位以上的數(shù)據(jù),結果為2;表達式i%10可獲取i個位上的數(shù)值,結果為6;表達式i/10%10先截取變量i十位以上的數(shù)據(jù)25,再由%10獲取個位上的數(shù)值,結果為5;a、b、c分別獲取了i?(變量i當前的數(shù)值為一個3位數(shù)256)的百、十、個位數(shù)。
表達式9/2*f1,先計算9/2,結果為4,4*f1為8.0,故f2的值為8.0。1.4.3賦值運算符及表達式
賦值運算符用來構成賦值表達式給變量進行賦值操作。
1.普通賦值運算符及表達式
1)賦值運算符
賦值運算符用賦值符號“=”表示,其功能為將賦值運算符右側的數(shù)據(jù)賦給賦值運算符左側的變量。
賦值運算符的優(yōu)先級很低,僅高于逗號運算符,具有右結合性。
2)賦值表達式
由賦值運算符將一個變量和一個表達式連接起來的表達
式稱做賦值表達式。它的一般形式如下:
變量名=表達式
賦值表達式將賦值運算符右側的表達式的運算結果賦給賦值運算符左側的變量。注意:賦值表達式中,賦值運算符的左側必須是變量。圖1-39例1-21程序運行結果
例1-21中,表達式a=b=8是合法的,在表達式中出現(xiàn)了2個賦值運算符,優(yōu)先級相同,由于賦值運算符具有右結合性,因此先求解子表達式b=8,b賦值為8,然后再求解子表達式a=b,a賦值為8。
3)賦值表達式的類型轉換
當賦值運算符兩側運算對象的數(shù)據(jù)類型不同時,系統(tǒng)也將進行自動類型轉換,但該自動轉換的規(guī)則不同于算術運算的由低向高的轉換規(guī)則。
賦值運算的類型轉換規(guī)則為:將賦值運算符右側表達式的類型轉換為左側變量的類型。因為左側的變量一經(jīng)定義,其數(shù)據(jù)類型不再改變,當中存放的數(shù)據(jù)自然是此數(shù)據(jù)類型。
2.復合賦值運算符及表達式
1)復合賦值運算符
C語言還允許賦值運算符“=”與算術運算符和位運算符聯(lián)合使用,構成復合賦值運算符,使得表達式更加精練。
復合賦值運算符有:
+=、-=、*=、/=、%=、|=、&=、^=、<<=、>>=
所有賦值運算符的優(yōu)先級全部相同,為14級,均具右結合性。2)復合賦值表達式
復合賦值表達式的一般形式如下:
變量名
復合賦值運算符
表達式
復合賦值表達式的作用等價于:
變量名=變量名運算符(表達式)
圖1-40例1-22程序運行結果1.4.4自增、自減運算符及表達式
自增、自減運算符為變量加1、減1提供了簡單有效的方法。
1.一般使用方法
(1)?++:自增運算符,使變量的值增加1。
(2)?--:自減運算符,使變量的值減少1。
兩者均為單目運算符,優(yōu)先級2級,具有右結合性。
當自增表達式單獨形成語句使用時,無論是其前置運算形式“++變量”,還是其后置運算形式“變量++”,都是僅對變量自增1,兩種形式?jīng)]有區(qū)別。自減表達式亦然。圖1-41例1-23程序運行結果
2.前置、后置運算應用于表達式的區(qū)別
自增、自減的前置、后置表達式單獨使用時是沒有區(qū)別的,但當它們作為子表達式出現(xiàn)在其他表達式內(nèi)部時就有著明顯的區(qū)別。
1)前置運算
前置運算:將?++?或?--?運算符置于變量之前,一般形式如下:
++變量
--變量
其功能是使變量的值增、減1,然后再以變化后的變量值參與表達式中的其他運算,即先增減、后運算。
2)后置運算
后置運算:將?++?或?--?運算符置于變量之后,一般形式如下:
變量++
變量--
其功能是變量先參與表達式中的其他運算,然后再使變量的值增、減1,即先運算、后增減。圖1-42例1-24程序運行結果
3.關于自增、自減運算符及表達式的說明
(1)自增、自減運算符實際上也是做賦值運算,因此不能應用于常量和表達式,其操作對象只能是變量。如6--、(a+3)++是非法的表達式。
(2)一般自增、自減表達式或是以表達式語句的形式出現(xiàn),或是出現(xiàn)在for循環(huán)語句中使循環(huán)控制變量加、減1,或應用于指針變量,使指針指向下、上一個地址。將自增、自減表達式應用于另一個表達式內(nèi)部的形式,初學者在尚未熟練掌握時盡量不要使用。
(3)盡量不要使用諸如i+++j、(i++)+(i++)此類容易產(chǎn)生歧義的形式。1.4.5逗號運算符及表達式
逗號運算符“,”用于將多個表達式連接起來,構成一個逗號表達式。逗號運算符又稱順序求值運算符。
逗號運算符為雙目運算符,其優(yōu)先級是C中所有運算符中最低的,為15級,具有左結合性。
逗號運算符可以擴展為n元運算的形式:
表達式1,表達式2,…
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度股權轉讓中介服務協(xié)議范本匯編12篇
- 二零二五年度高速公路施工班組勞務分包協(xié)議3篇
- 二零二五年度證券市場財產(chǎn)保全擔保書范本3篇
- 2024版信用卡代還款借款合同范文
- 二零二五年度石油天然氣工程監(jiān)理合同終止協(xié)議范本2篇
- 2024技術成果轉化合同
- 二零二五年度集體住房產(chǎn)權交易與維修合同3篇
- 學生情緒管理對學習動力的影響
- 二零二五年度高端電子產(chǎn)品OEM加工合作協(xié)議2篇
- 學校設施改進報告模板
- 2024年消防月全員消防安全知識培訓
- 2024年航空職業(yè)技能鑒定考試-航空乘務員危險品考試近5年真題集錦(頻考類試題)帶答案
- 表 6-1-12? 咽喉部檢查法評分標準
- 低壓電工培訓課件-電工常用工具、儀表的使用
- 林業(yè)專業(yè)知識考試試題及答案
- 2024年湖南省長沙市中考數(shù)學試題(含解析)
- 2024年大學華西醫(yī)院運營管理部招考聘用3人高頻難、易錯點500題模擬試題附帶答案詳解
- 分股退股協(xié)議書模板下載
- 深圳市南山區(qū)2024-2025學年數(shù)學三年級第一學期期末教學質量檢測模擬試題含解析
- 配電網(wǎng)工程工藝質量典型問題及解析
- 2023年二輪復習解答題專題二:一次函數(shù)的應用方案設計型(原卷版+解析)
評論
0/150
提交評論