1、標識符
什么事標識符呢?變量的名字就是標識符。不僅限于變量名,程序中各種元素的名字,都屬于標識符。例如符號常量名、函數(shù)名、數(shù)組名、類型名等。關(guān)鍵字也叫保留字。屬于關(guān)鍵字的詞已被系統(tǒng)“注冊”了,特殊用途,我們在為程序中的各種元素命名時是堅決不能使用這些關(guān)鍵字的。
C語言中的系統(tǒng)函數(shù)名如求正弦的函數(shù)名sin、求算術(shù)平方根的函數(shù)名sqrt、用于輸出的函數(shù)名printf等,不屬于關(guān)鍵字,稱為預定義標識符。可以用預定義標識符為變量命名,語法上是可以的,但是我們應盡量不要那樣做。如果為一個變量命名為sin,顯然是在制造混亂:sin究竟是指變量還是指系統(tǒng)函數(shù)呢?
除關(guān)鍵字、預定義標識符的這些詞之外,我們?yōu)槌绦蛟孛钠渌拿秩鏰、b等,成用戶標識符。
用戶標識符的規(guī)則:只能由英文字母、數(shù)字、下劃線三種符號組成。字母區(qū)分大小寫。首字母不能為數(shù)字,可以為英文字母或下劃線。不能使用關(guān)鍵字。
2、常量
直接寫在程序里的數(shù)據(jù)值,就是常量。例如a=10;10就是常量。b=2+3;2、3也是常量。而a、b不是常量是變量。
常量的概念不止限于數(shù)字型,直接寫在程序中的文字型的數(shù)據(jù)值也是常量,例如‘b’、“Hello”等。文字型常量要用引號硬起來,有兩種類型,分別稱為字符常量和字符串常量。
還有一種常量是用符號代替的,稱為符號常量。符號常量需用#define命令定義:#define ?PI ?3.14;表示定義PI是3.14的代替符號,PI是3.14的代號,PI就是3.14(不是變量PI的值是3.14)。3.14是常量,故PI也是常量。
在程序運行過程中這些值不會變化,故稱為常量。
3、變量
在程序中,變量實際代表的是計算機內(nèi)存中的一塊存儲空間,存儲空間的名稱就是變量名,其中存儲的內(nèi)容就是變量的值。變量必須先定義然后才能使用。舉例:int a;是定義變量,它表示讓計算機先準備好變量a這個盒子,實際是讓計算機在內(nèi)存中分配和劃定變量a的存儲空間。在程序中,我們可以隨時將新值保存在變量中。當新值保存在變量中時,變量原有的值同時被覆蓋不復存在;因為一個變量在某一時刻只能保存一個值。
注意:定義變量后在為它賦值前,變量的值不是“空白”,而是隨機數(shù)。
在定義時為變量賦初值也稱對變量的初始化。舉例:int ?sum=0;int price=9,height=10;int ?size=num+4;size的值為4,可用表達式為變量賦初值。
在定義中不允許連續(xù)賦初值。舉例:int ?x=y=z=5;錯誤。而只能寫為:int x=5,y=5,z=5;
4、數(shù)據(jù)類型
整型數(shù)據(jù)
數(shù)值型數(shù)據(jù)分整數(shù)和實數(shù),整數(shù)是不帶有小數(shù)點的,而實數(shù)必須帶有小數(shù)點。
(1)整型常量的表示
整型常量就是直接寫在程序里的整數(shù),如語句a=10;10就是整型常量。這種直接寫出的整數(shù)都是十進制的,在c語言中還允許將整數(shù)寫為八進制或十六進制。
寫為十進制:直接寫,與生活中的寫法一致。
寫為八進制:在整數(shù)前加0。例如a=012;注意:生活中在整數(shù)前加0是沒有任何作用的,但在c語言中,整數(shù)前加0與不加0完全不同,加了0就是八進制。例子中012是八進制的12。
寫為十六進制:在整數(shù)前加0x或0X。a=0xA。x、A大小寫均可,如a=0Xa;a=0XA;
在C語言中不允許將數(shù)據(jù)寫為二進制。
整型數(shù)據(jù)如何在計算機中存儲:計算機的內(nèi)存只能存儲0或1,整數(shù)要被轉(zhuǎn)換為二進制存儲,占2個或4個字節(jié)。
注意:整數(shù)在計算機中存儲,除要轉(zhuǎn)換為二進制外,還要轉(zhuǎn)換為補碼。將整數(shù)字節(jié)轉(zhuǎn)換為二進制的形式稱為原碼。正數(shù)的補碼和原碼相同;負數(shù)的補碼為該數(shù)絕對值的二進制形式按位取反。(即1變?yōu)?,0變?yōu)?)后在加1.對于有符號數(shù),二進制的最高位(最左邊一位)為符號位;負數(shù)為1正數(shù)為0.采用補碼可以將減法運算變作加法實現(xiàn)。
《整數(shù)補碼
求給定數(shù)值的補碼分以下兩種情況:
正數(shù)
【例1】+9的補碼是00001001。(備注:這個+9的補碼是用8位2進制來表示的,補碼表示方式很多,還有16位二進制補碼表示形式,以及32位二進制補碼表示形式,64位進制補碼表示形式等。每一種補碼表示形式都只能表示有限的數(shù)字。)
負數(shù)
求負整數(shù)的補碼,將其對應正數(shù)二進制表示所有位取反(包括符號位,0變1,1變0)后加1[2]。
同一個數(shù)字在不同的補碼表示形式中是不同的。比如-15的補碼,在8位二進制中是11110001,然而在16位二進制補碼表示中,就是1111111111110001。以下都使用8位2進制來表示。
【例2】求-5的補碼。
-5對應正數(shù)5(00000101)→所有位取反(11111010)→加1(11111011)
所以-5的補碼是11111011。
【例3】數(shù)0的補碼表示是唯一的。
[+0]補=[+0]反=[+0]原=00000000
[ -0]補=11111111+1=00000000
轉(zhuǎn)化為原碼
已知一個數(shù)的補碼,求原碼的操作其實就是對該補碼再求補碼:
⑴如果補碼的符號位為“0”,表示是一個正數(shù),其原碼就是補碼。
⑵如果補碼的符號位為“1”,表示是一個負數(shù),那么求給定的這個補碼的補碼就是要求的原碼。
【例4】已知一個補碼為11111001,則原碼是10000111(-7)。
因為符號位為“1”,表示是一個負數(shù),所以該位不變,仍為“1”。
其余七位1111001取反后為0000110;
再加1,所以是10000111?!?/p>
整型變量的類型:int a;a=2.8;a將被賦值為2(無四舍五入)
基本型整型變量:整型變量是專門用于保存整數(shù)的變量,且只能保存整數(shù),不能保存實數(shù)。由int 定義的變量稱為基本型的整型變量。它的空間的大小由編譯系統(tǒng)決定。在vc++6.0中,占4字節(jié);在其他某些編譯系統(tǒng)中,占2字節(jié)。整型變量的空間大小是預先由編譯系統(tǒng)規(guī)定的,與變量值無關(guān)。int ?a;無論a的值為1還是20000,在vc++6.0系統(tǒng)中均占4字節(jié)。
其他類型的整型變量:無論向誰詢問,只要明確了是什么規(guī)格的包,則必然能得到確定的回答,例如問“旅行包多大?”或“女式的包多大?”。在漢語中,“旅行”“女士的”是“包”的修飾語。在c語言中,也可為int添加修飾語,已明確指出整型變量的規(guī)格。int的修飾語有以下4個:short:表示變量為短整型,即確定占2個字節(jié)的整型變量。long:表示變量為長整型,即確定占4個字節(jié)的整型變量。signed:表示變量為有符號型,即可以保存負數(shù)的整型變量。unsigned:表示變量為無符號型,即可以保存正數(shù)和0,但不能保存負數(shù)的整型變量。
以上修飾語在定義整型變量時可選用0~多個,已定義不同規(guī)格的整型變量;但short和long不能同時選用,signed和unsigned不能同時選用。當既不用short也不用long時,視為基本型,其空間大小由編譯系統(tǒng)決定;當既不用singed也不用unsigned時,視同signed,即有符號型。舉例:signed short int a;如果使用了修飾詞,int可以省略signed short a;
占2字節(jié)的有符號短整型變量取值范圍為-32768~32767,無符號的就為0~65535,能保存的最大值比相應有符號數(shù)擴大一倍;占4字節(jié)的整型變量也是如此(范圍最大分別是~+21億、~+42億)。這是因為原來表示負數(shù)的空間在無符號變量中也用于表示正數(shù)了。
實型數(shù)據(jù)
實型也稱浮點型,就是帶有小數(shù)點的數(shù)值型數(shù)據(jù)。
(1)實型常量
實型常量也稱實數(shù)或浮點數(shù),在c語言中只能寫為十進制,不能寫為其他進制。但十進制的實型常量又可寫為兩種形式:小數(shù)形式、指數(shù)形式。
小數(shù)形式:在程序中小數(shù)額寫法與生活中的寫法類似,例如:3.14159 ?0.158 ? 0.0 ? -18.0 ?12. ? ?.36 整數(shù)部分為0時0可以省略,如0.36可寫為.36。小數(shù)部分末尾的0也可省略,如12.0可寫作12.。
注意:小數(shù)點是不能省略的,對于無小數(shù)位的實數(shù)也必須有小數(shù)點。如實數(shù)12.0寫作12是不行的,因為12是整數(shù)就不是實數(shù)了。
指數(shù)形式:
以科學計數(shù)法表示的實數(shù)如2.1*10^5,在C語言中用e(或E)表示“*10”,對于2.1*10^5,在程序中應寫作2.1E5或2.1e5。舉例:-2.8e-2表示-2.8*10^-2。
注意:e或E前后的內(nèi)容都不能省略。對E(或e)前的小數(shù)范圍沒有要求,但規(guī)定E(或e)后必須是整數(shù)不能是小數(shù)。aen(或aEn)是一個整體,表示一個數(shù),相當于英語中的一個單詞,中間是不能隨便加空格的。
(2)實型變量
如何定義實型變量?實型變量有兩種規(guī)格:一種為單精度實型,一種為雙精度實型。雙精度型的能表示的數(shù)值范圍相對更、精度更高。
單精度型:單精度型的變量用關(guān)鍵字float定義,這種變量占4個字節(jié),有效數(shù)字6位(有效數(shù)字是指從第一個不是0的數(shù)值起的數(shù)據(jù)位數(shù),不一定是6位小數(shù)),表示范圍+(-)10^38。舉例:float f=0.001234567;float f=0.00123456789;/*有效數(shù)字過多將被階段,f實際值為0.001234568*/
雙精度:雙精度的變量用關(guān)鍵字double定義,這種變量占8個字節(jié),有效數(shù)字15位,表示范圍+(-)10^308。
實型數(shù)據(jù)也是被轉(zhuǎn)換為二進制后存儲,但首先要轉(zhuǎn)換為“小數(shù)*2^指數(shù)”的形式,然后將小數(shù)部分和指數(shù)部分分別轉(zhuǎn)換為二進制,在分別存儲小數(shù)部分和指數(shù)部分。這與整型數(shù)據(jù)的存儲方式截然不同。
類型的轉(zhuǎn)換
在C語言中對數(shù)據(jù)類型的規(guī)定是很嚴格的,整型變量只能保存整數(shù)不能保存實數(shù);實型變量只能保存實數(shù),不能保存整數(shù)。如果硬要將數(shù)據(jù)存入不同類型的變量,計算機會以變量的類型為準,自動將數(shù)據(jù)轉(zhuǎn)換為與變量一致的類型,然后再存入變量。舉例:int a;a=2.8;則變量a中只會保存整數(shù)2。double y;y=3;則變量y中保存的數(shù)據(jù)是雙精度實數(shù)3.0而不是整數(shù)3.
這種轉(zhuǎn)換是由計算機自動進行的,稱為制動類型轉(zhuǎn)換。
為了與變量的類型一致,也可以為常量規(guī)定類型。常量是什么類型呢?寫在程序中的整型常量都默認是有符號基本型即int型的,實型常量默認是雙精度型即double型的。若要改變常量的類型,可在常量后加字母后綴。字母后綴可以有:L或l。在整數(shù)后加L或l表示常量為長整型的,如0l、-125l。若不寫l表示常量為基本型。在實數(shù)后加l或L表示常量為長雙精度型的(long double),如1.234567L。
如果需要表示常量是短整型的,無相應字母后綴,可用強制類型轉(zhuǎn)換如(short)5;
只能寫在整數(shù)常量之后表示常量為無符號型的,無符號即非負,不能為負數(shù):如0U(u)、6U(u)。不寫U或u則表示常量為有符號型的,可以為負數(shù)。
表示常量為單精度實型(float型),如8.224f為float型而不是double型的,125f也為float型而不是int型的。即有后綴f時,可不加小數(shù)點,也表示實數(shù)(單精度實數(shù))。
在整數(shù)后可同時加L或U,如0LU、6LU等,表示整數(shù)是無符號長整型的。
字符型數(shù)據(jù)
(1)字符常量:單個字符
每個字符常量占1個字節(jié)(8個二進制位)。
字符常量不僅限于字母字符如‘a(chǎn)‘,數(shù)字字符’4‘,符號字符’、‘,’!‘等??崭褡址? '。單引號必須是英文單引號,''連續(xù)單引號是錯誤的。
一個中文漢字占2個字節(jié),不能作為一個字符常量。一個漢字一般要存儲為unsigned short int型的數(shù)據(jù)。
人們把能錄入計算機的每個字符也都安排一個整數(shù)的數(shù)值編號,這種字符的編號稱為ascII碼。ascII碼是整數(shù),可悲字節(jié)轉(zhuǎn)換為二進制。要存儲一個字符,只要存儲這個字符ascII碼的二進制即可。例如:字符'A'的ascII碼為65,要存儲字符'A'就存儲65的二進制;
每類字符ascII碼的大小順序:控制字符(除127外)<空格<數(shù)字字符<大寫字母<小寫字母。
由于字符占1個字節(jié)(8比特),因此ascII碼范圍是0~255(2^8-1)。
ascII碼在128~255之間的字符為擴展字符,可作為非英語國家本國語言字符的代碼,中文半個漢字的ascII碼就在128~255之間(1個漢字占2個字節(jié))。
注意:字符’a‘的ascII碼是97,在內(nèi)存中存為97的二進制,那么整數(shù)97也存為97的二進制。如果在計算機中發(fā)現(xiàn)存儲了一個97的二進制,是無法區(qū)分是字符'a',還是整數(shù)97的,于是在計算機中就給出了這樣一種規(guī)則——整數(shù)和字符是混用的。例如:字符型量可與整型量做加減乘除的運算,甚至可以和整數(shù)比較大小。整數(shù)和字符的混用并不難,只要把字符型量替換為對應的ascII碼即可。舉例:
'C'+1的值為'D',或值為68。
'D'-'A'的值為3,看做68-65。
'7'+'1'的值為55+49=104,或值為字符'h',不是'8'。
'1'<'A'看做49<65,或按照數(shù)字字符的ascII碼小于大寫字母的規(guī)則判斷。
整數(shù)和字符占用的字節(jié)數(shù)是不同的。一個整數(shù)一般占4個字節(jié)(在vc++6.0中),而一個字符占1個字節(jié)。將整數(shù)看做字符時,4個字節(jié)中只是用最右端1個字節(jié),而舍棄其他3個字節(jié)。將字符看做整數(shù)時,會先在它ascII的二進制數(shù)之前(左邊、高位)補3個8比特都為0的字節(jié)湊足“4”字節(jié)。由于ascII 碼的范圍在0~255,一般情況下與之混用的整數(shù)也不超過0~255.
注意:大寫字母的ascII碼比對應小寫字母的小32,故大寫字母字符+32=對應小寫字母字符
小寫字母字符-32=對應大寫字母字符
轉(zhuǎn)義字符:
轉(zhuǎn)義字符仍表示一個字符,\是與后面內(nèi)容作為一個整體的。
有特殊含義的字符如果想表示它本身,都必須用轉(zhuǎn)義的形式,不然就分不清是在表示特殊含義還是表示它本身。有特殊含義的字符主要有三個:斜杠(\)、單引號、雙引號。要表示這3個字符,必須用\的形式,分別寫作:'\\','\'','\"'。
注意:
'\1~3位的八進制數(shù)':含義:表示一個字符,這個字符的ascII碼的八進制為\后面的數(shù),八進制數(shù)不必以0開頭,但最多3位。
'\x1~2位的十六進制數(shù)':含義:表示一個字符,這個字符的ascII碼的十六進制為\x后面的數(shù)。x必須小寫,十六進制數(shù)不要在寫前綴0x,最多2位。
使用轉(zhuǎn)義字符,還可以通過字符的ascII碼,把任意一個字符表示出來。'x41'、'\101'、'A'等價,都表示字符'A'。課件通過轉(zhuǎn)義字符,對同一個字符可有多種表示方法。
轉(zhuǎn)義字符一定要寫在引號之內(nèi),因為它仍屬于字符常量。
(2)字符變量
用關(guān)鍵字char定義字符型變量,例如:char ?c;c='A';/*也可寫作:c=65*/
一個字符型變量只能保存一個字符。讓字符型變量保存整數(shù)或參與整數(shù)運算也是可以的。因為字符和整數(shù)是混用的。由于字符型變量也可保存整數(shù),因此字符型變量也有有符號和無符號的區(qū)別,用signed char(或省略 signed)定義的是有符號的字符型變量,可保存-128~127范圍的整數(shù);用unsigned char 定義的是無符號的字符型變量,可保存0~255范圍的整數(shù)。但無論如何均占1字節(jié)。
字符串型常量:
字符串包含多個字符,每個字符占一個字節(jié)存儲,存儲的是字符的ascII碼的二進制。需要注意的是,字符串在所有字符的最后都必須再多占1個字節(jié)存字符’\0‘。
用printf函數(shù)可以直接輸出字符串常量。舉例:printf("nihao!");printf("\101");/*將在屏幕輸出A,即輸出僅包含一個字符A的字符串*/