標籤:重複 成員 無符號 除法 不能 加法 乾貨 交換 算術
用一個簡單的c程式例子,介紹C語言基礎知識的基本構成、格式、以及良好的書寫風格,使小夥伴對c語言有個初步認識。
例1:計算兩個整數之和的c程式:
#include
main()
{
int a,b,sum;
a=20;
b=15;
sum=a+b;
printf(“a=%d,b=%d,sum=%d\n”,a,b,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
注意:(1)以#號開頭 (2)不以分號結尾
這一行沒有分號,所以不是語句,在c語言中稱之為命令列,或者叫做“先行編譯處理命令”。
7、程式中以 結尾的部分表示程式的注釋部分,注釋可以添加在程式的任何位置,為了提高程式的可讀性而添加,但電腦在執行主函數內容時完全忽略注釋部分,換而言之就是電腦當做注釋部分不存在於主函數中。
C程式的產生過程
C程式是先由源檔案經編譯產生目標檔案,然後經過串連產生可執行檔。
來源程式的副檔名為 .c ,目標程式的副檔名為 .obj , 可執行程式的副檔名為 .exe 。
標識符
在編寫程式時,必須為函數、變數等命名,這個名字稱為標識符。C語言中標識符的命名規則如下:
- 標識符只能由字母、數字、底線組成;
- 標識符的第一個字母必須是字母和底線;
- 標識符區分大小寫字母,如If和if是兩個完全不同的標識符。
合法標識符如下:
A6, b_3 , _mn
非法的標識符如下:
ab#12 , 8m , tr3:4 , yes no
標識符不能與程式中具有特殊意義的關鍵字相同,不能與使用者編製的函數名、C語言庫函數相同,在程式中各種標識符盡量不要重複,以便區分。選擇變數名和其他標識符時,應注意做到 “見名知義”。
標識符分為如下三類:
1、關鍵字
關鍵字是具有特定含義的,專門用來說明c語言特定成分的一類別識別項,不能用作使用者的標識符。
auto
break
case
char
union
do
double
else
enum
extern
goto
if
int
long
short
signed
static
sizof
struct
switch
unsigned
void
for
while
typedef
continue
float
return
typedef
default
2、預定義標識符
預定義標識符在c語言中也有特定的含義,但可以用作使用者識別碼,預定義標識符分為兩類:
(1)、庫函數名字,比如(printf,scanf,sin,isdigit等)
(2)、編譯處理命令名,比如(define,include)
3、使用者識別碼
使用者根據需要自己定義的標識符稱為使用者識別碼。無論如何自訂標識符,都必須符合標識符的三條命名規則。
常量
在程式運行中,其值不能被改變的量稱為常量。常量有5種類型:整型常量、實型常量、字元常量、字串常量和符號常量。
(一)數值轉換
數位四種表現形式:
①:二進位:所有數字由0,1構成,逢二進一,位元中不會出現2.。
例:110101
②:八進位:以數字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。。。。,然後將這些積求和。
例如:(1101)2=(13)10 (317)8=(207)10 (23E)16=(574)10
(3)二進位與八進位、十六進位數之間的相互轉換
①:二進位轉八進位:從右往左每三位一群組轉換成十進位數,將所得資料群組合就是對應的八位元(注意:高位不足三位補零)。
例:(010 110 111)2=(267)8
②:二進位轉十六進位:從右往左每四位一群組轉換成十進位數,將所得資料群組合就是對應的十六進位數(注意:高位不足四位補零)。
例:(0101 1011)2=(5B)16
③:八進位轉化二進位:每一位元字轉換為三位位元字
例:(13)8=(001 011)2=(1011)2
(注意:去掉前面的兩個00,因為0在高位沒有意義)
④:十六進位轉化二進位:每一位元字轉換為四位位元字
例:(E3)16=(1110 0011)2
(二)整型常量
整型常量有3種形式:十進位整型常量、八進位整型常量和十六進位整型常量。
(注意:c語言中沒有直接表示二進位的整型常量,在c語言來源程式中不會出現二進位。)
書寫方式如下:
十進位整型常量:123 , 0 ,-24 , 85L(長整型常量) 等
八進位整型常量:051 ,-026 ,0773 等
十六進位整型常量:0x55 , 0x1101 , 0x , 0x5AC0 , -0xFF。
其中L為長整型。
(三)實型常量
實型常量有兩種表示形式:小數形式和指數形式。
小數形式: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後面的指數必須為整數(注意:整數階碼可以是正數,負數,也可以是八位元、十六進位數,但必須為整數)。
(四)字元常量
字元常量的標誌是一對單引號‘ ’,c語言中的字元常量有兩類:
(1)由一對單引號括起來的一個字元,如‘a ’, ‘r’ ,‘#’。注意: ′a′ 和 ′A′ 是兩個不同的字元常量。
(2)由一對單引號括起來,以反斜線\開頭,後跟若干數字或者字母,比如‘\n’,其中“\“是轉義的意思,後面跟不同的字元表示不同的意思,這類字元常量叫逸出字元。具體 。
逸出字元 逸出字元的意義 ASCII碼
\n 斷行符號換行 10
\t 橫向跳到下一製表位置 9
\b 退格 8
\r 斷行符號 13
\f 走紙換頁 12
\\ 反斜線符"\" 92
\‘ 單引號符 39
\” 雙引號符 34
\a 鳴鈴 7
\ddd 1~3位八位元所代表的字元
\xhh 1~2位十六進位數所代表的字元
(五)字串常量
C語言中,以雙引號括起來的,由若干個字元組成的序列即為字串常量。
例:“ni hao” “happy”等等。
(六)符號常量
符號常量是由宏定義“#define“定義的常量,在C程式中可用標識符代表一個常量。
例:計算圓的面積的c程式。
#include
#define PI 3.14159
main()
{
float r,s;
r=12.5;
S=PI *r*r;
printf(“s= %f ”,s);
}
說明:#define 是宏定義,此程式中所有出現PI的地方都代表3.14159,同時PI稱為符號常量。習慣上我們用大寫字母來表示符號常量,小寫字母表示變數,這樣比較容易區別。
變數
變數就是其值可以改變的量。變數要有變數名,在記憶體中佔據一定的儲存單元,儲存單元裡存放的是該變數的值。不同類型的變數其儲存單元的大小不同,變數在使用前必須定義。
(一)整型變數
整型變數分為4種:基本型(int)、短整型(short int 或short)、長整型(long int 或 long)和無符號型(unsigned int ,unsigned short,unsigned long)。
不同的編譯系統對上述四種整型資料所佔用的位元和數值範圍有不同的規定。
類型說明符
說明:
單詞signed來說明“有符號”(即有正負數之分),不寫signed也隱含說明為有符號,unsigned用來說明“無符號”(只表示正數)。
(二)實型變數
C語言中,實型變數分為單精確度類型( float )和雙精確度類型( double )兩種。如:
float a , b ;
double m ;
在vc中,float 型資料在記憶體中佔4個位元組(32位),double型資料佔8個位元組。單精確度實數提供7位有效數字,雙精確度實數提供15~16位有效數字。實型常量不分float型和double型,一個實型常量可以賦給一個float 型或double型變數,但變數根據其類型截取實型常量中相應的有效數字。
注意:實型變數只能存放實型值,不能用整型變數存放實型值,也不能用實型變數存放整型值。
(三)字元變數
字元變數用來存放字元常量,定義形式:
char 變數名;
其中關鍵字char定義字元型資料類型,佔用一個位元組的儲存單元。
例:char cr1,cr2;
cr1= ‘A’ , cr2=‘B’ ;
將一個字元賦給一個字元變數時,並不是將該字元本身儲存到記憶體中,而是將該字元對應的ASCII碼儲存到記憶體單元中。例如,字元 ′A′ 的ASCII碼為65,在記憶體中的存放形式如下:01000001
由於在記憶體中字元以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運算子認識
C語言的運算子範圍很廣,可分為以下幾類:
1、算術運算子:用於各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求餘(%)、自增(++)、自減(--)共七種。
2、賦值運算子:用於賦值運算,分為簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位元運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
3、逗號運算子:用於把若干運算式組合成一個運算式(,)。
4、關係運算子:用於比較運算。包括大於(>)、小於(<)、等於(==)、 大於等於(>=)、小於等於(<=)和不等於(!=)六種。
5、邏輯運算子:用於邏輯運算。包括與(&&)、或(||)、非(!)三種。
6、條件運算子:這是一個三目運算子,用於條件求值(?:)。
7、位操作運算子:參與運算的量,按二進位位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
8、指標運算子:用於取內容(*)和取地址(&)二種運算。
9、求位元組數運算子:用於計算資料類型所佔的位元組數(sizeof)。
10、特殊運算子:有括弧(),下標[],成員(→,.)等幾種。
另外,按參與運算的對象個數,C語言運算子可分為:單目運算子 (如 !)、雙目運算子 (如+,- )和三目運算子 (如 ? : )。
算術運算子和算術運算式
一、基本的算術運算子
(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。
二、 算術運算式和運算子的優先順序與結合性
算術運算式是用算術運算子和括弧將運算量(也稱運算元)串連起來的、符合C語言文法規則的運算式。運算對象包括函數、常量和變數等。
在電腦語言中,算術運算式的求值規律與數學中的四則運算的規律類似,其運算規則和要求如下。
(1)在算術運算式中,可使用多層圓括弧,但括弧必須配對。運算時從內層圓括弧開始,由內向外依次計算各運算式的值。
(2)在算術運算式中,對於不同優先順序的運算子,可按運算子的優先順序由高到低進行運算,若運算式中運算子的優先順序相同,則按運算子的結合方向進行運算。
(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”的區別,特別弄清楚運算式的值和變數的值。
賦值運算子與賦值運算式
一、賦值運算子與賦值運算式
賦值符號 “=“就是賦值運算子,作用是將一個資料賦給一個變數或將一個變數的值賦給另一個變數,由賦值運算子組成的運算式稱為賦值運算式。一般形式為:
變數名 = 運算式
在程式中可以多次給一個變數賦值,每賦一次值,與它相應的儲存單元中的資料就被更新一次,記憶體中當前的資料就是最後一次所賦值的那個資料。
例: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 。
二、複合的賦值運算子
在賦值運算子之前加上其他運算子可以構成複合賦值運算子。其中與算術運算有關的複合運算子是:+=,-=,*=,/=,%= 。
兩個符號之間不可以有空格,複合賦值運算子的優先順序與賦值運算子的相同。運算式n+=1等價於n=n+1,作用是取變數n中的值增1再賦給變數n,其他複合的賦值運算子的運算規則依次類推。
如求表達a+=a-=a*a 的值,其中a的初值為12 。
步驟:
(1)先進行“a-=a*a“運算,相當於a=a-a*a=12-144=-132 。
(2)再進行“a+=-132“運算,相當於 a=a+(-132)=-132-132=-264 。
逗號運算子和逗號運算式
在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) 的程式結果?
關係運算子和關聯運算式
一、C語言中的邏輯值
C語言中的邏輯值只有兩個:真(true)和假(flase)。用非零代表真,用零代表假。因此,對於任意一個運算式,如果它的值為零,就代表一個假值,如果它的值為非零,就代表一個真值。只要值不是零,不管是正數,負數,整數,實數,都代表一個真值。例如-5的邏輯值為真。
二、邏輯運算式
“&&”和“||”的運算對象有兩個,故它們都是雙目運算子,而!的運算對象只有一個,因此它是單目運算子。邏輯運算舉例如下:
(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的值,口訣:“一真必真”。
位元運算
一、位元運算符
在電腦中,資料都是以位元形式存放的,位元運算就是指對儲存單元中二進位位的運算。C語言提供6種位元運算符。
二、位元運算
位元運算符 & |~<< >> ∧ 按優先順序從高到低排列的順序是:
位元運算符中求反運算“~“優先順序最高,而左移和右移相同,居於第二,接下來的順序是按位與 “&“、按位異或 “∧“和按位或 “|“。順序為~ << >> & ∧ | 。
例1:左移運算子“<<”是雙目運算子。其功能把“<< ”左邊的運算數的各二進位全部左移若干位,由“<<”右邊的數指定移動的位元,高位丟棄,低位補0。
例如:
a<<4
指把a的各二進位向左移動4位。如a=00000011(十進位3),左移4位後為00110000(十進位48)。
例2:右移運算子“>>”是雙目運算子。其功能是把“>> ”左邊的運算數的各二進位全部右移若干位,“>>”右邊的數指定移動的位元。
例如:
設 a=15,
a>>2
表示把000001111右移為00000011(十進位3)。
應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。
例3:設位元a是00101101 ,若通過異或運算a∧b 使a的高4位取反,低4位不變,則位元b是。
解析:異或運算常用來使特定位翻轉,只要使需翻轉的位與1進行異或操作就可以了,因為原數中值為1的位與1進行異或運算得0 ,原數中值為0的位與1進行異或運算結果得1。而與0進行異或的位將保持原值。異或運算還可用來交換兩個值,不用臨時變數。
如 int a=3 , b=4;,想將a與b的值互換,可用如下語句實現:
a=a∧b;
b=b∧a;
a=a∧b;
所以本題的答案為: 11110000 。
C語言作為一門非常適合編程入門的語言,打好C語言基礎知識的重要性不言而喻。所以學長特此奉上這一篇乾貨,希望小夥伴們能從中受益。
C語言基礎知識整理