參考資料:高教版《全國計算機(jī)等級考試二級教程 C語言程序設(shè)計》口予、《21天學(xué)通C語言》
簡單的C語言程序的構(gòu)成和格式
例2.1(對原程序的注釋做了一點(diǎn)點(diǎn)修改):
#include <stdio.h>
main()
{
double a, b, area;
/*將矩形的兩條長邊分別賦給a和b*/
a = 1.2;
b = 3.6;
area = a * b; //計算矩形的面積并存儲到變量area中
printf("a = %f, b = %f, area = %f \n", a, b, area) ; //輸出矩形的兩條長邊和面積
}
以上程序中毡代,main是主函數(shù)名,C語言規(guī)定必須用main作為主函數(shù)名轧拄。函數(shù)是一段執(zhí)行某項任務(wù)的程序代碼。在最簡單的情況下,main()函數(shù)由函數(shù)名main卢佣,其后一對圓括號(其中包含void)和一對花括號{}組成。在大多數(shù)編譯器中箭阶,省略圓括號中的void不影響程序的運(yùn)行(但是虚茶,ANSI標(biāo)準(zhǔn)規(guī)定應(yīng)該在圓括號中寫上void,以表示沒有給main函數(shù)發(fā)送任何消息)尾膊。
每一個C程序都必須有一個且只能有一個主函數(shù)媳危。一個C程序總是從主函數(shù)開始運(yùn)行。
用一對花括號括起來的部分稱為函數(shù)體冈敛。函數(shù)體內(nèi)通常有定義(說明)部分和執(zhí)行語句部分待笑。執(zhí)行部分的語句稱為可執(zhí)行語句,必須放在定義部分之后抓谴。C程序的每一條定義語句和執(zhí)行語句都必須用分號“暮蹂;”結(jié)束。
程序中的#include指令通常稱為命令行癌压,必須用“#”號開頭仰泻,行尾不加分號,它不是C程序的語句滩届。#include指令命令C編譯器集侯,在編譯時將包含文件的內(nèi)容添加進(jìn)程序中。包含文件是獨(dú)立的磁盤文件帜消,內(nèi)含程序或編譯器要使用的信息棠枉。這些包含文件(也稱頭文件)由編譯器提供,所有包含文件的擴(kuò)展名都是.h泡挺。
在例2.1中辈讶,#include指令被解釋為“添加stdio.h文件的內(nèi)容”。
在編寫程序時娄猫,可以在程序中加入注釋贱除,以說明變量的含義、語句的作用和程序段的功能媳溺,從而幫助人們閱讀和理解程序月幌。
程序中以/*開始,以*/結(jié)尾的部分褂删,或者以//開始的單獨(dú)一行都稱為注釋飞醉。編譯器會忽略所有的注釋。第一種風(fēng)格可以寫成多行(跨行),第二種風(fēng)格只用于單行注釋缅帘。
注意:注釋不能嵌套轴术。
標(biāo)識符,常量和變量
標(biāo)識符
在C語言中钦无,有許多符號(如變量名逗栽,函數(shù)名,數(shù)組名等)失暂,都必須遵守一定的規(guī)則彼宠,按此規(guī)則命名的符號稱為標(biāo)識符。
合法標(biāo)識符的命名規(guī)則是:標(biāo)識符可由字母弟塞,數(shù)字或下劃線組成凭峡,并且第一個字母必須為字母或下劃線。
在C語言的標(biāo)識符中决记,大寫字母和小寫字母被認(rèn)為是兩個不同的字符摧冀。
對于標(biāo)識符的長度,C語言的編譯系統(tǒng)是有規(guī)定的系宫,一般為31個字符(實際上可能會更長索昂,但是編譯器只會查看前31個字符)。
C語言的標(biāo)識符可以分為以下三類:
關(guān)鍵字
C語言已經(jīng)預(yù)先規(guī)定了一批標(biāo)識符扩借,它們在程序中都代表著固定的含義椒惨,這些標(biāo)識符稱為關(guān)鍵字。例如潮罪,用來說明變量類型的int康谆,double以及if語句中的else等都已有了專門的用途,不能再用作變量名或函數(shù)名嫉到。
預(yù)定義標(biāo)識符
所謂預(yù)定義標(biāo)識符是指在C語言中預(yù)先定義并具有特殊含義的標(biāo)識符秉宿,如C語言提供的庫函數(shù)名(如printf)和預(yù)編譯處理命令(如define)等。C語言允許把這類標(biāo)識符重新定義另作他用屯碴,但這將使這些標(biāo)識符失去預(yù)先定義的原意。
用戶標(biāo)識符
由用戶根據(jù)需要定義的標(biāo)識符稱為用戶標(biāo)識符膊存,又稱自定義標(biāo)識符导而。用戶標(biāo)識符一般用來給變量、函數(shù)隔崎、數(shù)組等命名今艺。
常量
所謂常量是指在程序運(yùn)行過程中,其值不能被改變的量爵卒。在C語言中虚缎,有字面常量和符號常量兩種類型的常量,它們分別有特殊的用途。
字面常量
字面常量是根據(jù)需要直接鍵入源代碼中的值实牡。下面是字面常量的兩個示例:
int count = 20;
float tax_rate = 0.28;
20和0.28都是字面常量陌僵,分別儲存在count和tax_rate中。是否有小數(shù)點(diǎn)決定了是整型常量還是浮點(diǎn)型常量创坞。小數(shù)點(diǎn)導(dǎo)致C編譯器將該常量視為雙精度數(shù)碗短,如果沒有小數(shù)點(diǎn),C編譯器將其視為整型常量题涨。
整型常量可以用十進(jìn)制偎谁,八進(jìn)制,十六進(jìn)制等形式來表示纲堵。
十進(jìn)制基本常量用一串連續(xù)的數(shù)字來表示巡雨,例如32767,-32768,0等席函。
八進(jìn)制數(shù)也是用一串連續(xù)的數(shù)字表示铐望,但其開頭必須為數(shù)字0,例如010,011,016等是合法的八進(jìn)制數(shù)向挖,018不是合法的八進(jìn)制數(shù)蝌以。
十六進(jìn)制數(shù)用數(shù)字0和字母x(或X)開頭,如0x10,0xde,0xf等都是合法的16進(jìn)制數(shù)何之。十六進(jìn)制數(shù)中的字母a,b,c,d,e,f既可以用小寫也可以用大寫跟畅。
符號常量
在C語言中,可以用一個符號名來代表一個常量溶推,稱為符號常量徊件。這個符號名必須在程序中進(jìn)行特別的“指定”,并符合標(biāo)識符的命名規(guī)則蒜危。
符號常量的值只需要輸入一次虱痕,在首次定義它時完成。
定義符號常量
C語言有兩種方法定義符號常量:#define指令和const關(guān)鍵字辐赞。#define指令的格式如下:
#define CONSTNAME literal
以上代碼創(chuàng)建了一個名為CONSTNAME部翘,值為literal的符號常量。按照慣例响委,符號常量名中所有字母都要大寫新思,這樣做很容易區(qū)分常量名和變量名(都是小寫)。
define的工作原理
例2.2 計算圓的面積(把原程序的注釋改了一下風(fēng)格赘风,因為自己比較習(xí)慣用這個風(fēng)格的注釋):
#include <stdio.h>
#define PI 3.14159 //定義了一個常量PI
main()
{
double r, s;
r = 5.0;
s = PI * r * r;
printf("s = %f \n", s);
}
程序中用#define命令行定義PI代表一串字符3.14159夹囚。#define的工作原理是,在對程序進(jìn)行編譯時邀窃,凡是本程序中出現(xiàn)PI的地方荸哟,編譯程序均用3.14159進(jìn)行代替。注意,#define不會替換名稱鞍历、雙引號或程序注釋中與常量名相同的部分舵抹。
用const關(guān)鍵字定義符號常量
從嚴(yán)格意義上來說,用const關(guān)鍵字定義的符號常量實質(zhì)是變量堰燎。const是一個修飾符掏父,可應(yīng)用于任何變量聲明之前。在程序執(zhí)行期間秆剪,不能修改用const聲明的變量赊淑。下面是const使用的示例:
const int count = 100;
const float pi = 3.14159;
const long debt = 12000000, float tax_rate = 0.21;
const影響本行聲明的所有變量。
如果要在程序中修改const變量仅讽,編譯器會給出一條錯誤消息陶缺。
變量
所謂變量是指在程序運(yùn)行過程中其值可以改變的量。一個變量實質(zhì)上是代表了內(nèi)存中的若干個存儲單元洁灵。
C語言規(guī)定饱岸,所有的變量都必須先定義后使用。對變量的定義通常放在函數(shù)體內(nèi)的前部徽千,但也可以放在函數(shù)的外部或復(fù)合語句的開頭苫费。
數(shù)值類型
C語言提供多種不同類型的數(shù)值變量,不同類型的數(shù)值需要不同的內(nèi)存空間双抽,而且不同類型數(shù)值的數(shù)學(xué)運(yùn)算也有所不同百框。
C語言的數(shù)值變量包含以下兩大類:
- 整型變量,儲存沒有小數(shù)部分的值牍汹。
- 實型變量(浮點(diǎn)型變量)铐维,儲存帶有小數(shù)部分的值。
上述兩大類又包含兩種或多種指定的變量類型慎菲。
變量類型 | 關(guān)鍵字 | 所需內(nèi)存(字節(jié)) | 取值范圍 |
---|---|---|---|
字符 | char | 1 | -128~127 |
短整型 | short | 2 | -32768~32767 |
整形 | int | 4 | -2147483648~214738647 |
長整型 | long | 4 | --2147483648~214738647 |
長長整型 | long long | 8 | -9223372036854775808~9223372036854775807 |
無符號字符 | unsigned char | 1 | 0~255 |
無符號短整型 | unsigned short | 2 | 0~65535 |
無符號整型 | unsigned int | 4 | 0~4292967295 |
無符號長整型 | unsigned long | 4 | 0~4292967295 |
無符號長長整型 | unsigned long long | 8 | 0~18446744073709551615 |
單精度浮點(diǎn)型 | float | 4 | 1.2E-38~3.4E38 |
雙精度浮點(diǎn)型 | double | 8 | 2.2E-308~1.8E308 |
雖然數(shù)據(jù)類型的大小依不同的計算機(jī)平臺而異嫁蛇,但是C語言保證在不同平臺下這5條規(guī)則不變:
- char的大小是1字節(jié)。
- short的大小不超過(小于或等于)int的大小露该。
- int的大小不超過long的大小睬棚。
- unsigned的大小與int的大小相等。
- float的大小不超過doube的大小解幼。
整數(shù)在內(nèi)存中的存儲形式
內(nèi)存儲器的最小存儲單位稱為位(bit)闸拿,由于只能存放0或1,因此稱為二進(jìn)制位书幕。
大多數(shù)計算機(jī)把8個二進(jìn)制位組成一個字節(jié)(byte),并給每一個字節(jié)分配一個地址揽趾。
若干個字節(jié)組成一個字(word)台汇,用一個字來存放一條機(jī)器指令或一個數(shù)據(jù)。
通常把一個字節(jié)中的最右邊一位稱為最低位,最左邊一位稱為最高位苟呐。
對于一個有符號整數(shù)痒芝,其中最高位用來存放整數(shù)的符號,稱為符號位牵素。若是正整數(shù)严衬,最高位放置0;若是負(fù)整數(shù)笆呆,最高位放置1请琳。
變量聲明
在C程序中,要先聲明變量才能使用赠幕。變量聲明的格式如下:
typename varname;
typename指定變量類型俄精,varname指定變量名¢叛撸可以在一行聲明多個變量竖慧,各變量之間用逗號隔開。如:
int count, number, start;
typedef關(guān)鍵字
typedef關(guān)鍵字用于為已存在的數(shù)據(jù)類型創(chuàng)建新的名稱逆屡。實際上圾旨,typedef創(chuàng)建了一個別名。例如:
typedef int integer;
這條語句為int創(chuàng)建了一個別名integer魏蔗。在隨后的程序中砍的,可以用integer來定義int類型的變量。
初始化變量
在使用變量前沫勿,應(yīng)該用已知的值初始化它挨约,也可以在定義變量后,通過賦值表達(dá)式語句來初始化變量产雹。
如:
int count; //為count留出存儲空間
count = 0; //將0儲存在count中
int count = 0; //在聲明變量的同時初始化它
注意诫惭,初始化變量的值不能超過該變量類型的取值范圍。
算術(shù)表達(dá)式
基本的算術(shù)運(yùn)算符
在C語言中蔓挖,基本的算術(shù)運(yùn)算符是:+夕土、-、*瘟判、/、%篮撑,分別為加,減匆瓜,乘赢笨,除未蝌,求余茧妒。這些運(yùn)算符需要兩個運(yùn)算對象,稱為雙目運(yùn)算符桐筏。
注1:求余運(yùn)算符的運(yùn)算對象只能是整形纸型,在%運(yùn)算符的左側(cè)是被除數(shù),右側(cè)是除數(shù)梅忌。
注2:+和-也可用作單目運(yùn)算符,運(yùn)算符必須出現(xiàn)在運(yùn)算數(shù)的左邊铸鹰。運(yùn)算數(shù)可以為整形,也可以為實型展姐。
運(yùn)算符的優(yōu)先級剖毯、結(jié)合性和算術(shù)表達(dá)式
算術(shù)運(yùn)算符的優(yōu)先級
從左到右優(yōu)先級降低:
( )、+(單目)逊谋、-(單目)、*板鬓、/究恤、%、+抄腔、-
算術(shù)運(yùn)算符和圓括號的結(jié)合性
以上所列的運(yùn)算符中理张,只有單目運(yùn)算符+和-的結(jié)合性是從右到左的,其余運(yùn)算符的結(jié)合性都是從左到右悟耘。
算術(shù)表達(dá)式
用算術(shù)運(yùn)算符和一對圓括號將運(yùn)算數(shù)(或稱操作數(shù))連接起來的织狐、符合C語言語法的表達(dá)式稱為算術(shù)表達(dá)式掘殴。
算術(shù)表達(dá)式中粟誓,運(yùn)算對象可以是常量起意、變量和函數(shù)等。如:
2+sqrt(c)*b;
強(qiáng)制類型轉(zhuǎn)換表達(dá)式
強(qiáng)制類型轉(zhuǎn)換表達(dá)式的形式如下:
(類型名) (表達(dá)式);
(類型名)稱為強(qiáng)制類型轉(zhuǎn)換運(yùn)算符悲酷。
利用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符可以將一個表達(dá)式的值轉(zhuǎn)換為指定的類型亲善。例如,表達(dá)式(double)(10 % 3)把10%3所得結(jié)果1轉(zhuǎn)換成雙精度數(shù)顿肺。
賦值表達(dá)式
賦值運(yùn)算符和賦值表達(dá)式
賦值運(yùn)算符是一個等號(=)渣蜗。
在賦值表達(dá)式語句中,運(yùn)算符的右側(cè)可以是任意表達(dá)式讼昆,而左側(cè)必須是一個變量名骚烧。因此,賦值的格式是:
變量 = 表達(dá)式
執(zhí)行該語句時既峡,將對表達(dá)式求值凭戴,并將結(jié)果賦值給變量。
復(fù)合賦值表達(dá)式
在賦值運(yùn)算符之前加上其他運(yùn)算符可以構(gòu)成復(fù)合賦值運(yùn)算符者冤。C語言規(guī)定可以使用10種復(fù)合賦值運(yùn)算符档痪,其中與算術(shù)運(yùn)算有關(guān)的復(fù)合賦值運(yùn)算符有:+=,-=愿汰,*=,/=摇予,%=(兩個符號間不能有空格)吗跋。復(fù)合賦值運(yùn)算符的優(yōu)先級與賦值運(yùn)算符的優(yōu)先級相同。
賦值運(yùn)算中的類型轉(zhuǎn)換
在賦值運(yùn)算中酗宋,只有在賦值號右側(cè)表達(dá)式的類型與左側(cè)變量類型完全一致時疆拘,賦值操作才能進(jìn)行。
在C語言的表達(dá)式(不包括賦值表達(dá)式)中回右,如果運(yùn)算符兩邊的整數(shù)類型不相同芬失,將進(jìn)行類型之間的轉(zhuǎn)換,規(guī)則如下:
- 一個是短整型租漂,一個是長整型颊糜,則短整型轉(zhuǎn)長整型。
- 一個有符號整型业筏,一個無符號整型鸟赫,則有符號整形轉(zhuǎn)無符號整型。
在C語言的賦值表達(dá)式中抛蚤,賦值號右邊的值先轉(zhuǎn)換成與賦值號左邊的變量相同的類型岁经,然后進(jìn)行賦值。應(yīng)當(dāng)注意:
- 賦值號左邊是短整型缀壤,右邊是長整型時,短整型變量只能接受長整型數(shù)低位上兩個字節(jié)中的數(shù)據(jù)筋夏,高位上兩個字節(jié)的數(shù)據(jù)將丟失条篷。
- 當(dāng)賦值號左邊的變量為無符號整型,右邊的值為有符號整形時拥娄,則把內(nèi)存中的內(nèi)容原樣復(fù)制瞳筏,右邊數(shù)值的范圍不應(yīng)超過左邊變量可以接受的數(shù)值范圍姚炕。這時負(fù)整數(shù)將轉(zhuǎn)換為正數(shù)。
- 當(dāng)賦值號左邊的變量為有符號整型些椒,右邊的值為無符號整型時掸刊,復(fù)制機(jī)理同上。若符號位為1石窑,將按負(fù)數(shù)處理蚓炬。
自加、自減運(yùn)算符和逗號運(yùn)算符
自加運(yùn)算符“++”和自減運(yùn)算符“--”
- 自加運(yùn)算符“++”和自減運(yùn)算符“--”的運(yùn)算結(jié)果是使運(yùn)算對象的值增1或減1经宏。i++相當(dāng)于i = i + 1驯击,i--相當(dāng)于i = i - 1。
- 自加缚柏、自減運(yùn)算符是單目運(yùn)算符碟贾,運(yùn)算對象可以是整型變量也可以是實型變量轨域,但不能是常量或表達(dá)式杀餐。
- 自加史翘、自減運(yùn)算符可以放在運(yùn)算對象的前面,也可以放在后面琼讽。如i++,++i,i--,--i都是合法的钻蹬。但是,在表達(dá)式中放在前面或后面可能有不同的值肝匆。
- 自加顺献、自減運(yùn)算符的結(jié)合方向是自右至左。
- 不要在一個表達(dá)式中對同一個變量進(jìn)行多次諸如i++或i--等運(yùn)算能曾,在不同的編譯系統(tǒng)里可能會有不同的結(jié)果设捐。
逗號運(yùn)算和逗號表達(dá)式
逗號“,”是C語言提供的一種特殊運(yùn)算符蚂斤,用逗號將表達(dá)式連接起來的式子稱為逗號表達(dá)式槐沼。逗號的作用是將兩個子表達(dá)式組成一個表達(dá)式。規(guī)則如下:
- 兩個表達(dá)式都會被計算纽窟,先計算逗號左邊的表達(dá)式兼吓。
- 整個表達(dá)式的結(jié)果是右邊表達(dá)式的值。
- 在所有運(yùn)算符中审孽,逗號運(yùn)算符的優(yōu)先級最低。
例如式散,下面的語句將b的值賦給x打颤,然后遞增a编饺,接著再遞增b:
x = (a++, b++);
又如,在這個逗號表達(dá)式中透且,y的值(也就是這個逗號表達(dá)式的值)是10石蔗,i的值為5:
y =( i = 3, i++, ++i, i + 5);