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