用一個簡單的c程序例子,介紹c語言的基本構成、格式、以及良好的書寫風格,使小夥伴對c語言有個初步認識。
例1:計算兩個整數之和的c程序:
a=20; /*定義變量a,b,sum為整型變量*/ sum=a+b; /*把整數15賦值給整型變量b*/ printf(「a=%d,b=%d,sum=%d\n」,a,b,sum); /*把兩個數之和賦值給整型變量sum*/重點說明
—
1、任何一個c語言程序都必須包括以下格式:main() { }——這是c語言的基本結構,任何一個程序都必須包含這個結構。括號內可以不寫任何內容,那麼該程序將不執行任何結果。
2、main()——在c語言中稱之為「主函數」,一個c程序有且僅有一個main函數,任何一個c程序總是從main函數開始執行,main函數後面的一對圓括號不能省略。
3、被大括號{ }括起來的內容稱為main函數的函數體,這部分內容就是計算機要執行的內容。
4、在{ }裡面每一句話後面都有一個分號(;),在c語言中,我們把以一個分號結尾的一句話叫做一個c語言的語句,分號是語句結束的標誌。
5、printf(「a=%d,b=%d,sum=%d\n」,a,b,sum); ——通過執行這條c語言系統提供給我們直接使用的屏幕輸出函數,用戶即可看到運行結果,本程序運行後,將在顯示器上顯示如下結果:a=20,b=15,sum=35。
6、#include——注意:以#號開頭。不以分號結尾 這一行沒有分號,所以不是語句,在c語言中稱之為命令行,或者叫做「預編譯處理命令」。
7、程序中以 /*開頭並且以*/結尾的部分表示程序的注釋部分,注釋可以添加在程序的任何位置,為了提高程序的可讀性而添加,但計算機在執行主函數內容時完全忽略注釋部分,換而言之就是計算機當做注釋部分不存在於主函數中。
C程序是先由源文件經編譯生成目標文件,然後經過連接生成可執行文件。
源程序的擴展名為 .c ,目標程序的擴展名為 .obj , 可執行程序的擴展名為 .exe 。
在編寫程序時,必須為函數、變量等命名,這個名字稱為標識符。C語言中標識符的命名規則如下:
標識符只能由字母、數字、下劃線組成;
標識符的第一個字母必須是字母和下劃線;
標識符區分大小寫字母,如If和if是兩個完全不同的標識符。
合法標識符如下:A6, b_3 , _mn 非法的標識符如下:ab#12 , 8m , tr3:4 , yes no
標識符不能與程序中具有特殊意義的關鍵字相同,不能與用戶編制的函數名、C語言庫函數相同,在程序中各種標識符儘量不要重複,以便區分。選擇變量名和其他標識符時,應注意做到 「見名知義」。
標識符分為如下三類
—
1、關鍵字
關鍵字是具有特定含義的,專門用來說明c語言特定成分的一類標識符,不能用作用戶的標識符。
2、預定義標識符
預定義標識符在c語言中也有特定的含義,但可以用作用戶標識符,預定義標識符分為兩類:
1)、庫函數名字,比如printf,scanf,sin,isdigit等 2)、編譯處理命令名,比如define,include3、用戶標識符
用戶根據需要自己定義的標識符稱為用戶標識符。無論如何自定義標識符,都必須符合標識符的三條命名規則。
在程序運行中,其值不能被改變的量稱為常量。常量有5種類型:整型常量、實型常量、字符常量、字符串常量和符號常量。
4.1 數值轉換
—
數值的四種表現形式:
①:二進位:所有數字由0,1構成,逢二進一,二進位數中不會出現2。
②:八進位:以數字0(注意不是以字母O,o)開頭,所有數字由0~7構成,逢八進一,八進位數中不會出現8。例:0112,0123,077等
③:十進位:所有數字由0~9構成,逢十進一,十進位數中不會出現10。例:0,12,-15等
④:十六進位:以0x或者0X(數字0加字母x)開頭,所有數字由0~9,A~F(或者a~f)構成,逢十六進一(其中A、B、C、D、E、F分別代表10、11、12、13、14、15) 例:0x4A、0X14c7等
在計算機內部,數字均以二進位形式表示和存放,用戶輸入的普通十進位數字都要被計算機轉換成二進位才能在計算機內部存儲,同樣計算機的運算結果也為二進位,一般要將其轉換成十進位數再輸出給用戶閱讀,這種轉換通常由計算機自動實現。
1)將十進位轉換二進位、八進位和十六進位
除法:將十進位數除以2,記錄餘數,得到的商繼續除以2,直到商為0,然後將各次相處所得的餘數從後往前逆序排列,所得餘數數字序列就是該十進位數對應的二進位數。八進位和十六進位轉換方法同上。
例:十進位數13轉換成二進位數的值為1101,轉換八進位為015,轉換成十六進位為D.
2)將二進位、八進位和十六進位轉換成十進位
乘積求和:將二進位的每一位從低位到高位(右邊為低位,左邊為高位)分別乘以20,21,22。。。。,然後將這些值求和。
3)二進位與八進位、十六進位數之間的相互轉換
①:二進位轉八進位:從右往左每三位一組轉換成十進位數,將所得數據組合就是對應的八進位數(注意:高位不足三位補零)。例:(010 110 111)2=(267)8
②:二進位轉十六進位:從右往左每四位一組轉換成十進位數,將所得數據組合就是對應的十六進位數(注意:高位不足四位補零)。例:(0101 1011)2=(5B)16
③:八進位轉化二進位:每一位數字轉換為三位二進位數字 例:(13)8=(001 011)2= (注意:去掉前面的兩個00,因為0在高位沒有意義) ④:十六進位轉化二進位:每一位數字轉換為四位二進位數字 例:(E3)16=(1110 0011)2
4.2 數形常量
—
整型常量有3種形式:十進位整型常量、八進位整型常量和十六進位整型常量。
(注意:c語言中沒有直接表示二進位的整型常量,在c語言源程序中不會出現二進位。)
書寫方式如下:
十進位整型常量:123 , 0 ,-24 , 85L(長整型常量) 等 八進位整型常量:051 ,-026 ,0773 等 十六進位整型常量:0x55 , 0x1101 , 0x , 0x5AC0 , -0xFF。其中L為長整型。
4.3 實型常量
—
實型常量有兩種表示形式:小數形式和指數形式。
小數形式:5.4 0.074 -23.0 指數形式:5.4e0 4.3e-3 -3.3e4
1)小數部分為0的實型常量,可以寫為453.0 或453。
2)用小數表示時,小數點的兩邊必須有數,不能寫成「 .453「和「453.「,而應該寫成「0.453「和「453.0「。
3)用指數寫法時,e前必須有數字,e後面的指數必須為整數(注意:整數階碼可以是正數,負數,也可以是八進位數、十六進位數,但必須為整數)。
4.4 字符常量
—
字符常量的標誌是一對單引號『 』,c語言中的字符常量有兩類:
1)由一對單引號括起來的一個字符,如『a 』, 『r』 ,『#』。注意: ′a′ 和 ′A′ 是兩個不同的字符常量。
2)由一對單引號括起來,以反斜槓\開頭,後跟若干數字或者字母,比如『\n』,其中「\「是轉義的意思,後面跟不同的字符表示不同的意思,這類字符常量叫轉義字符。
4.5 字符串常量
—
C語言中,以雙引號括起來的,由若干個字符組成的序列即為字符串常量。
4.6 符號常量
—
符號常量是由宏定義「#define「定義的常量,在C程序中可用標識符代表一個常量。
例:計算圓的面積的c程序。
說明:
#define 是宏定義,此程序中所有出現PI的地方都代表3.,同時PI稱為符號常量。習慣上我們用大寫字母來表示符號常量,小寫字母表示變量,這樣比較容易區別。
變量就是其值可以改變的量。變量要有變量名,在內存中佔據一定的存儲單元,存儲單元裡存放的是該變量的值。不同類型的變量其存儲單元的大小不同,變量在使用前必須定義。
5.1 整型變量
—
整型變量分為4種:基本型(int)、短整型(short int 或short)、長整型(long int 或 long)和無符號型(unsigned int ,unsigned short,unsigned long)。
不同的編譯系統對上述四種整型數據所佔用的位數和數值範圍有不同的規定。
類型說明符
單詞signed來說明「有符號」(即有正負數之分),不寫signed也隱含說明為有符號,unsigned用來說明「無符號」(只表示正數)。
5.2 實型變量
—
C語言中,實型變量分為單精度類型( float )和雙精度類型( double )兩種。
如:float a , b ; double m ;
在vc中,float 型數據在內存中佔4個字節(32位),double型數據佔8個字節。單精度實數提供7位有效數字,雙精度實數提供15~16位有效數字。實型常量不分float型和double型,一個實型常量可以賦給一個float 型或double型變量,但變量根據其類型截取實型常量中相應的有效數字。
注意:實型變量只能存放實型值,不能用整型變量存放實型值,也不能用實型變量存放整型值。
5.3 字符變量
—
字符變量用來存放字符常量,定義形式:
char 變量名;
其中關鍵字char定義字符型數據類型,佔用一個字節的存儲單元。
例:char cr1,cr2; cr1= 『A』 , cr2=『B』 ;
將一個字符賦給一個字符變量時,並不是將該字符本身存儲到內存中,而是將該字符對應的ASCII碼存儲到內存單元中。
由於在內存中字符以ASCII碼存放,它的存儲形式和整數的存儲形式類似,所以C語言中字符型數據與整型數據之間可以通用,一個字符能用字符的形式輸出,也能用整數的形式輸出,字符數據也能進行算術運算,此時相當於對它們的ASCII碼進行運算。
當同一表達式中各數據的類型不同時,編譯程序會自動把它們轉變成同一類型後再進行計算。轉換優先級為:char < int < float < double 即左邊級別「低「的類型向右邊轉換。
具體地說,若在表達式中優先級最高的數據是double型,則此表達式中的其他數據均被轉換成double型,且計算結果也是double型;若在表達式中優先級最高的數據是float型,則此表達式中的其他數據均被轉換成float型,且計算結果也是float型。
在做賦值運算時,若賦值號左右兩邊的類型不同,則賦值號右邊的類型向左邊的類型轉換;當右邊的類型高於左邊的類型時,則在轉換時對右邊的數據進行截取。
除自動轉換外,還有強制轉換,表示形式是:( 類型 )(表達式);
例:(int)(a+b)
討論:當a值賦值為3.4,b值賦值為2.7,(int)(a+b)和(int)a+b的值分別為多少?
C語言的運算符範圍很廣,可分為以下幾類:
1、算術運算符:用於各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求餘(%)、自增(++)、自減(--)共七種。
2、賦值運算符:用於賦值運算,分為簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。<="" span="">
3、逗號運算符:用於把若干表達式組合成一個表達式(,)。
4、關係運算符:用於比較運算。包括大於(>)、小於(<)、等於(==)、 大於等於(="">=)、小於等於(<=)和不等於(!=)六種。<="" span="">
5、邏輯運算符:用於邏輯運算。包括與(&&)、或(||)、非(!)三種。
6、條件運算符:這是一個三目運算符,用於條件求值(?:)。
7、位操作運算符:參與運算的量,按二進位位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
8、指針運算符:用於取內容(*)和取地址(&)二種運算。
9、求字節數運算符:用於計算數據類型所佔的字節數(sizeof)。
10、特殊運算符:有括號(),下標[],成員(→,.)等幾種。
另外,按參與運算的對象個數,C語言運算符可分為:單目運算符 (如 !)、雙目運算符 (如+,- )和三目運算符 (如 ? :)。
8.1 基本的算數運算符
—
(1)+(加法運算符或正值運算符,如2+5)。
(2)-(減法運算符或負值運算符,如4-2)。
(3)*(乘法運算符,如3*8)。
(4)/(除法運算符,如11/5)。
/的運算分為兩種情況:
a、「除」的左右兩邊都為整數時,所得結果必然是整數(注意:僅取整數部分,不是四捨五入)比如:5/2的值為2,不是2.5,1/2的值為0。
b、「除」的左右兩邊至少有一個是實型數據(即小數)時,所得結果為實型數據。比如:5/2.0的值為2.5,7.0/2.0的值為3.5.
(5)%(模運算符或稱求餘運算符,%兩側均應為整型數據,如9%7的值為2)。
需要說明的是:當運算對象為負數時,所得結果隨編譯器不同而不同,在vc中,結果的符號與被除數相同,比如:13%-2值為1,而-15%2值為-1。
8.2 算術表達式和運算符的優先級與結合性
—
算術表達式是用算術運算符和括號將運算量(也稱操作數)連接起來的、符合C語言語法規則的表達式。運算對象包括函數、常量和變量等。
在計算機語言中,算術表達式的求值規律與數學中的四則運算的規律類似,其運算規則和要求如下。
(1)在算術表達式中,可使用多層圓括號,但括號必須配對。運算時從內層圓括號開始,由內向外依次計算各表達式的值。
(2)在算術表達式中,對於不同優先級的運算符,可按運算符的優先級由高到低進行運算,若表達式中運算符的優先級相同,則按運算符的結合方向進行運算。
(3)如果一個運算符兩側的操作數類型不同,則先利用自動轉換或強制類型轉換,使兩者具有相同類型,然後進行運算。
8.3 自增自減運算符
—
作用:使變量的值增1或減1。
如:++i,--i (在使用i之前,先使i的值加1、減1)。i++,i-- (在使用i之後,使i的值加1、減1)。
(1)只有變量才能用自增運算符 (++)和自減運算符(--),而常量或表達式不能用,如10++或(x+y)++都是不合法的。
(2)++和--的結合方向是「自右向左「,如 -i++ ,i的左邊是負號運算符,右邊是自增運算符,負號運算和自增運算都是 「自右向左「結合的,相當於 -(i++)。
在循環語句中常用到自增(減)運算符,在指針中也常用到該運算符,考生要弄清楚「i++」和「++i」及「i--」和「--i」的區別,特別弄清楚表達式的值和變量的值。
9.1 賦值運算符與賦值表達式
—
賦值符號 「=「就是賦值運算符,作用是將一個數據賦給一個變量或將一個變量的值賦給另一個變量,由賦值運算符組成的表達式稱為賦值表達式。一般形式為:變量名 = 表達式。
在程序中可以多次給一個變量賦值,每賦一次值,與它相應的存儲單元中的數據就被更新一次,內存中當前的數據就是最後一次所賦值的那個數據。
例:a=12; 此表達式讀作「將10的值賦值給變量a」。
a、如果賦值號兩邊的運算對象類型不一致,系統會自動進行類型轉換,轉換的規則:將賦值號右邊表達式的值的類型轉換成賦值號左邊變量的類型,
例:int y=3.5;在變量y中最終存儲的是整數3。
b、 可以將複製表達式的值再賦值給變量,形成連續賦值。
例如:x=y=25 是一個連續賦值表達式,x=y=25 等價於x=(y=25),所以表達式x=y=25 最終的值為25 。
9.2 複合的賦值運算符
—
在賦值運算符之前加上其他運算符可以構成複合賦值運算符。其中與算術運算有關的複合運算符是:+=,-=,*=,/=,%= 。
兩個符號之間不可以有空格,複合賦值運算符的優先級與賦值運算符的相同。表達式n+=1等價於n=n+1,作用是取變量n中的值增1再賦給變量n,其他複合的賦值運算符的運算規則依次類推。
如求表達a+=a-=a*a 的值,其中a的初值為12 。
步驟:
先進行「a-=a*a「運算,相當於a=a-a*a=12-144=-132 。(2)再進行「a+=-132「運算,相當於 a=a+(-132)==-264 。
9.3 逗號運算符和逗號表達式
—
在c語言中,逗號除了作為分隔符,還可以用作一種運算符----逗號運算符,用逗號運算符將幾個表達式連接起來,例如a=b+c,a=b*c等稱為逗號表達式。
一般形式為:
表達式1 ,表達式2 ,表達式3 , …,表達式n
例:x=2,y=3,z=4
逗號表達式具有從左至右的結合性,即先求解表達式1,然後依次求解表達式2,直到表達式n的值。表達式n的值就是整個逗號表達式的值。上述的逗號表達式的值就是表達式z=4的值4.需要注意的是,逗號運算符是所有運算符中級別最低的。
例:有如下程序段:
main()
{
int a=2,b=4,c=6,x,y;
y=(x=a+b),(b+c);
printf("y=%d,x=%d",y,x);
}
程序顯示結果為:y=6,x=6
討論:將y=(x=a+b),(b+c);改為y=((x=a+b),b+c) 的程序結果?
10.1 C語言中的邏輯值
—
C語言中的邏輯值只有兩個:真(true)和假(flase)。用非零代表真,用零代表假。因此,對於任意一個表達式,如果它的值為零,就代表一個假值,如果它的值為非零,就代表一個真值。只要值不是零,不管是正數,負數,整數,實數,都代表一個真值。例如-5的邏輯值為真。
10.2 逗號運算符和逗號表達式
—
「&&」和「||」的運算對象有兩個,故它們都是雙目運算符,而!的運算對象只有一個,因此它是單目運算符。邏輯運算舉例如下:
(1)a&&b: 當&&兩邊都為「真」時,表達式a&&b的值才是真。
值得注意的是:在數學中,關係式0
(2)a||b: 當||兩邊有一個為「真」時,表達式a||b的值就是真。
(3)!a: 表示取反,如果a為真,則!A為假,反之亦然。例如!-5的值就為0。
在C語言中,由&&或||組成的邏輯表達式,在某些特定情況下會產生「短路「現象。
(1)x && y && z ,只有當x為真(非0)時,才需要判別y的值;只有x和y都為真時,才需要去判別z的值;只要x為假就不必判別y和z,整個表達式的值為0。口訣:「一假必假」。
例:
(!5==1)&&(++i==0) (!5==1)表達式的值為0,所以計算機運行中就跳過(++i==0)此表達式,(!5==1)&&(++i==0)表達式的值為0。
(2)x||y||z ,只要x的值為真(非零),就不必判別y和z的值 ,整個表達式的值為1,只有x的值為假,才需要判別y的值,只有x和y的值同時為假才需要判別z的值,口訣:「一真必真」。
11.1 位運算符
—
在計算機中,數據都是以二進位數形式存放的,位運算就是指對存儲單元中二進位位的運算。C語言提供6種位運算符。
11.2 位運算
—
位運算符 & |~<< >> ∧ 按優先級從高到低排列的順序是:
位運算符中求反運算「~「優先級最高,而左移和右移相同,居於第二,接下來的順序是按位與 「&「、按位異或 「∧「和按位或 「|「。順序為~ << >> & ∧ | 。
例1:左移運算符「<<」是雙目運算符。其功能把「<< 」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數,高位丟棄,低位補0。="" <="" span="">
例如:a<<4 指把a的各二進位向左移動4位。如a=00000011(十進位3),左移4位後為00(十進位48)。
例2:右移運算符「>>」是雙目運算符。其功能是把「>> 」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:設 a=15, a>>2 表示把右移為十進位3)。
應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。
例3:設二進位數a是00 ,若通過異或運算a∧b 使a的高4位取反,低4位不變,則二進位數b是。
解析:異或運算常用來使特定位翻轉,只要使需翻轉的位與1進行異或操作就可以了,因為原數中值為1的位與1進行異或運算得0 ,原數中值為0的位與1進行異或運算結果得1。而與0進行異或的位將保持原值。異或運算還可用來交換兩個值,不用臨時變量。
C語言在全世界普及推廣,無論在中國還是世界各國,C語言都是高等學校一門基本的計算機課程,C語言也在計算機領域發揮重要的作用。
C語言到底怎麼入門呢?夏老師帶你學習《C語言編程入門》
掃碼免費試看
本課程深入淺出地對C語言語法進行介紹,根據初學者的特點,分散難點,儘量用短小簡單的例子來演示概念,讓學員學以致用。
課程到底包含哪些內容呢?
C語言學習需要有一定的基礎編程知識,PLC編程基礎、和電腦操作知識即可,到底課程適合哪些學員?
1.自動化/電子相關專業師生
2.有plc或者其他程式語言的基礎,工控行業內需要用到C語言的工程師
3.對C有興趣想自學、轉行IT行業等人群
學習C語言是枯燥的?那肯定是你沒有聽過夏老師的課,來看看夏老師c++課程的同學們都怎麼說的?
最後老師給大家的建議:在學習過程中,要知行合一,在每節課結束後,要自己去編寫一次課程中的程序,多加練習,才能將知識鞏固。
掃碼免費試看