1 數據類型
數據既是程序加工和處理的對象,也是程序加工和處理的結果。
1、基本類型包括整型、實型(又稱浮點型)、字符型和枚舉型四種。
2、構造類型是由基本數據類型按一定規則組合而成的復雜數據類型,包括數組型、結構體類型和共用體類型。
3、指針類型是一種更加靈活的數據類型,用來表示內存地址。
4、空類型是從語法完整性角度給出的數據類型,表示不需要數據值,因而沒有類型。
2 常量
常量又稱為常數,是在程序運行過程中其值不能改變的數據。
2.1 整型常量
整型常量通常稱為整數,不帶有小數部分,包括正整數、負整數和0。
C語言中,整型常量有三種書寫形式:
1、八進制整型常量,必須以0開頭,即以0作為八進制整數的前綴,是由數字0~7組成的數字串。
2、十進制整型常量,即通常的整數,沒有前綴,是由數字0~9組成的數字串,是C語言中用的最多的一種形式。
3、十六進制整型常量,必須以0X或0x開頭,即以0X或0x作為十六進制整數的前綴,是由字符0~9、a~f或A~F組成的字符串。
2.2 實型常量
實型常量又稱為浮點型常量或實數,實型常量只使用十進制。
C語言的實型常量有兩種書寫形式:
1、十進制小數形式,由整數部分、小數點和小數部分組成,其中小數點必須有,整數部分和小數部分可以省略其中一個,正、負通過前面的"+"(可以省略)和"-"區分。
2、指數形式(用E或e表示),由尾數部分、階碼標志(小寫字母e或大寫字母E)和指數部分組成,其一般形式為aEb或aeb,其中尾數部分a的位數決定了數值的精度,指數部分b的位數決定了可表示的數值范圍。a和b均有正負之分,且b必須為整數。
2.3 字符常量
字符常量包括普通字符常量和轉義字符常量兩種。
普通字符常量是用一對單引號括起來的單個字符,例如'a'、'?'均為普通字符常量。C語言還允許使用一種特殊形式的字符常量,即以反斜杠"\"開頭的轉義字符,它只代表某一特定的ASCII碼字符。
C語言規定字符常量中的字母是區分大小寫的。
每個字符常量在內存中占用1字節,具體存放的是該字符對應的ASCII碼值。
需要注意的是,C語言中空字符和空格符號不同。空字符用轉義字符"\0"表示,其值是0;空格符號是ASCII字符集中的一個可顯示字符,其ASCII值是32,在屏幕上顯示為空格。
2.4 字符串常量
字符串常量又稱為"字符串",是用雙引號括起來的零個或多個字符的序列。字符串中字符的個數稱為字符串長度。
編譯時自動在字符串的末尾處加一個轉義字符'\0'作為字符串的結束標志,即長度為n個字符的字符串占用n+1字節。
字符常量與字符串常量是不同的,其區別在於:
1、定界符不同,字符常量使用單引號,而字符串常量使用雙引號。
2、長度不同,字符常量的長度固定為1;而字符串常量的長度,可以是0,也可以是某個整數。
3、存儲要求不同,字符常量存儲的是字符的ASCII碼值,在內存中只占用1字節;而字符串常量,除了要存儲有效的字符外,還要存儲一個字符串結束標志'\0'。
2.5 符號常量
符號常量使用之前必須先定義,其定義的一般格式:
#define 符號常量 常量
其中,常量可以是任意類型。符號常量一般采用大寫字母表示,而變量一般采用小寫字母表示。符號常量的定義一般放在程序的開頭,每個定義必須獨占一行,因為不是語句,所以后面沒有分號";"。
使用符號常量的優勢在於:
1、提高程序的可讀性
2、便於程序修改
小結
常量和符號常量
❖定義:程序運行過程中,其值不能被改變的量(常數)
❖分類:直接常量、符號常量
符號常量:用標識符代表常量
◆一般用大寫字母: PRICE 、 PI
◆定義格式: #define 符號常量 常量
◆其值在作用域內不能改變和再賦值。
3 變量
❖ 定義:其值可以改變的量。
❖ 定義格式:數據類型 變量名;
❖ 變量應該有名字,並在內存中占據一定的存儲單元。
❖ 變量名和變量值有不同的含義
⚫變量名實為一個符號地址
3.1 整型變量
整型變量分為四種:
1、基本整型,類型關鍵字為int。
2、短整型,類型關鍵字為short[int]。
3、長整型,類型關鍵字為long[int]。
4、無符號整型,又稱為無符號基本整型(unsigned [int])、無符號短整型(unsigned short)和無符號長整型(unsigned long)三種。
在16位編譯器中,一般一個int型變量占用2字節,且long型(4字節)≥int型(2字節)≥short型(2字節);而在32位編譯器中,一個int型變量占用4字節,long型變量占用4字節,short型變量占用2字節。
3.2 實型變量
實型變量分為兩種:
1、單精度實型,類型關鍵字為float,一般占用內存4字節,保留6~7位有效數字。
2、雙精度實型,類型關鍵字為double,一般占用內存8字節,保留15~16位有效數字。
例如:float a;
a=123456.789 //實際a的值是 123456.7
double b;
a=123456.789 //實際b的值是 123456.789
3.3 字符型變量
字符型變量的類型關鍵字是char,存放的是字符的ASCII碼值(無符號整數),占用內存1字節。
需要注意的是,字符串只能是常量,C語言中沒有字符串變量,而是用字符數組存放字符串變量。
設 char ch;下列語句錯誤的是(A)
A. ch="a=b";
B. ch='\0';
C. ch='7'+'8';
D. ch=7+8; 解析:字符型變量的類型關鍵字是char,存放的是字符的ASCII碼值。
3.4 變量的定義
C語言規定,任何變量必須先定義后使用。變量定義語句的一般格式:
數據類型符 變量名1[,變量名2,…];
對變量進行定義時,需要注意以下幾個方面:
1、變量定義可以存放在函數之外,也可以放在函數體或符合語句中。
2、被定義為整型(包括int、short和long)的變量,若其值為-128~127,則可以作為字符型變量使用。
3、被定為無符號整型(包括unsigned、unsigned short和unsigned long)的變量,若其值0~255,也可以作為字符型變量使用。
4、被定義為字符型的變量,可以作為整型(包括int、short和long)變量使用,其將值為-128~127,也可以作為無符號整型(包括unsigned、unsigned short和unsigned long)變量使用,其值將為0~255。
5、變量定義后,系統自動為其分配連續的內存單元,所占用的內存字節數取決於變量的數據類型。
3.5 變量的初始化
變量的初始化是給變量賦值的一種方式,定義變量的同時給變量賦初值稱為變量的初始化。
變量初始化語句的一般格式:
數據類型符 變量名1=初值1[,變量名2[=初值2],...];
int radius=2,area;
short m=1,n=2;
long l1=123L,l2;
3.6 有名常量的定義
C語言中,如果定義了變量並賦予其初值,但不希望在程序中對其值進行修改,
則可以將該變量定義為有名常量。
有名常量定義語句的一般格式:
const 數據類型符 變量名1=初值1[,變量名2=初值2,...];
const int j=1,k=2;
const char ch1='y',ch2='N';
4 運算符和表達式
運算符分類: 運算符是進行各種運算的符號,例如常用的加、減、乘、除符號,即是運算符。
4.1 結合性
結合性是C語言的獨有概念。除單目運算符、賦值運算符和條件運算符是右結合之外,其他的運算符都是左結合。
4.2 算術運算符
C語言的算術運算符包括+、-、*、/、%、+(取正)和-(取負)。
1、單目運算符+、-的優先級相同,結合性是從右至左。
2、雙目運算符*、/、%的優先級相同,結合性是從左至右。
3、雙目運算符+、-的優先級相同,結合性是從左至右。
4、單目算術運算符優先於雙目算術運算符。
5、*、/、%優先於+、-。 需要注意的是:
1、除法運算的結果和運算對象的數據類型有關,若兩個整數相除,則運算稱為整除,其商為整數,小數部分被舍棄。
2、模運算,要求兩側的運算對象必須為整型,否則出錯。
4.3 自增、自減運算符
自增和自減運算符分別為++和--,它們都是單目運算符,用於對整型、字符型和指針型變量的值加1和減1的運算,運算結果仍是原來的數據類型。
1、運算符放在變量之前,即++變量、--變量,則先使變量的值加(或減1),然后再以變化后的值參與其他運算,即先加(或減)1、后運算。
2、運算符放在變量之后,即變量++、變量--,則變量先參與其他運算,然后再使變量值加(或減)1,即先運算、后加(或減)1。
❖自增、自減運算符++ --
⚫作用:使變量值加1或減1
⚫種類:
◆前置 ++i, --i (先執行i+1或i-1,再使用i值)
◆后置 i++,i-- (先使用i值,再執行i+1或i-1)
⚫幾點說明:
◆++ -- 不能用於常量和表達式,如 5++,(a+b)++
◆++ -- 結合方向: 自右向左
◆優先級: - ++ -- ------>* / % ----->+ -
(2) (3) (4)
◆該運算符常用於循環語句中,使循環變量加減1
❖有關表達式使用中的問題說明
⚫不同系統對運算符和表達式的處理次序不同,盡可能寫通用性強的語句
⚫不要寫有歧義和不知系統如何執行的程序
例如:int x=10,y=5; x++,x+y++的值是 16
使用自增和自減運算符時,需要注意以下幾點:
1、自增、自減運算,常用於循環語句中,使循環控制變量加(或減)1,以及指針變量中,使指針向下(或上)一個地址。
2、自增、自減運算符,不能用於常量和表達式。
3、在表達式中連續使同一個變量進行自增或自減運算時,很容易出錯,所以最好避免這種用法。
自增和自減運算符的優先級如下:
1、自增和自減運算符優先於雙目算術運算符;
2、自增、自減運算符和單目算術運算符+、-的優先級相同,結合性是從右至左。
4.4 算術表達式
表達式中的運算符都是算術運算符的稱為算術表達式,通常算術表達式由運算對象(常量、變量和函數等)、圓括號和算術運算符組成。
算術表達式的構成規則如下:
1、數值型常量、數值型變量和數值型函數調用是算術表達式。
2、+(算術表達式)、-(算術表達式)是算術表達式。
3、++整型變量、--整型變量、整型變量++、整型變量--是算術表達式。
4、(算術表達式)雙目算術運算符(算術表達式)是算術表達式。
5、有限次地使用上述規則獲得的表達式都是算術表達式。
4.5 關系運算符
關系運算符包括>、>=、<、<=、==和!=六種,它們是雙目運算符。本質上,關系運算符是比較運算,即兩個數據進行比較,判斷兩個數據是否符合給定的關系。
如果關系運算的結果是邏輯值"真"(即關系成立),用整數"1"表示;如果關系運算的結果是邏輯值"假"(即關系不成立),用整數"0"表示。
關系運算符的優先級如下:
1、算術運算符優先於關系運算符。
2、>、>=、<、<=優先於==、!=。
3、>、>=、<、<=的優先級相同,結合性是從左至右。
4、==、!=的優先級相同,結合性是從左至右。
需要注意的是,C語言中"等於"這一關系運算符是雙等號"==",而不是單等號"="(賦值運算符)。
4.6 關系表達式
關系表達式是用關系運算符將兩個表達式連接起來的表達式。
關系表達式的一般形式:表達式 關系運算符 表達式
表達式主要是算術表達式,也可以是字符型數據或關系表達式、邏輯表達式、條件表達式、賦值表達式、逗號表達式等。由於條件、賦值、逗號運算符的優先級低於關系運算符,所以應注意加圓括號。
4.7 邏輯運算符
邏輯運算符包括&&、||和!三種。
邏輯運算符的優先級如下:
1、!優先於雙目算術運算符優先於關系運算符優先於&&優先於||。
2、單目邏輯運算符!和單目算術運算符的優先級相同,結合性均從右至左。
3、雙目邏輯運算符"&&"和"||"的結合性是從左至右。
主要注意以下幾點:
1、對於邏輯運算結果,"1"表示邏輯真,"0"表示邏輯假;對於邏輯運算對象"非0"表示邏輯真,"0"表示邏輯假。
2、邏輯與"&&"相當於"同時",邏輯或"||"相當於"或者",邏輯非"!"相當於"否定"。
3、邏輯運算符兩側的運算對象可以是任何類型的數據,如整型、實型、字符型等。
4、一旦"&&"和"||"能夠確定表達式的值,則不再繼續運算,即並不是所有的表達式都被運算
4.8 邏輯表達式
邏輯表達式是用邏輯運算符將一個或多個表達式連接起來,進行邏輯運算的式子。
邏輯表達式的構成規則:單目邏輯運算符 表達式
表達式 雙目邏輯運算符 表達式
其中,表達式主要是關系表達式,也可以是字符型數據或算術表達式、條件表達式、賦值表達式、逗號表達式等。由於條件、賦值、逗號運算符的優先級低於邏輯運算符,所以應注意加圓括號。
4.9 基本賦值運算符
基本賦值運算符即賦值運算符"=",它是雙目運算符,賦值運算符的左邊必須是變量,右邊是表達式,其作用是將一個表達式的值賦給一個變量。
賦值運算符的優先級:
1、算術運算符優先於關系運算符優先於雙目邏輯運算符優先於賦值運算符;
2、賦值運算符的結合性是從右至左。
4.10 復合賦值運算符
復合賦值運算符是在賦值運算符的前面再加一個雙目運算符構成的,它是雙目運算符,復合賦值運算符的左邊必須是變量,右邊是表達式。
復合賦值運算符的一般使用形式:
變量 雙目運算符=表達式 等價於 變量=變量 雙目運算符 (表達式)
復合賦值運算符的優先級:
1、算術運算符優先於關系運算符優先於雙目邏輯運算符優先於復合賦值運算符。
2、復合賦值運算符和賦值運算符的優先級相同,結合性都是從右至左。
4.11 賦值表達式
由賦值運算符或復合賦值運算符將一個變量和一個表達式連接起來的表達式,稱為賦值表達式。
賦值表達式的構成規則:變量=表達式
變量 復合賦值運算符 表達式
其中,表達式可以是算術表達式、關系表達式、邏輯表達式、條件表達式、賦值表達式和逗號表達式等。由於逗號運算符的優先級低於賦值運算符,所以應注意加圓括號。
4.12 逗號運算符和逗號表達式
逗號運算符又稱為順序求職運算符,它是雙目運算符,運算對象是表達式,常用於for循環語句中。
逗號運算符和逗號表達式
❖形式:表達式1,表達式2,……表達式n
❖結合性:從左向右
❖優先級: 15,級別最低
❖逗號表達式的值:等於表達式n的值
❖用途:常用於循環for語句中
逗號運算符的優先級:
1、任何運算符優先於逗號運算符,即逗號運算符的優先級最低。
2、逗號運算符的結合性是從左至右。
需要注意的是,並不是任何地方出現的逗號都是逗號運算符。很多情況下,逗號僅用作分隔符。
用逗號運算符把兩個或多個表達式連接起來構成逗號表達式,構成規則:表達式1,表達式2
其中,表達式可以是算術表達式、關系表達式、邏輯表達式、條件表達式、賦值表達式和逗號表達式等。
4.13 條件運算符和條件表達式
條件運算符是C語言中唯一的一個三目運算符,它是由?和:組合成的,其三個運算對象均為表達式,其中第一個運算對象可以是任何類型的表達式,通常理解為邏輯表達式。
條件運算符的一般使用形式:
表達式1?表達式2:表達式3
條件運算符的執行過程是先表達式1,若非0,則條件表達式的值是表達式2的值;若為0,則條件表達式的值是表達式3的值。
條件運算符的優先級:
1、其他運算符優先於條件運算符優先於賦值和復合賦值運算符優先於逗號運算符。
2、條件運算符的結合性是從右至左。
int i=1,j=1,k=2,m=0;
i==j?(k=3) : (m=-3) // 3,k的值是3,i,j,m的值不變
4.13 位邏輯運算符
位邏輯運算符將數據中的每個二進制位上的"0"或"1"作為邏輯值,按位進行邏輯運算。位邏輯運算符分為按位非、按位與、按位或和按位異或(又稱按位加)四種,其中按位非是單目運算符,其余三種都是雙目運算符。
3&9=00000001 3|9=00001011 3^9=00001010
1、運算對象只能是整型或字符型數據。除按位非為單目運算符外,其余均為雙目運算符。
2、參與位邏輯運算時,運算對象以二進制形式進行相應的按位運算。位邏輯運算符的優先級;
1、~優先於雙目算術運算符優先於關系運算符優先於&優先於^優先於|優先於雙目邏輯運算符。
2、~與單目邏輯運算符、自增、自減、單目算術運算符、長度運算符的優先級相同,結合性是從右至左。
4.14 位移位運算符
位移位運算符是將數據作為二進制數,進行向左或向右移動若干位的運算,分為左移和右移兩種,均為雙目運算符,其中第一個運算對象的移位對象,第二個運算對象是移動的二進制位數。 1、運算對象只能是整型或字符型數據。
2、參與位移位運算時,運算對象以二進制形式進行相應的按位運算。
位移位運算符的優先級:
1、算術運算符 優先於位移位運算符優先於關系運算符。
2、位移位運算符的優先級相同,結合性是從左至右。 unsigned int b=248;
b=b>>2 運算后的值是62 int x=4,y=2; 表達式(x>>y)+(x<<y)的值是 17
4.15 長度運算符
長度運算符是單目運算符,其運算對象可以是任何數據類型符或變量。長度運算符的使用形式:sizeof(數據類型符)或sizeof(變量)。
長度運算符的優先級:
1、與單目算術運算符、單目邏輯運算符、自增和自減運算符的優先級相同。
2、上述優先級相同的運算符的結合性都是從右至左。
sizeof(int) 4 sizeof(float) 4 sizeof(double) 8
5 數據類型轉換
5.1 自動類型轉換
參與運算的各個數據都轉換成數據較長的數據類型,然后計算,結果的類型就是數據長度較長的數據類型。本質上是較低類型的轉換,即"就高不就低"或"就長不就短"的原則。 ❖什么情況下發生
⚫運算轉換------不同類型數據混合運算時
⚫賦值轉換------把一個值賦給與其類型不同的變量時
⚫輸出轉換------輸出時轉換成指定的輸出格式
⚫函數調用轉換------實參與形參類型不一致時轉換
❖運算轉換規則:不同類型數據運算時先自動轉換成同一類型
5.2 賦值類型轉換
先將運算結果的數據類型自動轉換為左邊變量的數據類型,然后再賦予該變量。本質上是"就左不就右"的轉換原則。
例:設int a=1;float b=2.1;char c='a';
則表達式a=b+c的計算過程是先計算b+c,按照"就高不就低"的規則,將c轉換為實型(變量c的值是97,轉化為97.0),計算結果是實型,即99.1,由於變量a是整型,按照"就左不就右"的規則,所以將實型自動轉換為整型賦予變量a,即99賦值給變量a。
5.3 強制類型轉換
除了自動類型轉換和賦值類型轉換外,C語言也允許強制類型轉換。
數據類型強制轉換的一般格式:(數據類型符)(表達式)
C語言首先按照自動類型轉換原則計算表達式的值,然后將其轉換為指定的數據類型。需要注意的是,若表達式僅僅是單個常量或變量時,外面的一對圓括號可以省略;若是含有運算符的表達式,則必須用一對圓括號括起來。
int a; float b=1.9; 執行語句 a=(int)b后變量a和b的值分別是 1,1.9
進行數據類型轉換時,需要注意以下幾點:
1、強制類型轉換獲得的是一個所需類型的中間量,原來表達式的類型並不發生變化。
2、表達式計算過程中,參與運算的常量或變量的類型自動轉換是臨時的,它僅產生一個臨時的、類型不同的數據參與運算,常量或變量的原類型和值均不改變。
3、運算結果賦予變量的類型轉換過程中,無論是自動變量的還是強制的,當數據長度較長的結果存入數據長度較短的變量時,將截去超出的部分,有可能造成錯誤。
4、數據類型轉換將占用系統時間,過多的轉換將降低程序的運行效率,所以除了必要的數據類型轉換外,應盡量選擇好數據類型,避免不必要的轉換。