關(guān)于c語言基礎(chǔ)知識(shí)有哪些 IT知識(shí)
電腦知識(shí) 由優(yōu)爾供稿C語言是世界上最流行、使用最廣泛的高級(jí)程序設(shè)計(jì)語言之一。在操作系統(tǒng)和系統(tǒng)使用程序以及需要對(duì)硬件進(jìn)行操作的場合,用C語言明顯優(yōu)于其它高級(jí)語言,許多大型應(yīng)用軟件都是用C語言編寫的。下面一起來看看9252兒童網(wǎng)小編為大家整理的c語言基礎(chǔ)知識(shí)有哪些,歡迎閱讀,僅供參考。
C語言基礎(chǔ)知識(shí)
C語言程序的結(jié)構(gòu)認(rèn)識(shí)
用一個(gè)簡單的c程序例子,介紹c語言的基本構(gòu)成、格式、以及良好的書寫風(fēng)格,使小伙伴對(duì)c語言有個(gè)初步認(rèn)識(shí)。
例1:計(jì)算兩個(gè)整數(shù)之和的c程序:
#include main() { int a,b,sum; /*定義變量a,b,sum為整型變量*/ a=20; /*把整數(shù)20賦值給整型變量a*/ b=15; /*把整數(shù)15賦值給整型變量b*/ sum=a+b; /*把兩個(gè)數(shù)之和賦值給整型變量sum*/ printf(“a=%d,b=%d,sum=%d\n”,a,b,sum); /*把計(jì)算結(jié)果輸出到顯示屏上*/ }
重點(diǎn)說明:
1、任何一個(gè)c語言程序都必須包括以下格式:
main() { }
這是c語言的基本結(jié)構(gòu),任何一個(gè)程序都必須包含這個(gè)結(jié)構(gòu)。括號(hào)內(nèi)可以不寫任何內(nèi)容,那么該程序?qū)⒉粓?zhí)行任何結(jié)果。
2、main()----在c語言中稱之為“主函數(shù)”,一個(gè)c程序有且僅有一個(gè)main函數(shù),任何一個(gè)c程序總是從main函數(shù)開始執(zhí)行,main函數(shù)后面的一對(duì)圓括號(hào)不能省略。
3、被大括號(hào){ }括起來的內(nèi)容稱為main函數(shù)的函數(shù)體,這部分內(nèi)容就是計(jì)算機(jī)要執(zhí)行的內(nèi)容。
4、在{ }里面每一句話后面都有一個(gè)分號(hào)(;),在c語言中,我們把以一個(gè)分號(hào)結(jié)尾的一句話叫做一個(gè)c語言的語句,分號(hào)是語句結(jié)束的標(biāo)志。
5、printf(“a=%d,b=%d,sum=%d\n”,a,b,sum); ----通過執(zhí)行這條c語言系統(tǒng)提供給我們直接使用的屏幕輸出函數(shù),用戶即可看到運(yùn)行結(jié)果,本程序運(yùn)行后,將在顯示器上顯示如下結(jié)果:
a=20,b=15,sum=35
6、#include
注意:(1)以#號(hào)開頭 (2)不以分號(hào)結(jié)尾 這一行沒有分號(hào),所以不是語句,在c語言中稱之為命令行,或者叫做“預(yù)編譯處理命令”。
7、程序中以 /*開頭并且以*/結(jié)尾的部分表示程序的注釋部分,注釋可以添加在程序的任何位置,為了提高程序的可讀性而添加,但計(jì)算機(jī)在執(zhí)行主函數(shù)內(nèi)容時(shí)完全忽略注釋部分,換而言之就是計(jì)算機(jī)當(dāng)做注釋部分不存在于主函數(shù)中。
C程序的生成過程
C程序是先由源文件經(jīng)編譯生成目標(biāo)文件,然后經(jīng)過連接生成可執(zhí)行文件。
源程序的擴(kuò)展名為 .c ,目標(biāo)程序的擴(kuò)展名為 .obj , 可執(zhí)行程序的擴(kuò)展名為 .exe 。
標(biāo)識(shí)符
在編寫程序時(shí),必須為函數(shù)、變量等命名,這個(gè)名字稱為標(biāo)識(shí)符。C語言中標(biāo)識(shí)符的命名規(guī)則如下:
標(biāo)識(shí)符只能由字母、數(shù)字、下劃線組成;
標(biāo)識(shí)符的第一個(gè)字母必須是字母和下劃線;
標(biāo)識(shí)符區(qū)分大小寫字母,如If和if是兩個(gè)完全不同的標(biāo)識(shí)符。
合法標(biāo)識(shí)符如下: A6, b_3 , _mn 非法的標(biāo)識(shí)符如下: ab#12 , 8m , tr3:4 , yes no
標(biāo)識(shí)符不能與程序中具有特殊意義的關(guān)鍵字相同,不能與用戶編制的函數(shù)名、C語言庫函數(shù)相同,在程序中各種標(biāo)識(shí)符盡量不要重復(fù),以便區(qū)分。選擇變量名和其他標(biāo)識(shí)符時(shí),應(yīng)注意做到 “見名知義”。
標(biāo)識(shí)符分為如下三類:
1、關(guān)鍵字
關(guān)鍵字是具有特定含義的,專門用來說明c語言特定成分的一類標(biāo)識(shí)符,不能用作用戶的標(biāo)識(shí)符。
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、預(yù)定義標(biāo)識(shí)符
預(yù)定義標(biāo)識(shí)符在c語言中也有特定的含義,但可以用作用戶標(biāo)識(shí)符,預(yù)定義標(biāo)識(shí)符分為兩類:
(1)、庫函數(shù)名字,比如(printf,scanf,sin,isdigit等) (2)、編譯處理命令名,比如(define,include)
3、用戶標(biāo)識(shí)符
用戶根據(jù)需要自己定義的標(biāo)識(shí)符稱為用戶標(biāo)識(shí)符。無論如何自定義標(biāo)識(shí)符,都必須符合標(biāo)識(shí)符的三條命名規(guī)則。
常量
在程序運(yùn)行中,其值不能被改變的量稱為常量。常量有5種類型:整型常量、實(shí)型常量、字符常量、字符串常量和符號(hào)常量。
(一)數(shù)值轉(zhuǎn)換
數(shù)字的四種表現(xiàn)形式:
①:二進(jìn)制:所有數(shù)字由0,1構(gòu)成,逢二進(jìn)一,二進(jìn)制數(shù)中不會(huì)出現(xiàn)2.。 例: ②:八進(jìn)制:以數(shù)字0(注意不是以字母O,o)開頭,所有數(shù)字由0~7構(gòu)成,逢八進(jìn)一,八進(jìn)制數(shù)中不會(huì)出現(xiàn)8。 例:0112,0123,077等 ③:十進(jìn)制:所有數(shù)字由0~9構(gòu)成,逢十進(jìn)一,十進(jìn)制數(shù)中不會(huì)出現(xiàn)10。 例:0,12,-15等 ④:十六進(jìn)制:以0x或者0X(數(shù)字0加字母x)開頭,所有數(shù)字由0~9,A~F(或者a~f)構(gòu)成,逢十六進(jìn)一(其中A、B、C、D、E、F分別代表10、11、12、13、14、15) 例:0x4A、0X14c7等
在計(jì)算機(jī)內(nèi)部,數(shù)字均以二進(jìn)制形式表示和存放,用戶輸入的普通十進(jìn)制數(shù)字都要被計(jì)算機(jī)轉(zhuǎn)換成二進(jìn)制才能在計(jì)算機(jī)內(nèi)部存儲(chǔ),同樣計(jì)算機(jī)的運(yùn)算結(jié)果也為二進(jìn)制,一般要將其轉(zhuǎn)換成十進(jìn)制數(shù)再輸出給用戶閱讀,這種轉(zhuǎn)換通常由計(jì)算機(jī)自動(dòng)實(shí)現(xiàn)。
(1)將十進(jìn)制轉(zhuǎn)換二進(jìn)制、八進(jìn)制和十六進(jìn)制
除法:將十進(jìn)制數(shù)除以2,記錄余數(shù),得到的商繼續(xù)除以2,直到商為0,然后將各次相處所得的余數(shù)從后往前逆序排列,所得余數(shù)數(shù)字序列就是該十進(jìn)制數(shù)對(duì)應(yīng)的二進(jìn)制數(shù)。八進(jìn)制和十六進(jìn)制轉(zhuǎn)換方法同上。
例:十進(jìn)制數(shù)13轉(zhuǎn)換成二進(jìn)制數(shù)的值為1101,轉(zhuǎn)換八進(jìn)制為015,轉(zhuǎn)換成十六進(jìn)制為D.
(2)將二進(jìn)制、八進(jìn)制和十六進(jìn)制轉(zhuǎn)換成十進(jìn)制
乘積求和:將二進(jìn)制的每一位從低位到高位(右邊為低位,左邊為高位)分別乘以20,21,22。。。。,然后將這些積求和。
例如:=(13)10 (317)8= (23E)16=
(3)二進(jìn)制與八進(jìn)制、十六進(jìn)制數(shù)之間的相互轉(zhuǎn)換
①:二進(jìn)制轉(zhuǎn)八進(jìn)制:從右往左每三位一組轉(zhuǎn)換成十進(jìn)制數(shù),將所得數(shù)據(jù)組合就是對(duì)應(yīng)的八進(jìn)制數(shù)(注意:高位不足三位補(bǔ)零)。 例:(010 110 111)2=(267)8 ②:二進(jìn)制轉(zhuǎn)十六進(jìn)制:從右往左每四位一組轉(zhuǎn)換成十進(jìn)制數(shù),將所得數(shù)據(jù)組合就是對(duì)應(yīng)的十六進(jìn)制數(shù)(注意:高位不足四位補(bǔ)零)。 例:(0101 1011)2=(5B)16 ③:八進(jìn)制轉(zhuǎn)化二進(jìn)制:每一位數(shù)字轉(zhuǎn)換為三位二進(jìn)制數(shù)字 例:(13)8=(001 011)2= (注意:去掉前面的兩個(gè)00,因?yàn)?在高位沒有意義) ④:十六進(jìn)制轉(zhuǎn)化二進(jìn)制:每一位數(shù)字轉(zhuǎn)換為四位二進(jìn)制數(shù)字 例:(E3)16=(1110 0011)2
(二)整型常量
整型常量有3種形式:十進(jìn)制整型常量、八進(jìn)制整型常量和十六進(jìn)制整型常量。
(注意:c語言中沒有直接表示二進(jìn)制的整型常量,在c語言源程序中不會(huì)出現(xiàn)二進(jìn)制。)
書寫方式如下:
十進(jìn)制整型常量:123 , 0 ,-24 , 85L(長整型常量) 等 八進(jìn)制整型常量:051 ,-026 ,0773 等 十六進(jìn)制整型常量:0x55 , 0x1101 , 0x , 0x5AC0 , -0xFF。 其中L為長整型。
(三)實(shí)型常量
實(shí)型常量有兩種表示形式:小數(shù)形式和指數(shù)形式。
小數(shù)形式:5.4 0.074 -23.0 指數(shù)形式:5.4e0 4.3e-3 -3.3e4
(1)小數(shù)部分為0的實(shí)型常量,可以寫為453.0 或453。 (2)用小數(shù)表示時(shí),小數(shù)點(diǎn)的兩邊必須有數(shù),不能寫成“ .453“和“453.“,而應(yīng)該寫成“0.453“和“453.0“。 (3)用指數(shù)寫法時(shí),e前必須有數(shù)字,e后面的指數(shù)必須為整數(shù)(注意:整數(shù)階碼可以是正數(shù),負(fù)數(shù),也可以是八進(jìn)制數(shù)、十六進(jìn)制數(shù),但必須為整數(shù))。
(四)字符常量
字符常量的標(biāo)志是一對(duì)單引號(hào)‘ ’,c語言中的字符常量有兩類:
(1)由一對(duì)單引號(hào)括起來的一個(gè)字符,如‘a ’, ‘r’ ,‘#’。注意: ′a′ 和 ′A′ 是兩個(gè)不同的字符常量。
(2)由一對(duì)單引號(hào)括起來,以反斜杠\開頭,后跟若干數(shù)字或者字母,比如‘\n’,其中“\“是轉(zhuǎn)義的意思,后面跟不同的字符表示不同的意思,這類字符常量叫轉(zhuǎn)義字符。具體如圖所示 。
轉(zhuǎn)義字符 轉(zhuǎn)義字符的意義 ASCII碼
\n 回車換行 10 \t 橫向跳到下一制表位置 9 \b 退格 8 \r 回車 13 \f 走紙換頁 12 \\ 反斜線符"\" 92 \' 單引號(hào)符 39 \” 雙引號(hào)符 34 \a 鳴鈴 7 \ddd 1~3位八進(jìn)制數(shù)所代表的字符 \xhh 1~2位十六進(jìn)制數(shù)所代表的字符
(五)字符串常量
C語言中,以雙引號(hào)括起來的,由若干個(gè)字符組成的序列即為字符串常量。
例:“ni hao” “happy”等等。
(六)符號(hào)常量
符號(hào)常量是由宏定義“#define“定義的常量,在C程序中可用標(biāo)識(shí)符代表一個(gè)常量。
例:計(jì)算圓的面積的c程序。
#include #define PI 3. main() { float r,s; r=12.5; S=PI *r*r; printf(“s= %f ”,s); }
說明:
#define 是宏定義,此程序中所有出現(xiàn)PI的地方都代表3.,同時(shí)PI稱為符號(hào)常量。習(xí)慣上我們用大寫字母來表示符號(hào)常量,小寫字母表示變量,這樣比較容易區(qū)別。
變量
變量就是其值可以改變的量。變量要有變量名,在內(nèi)存中占據(jù)一定的存儲(chǔ)單元,存儲(chǔ)單元里存放的是該變量的值。不同類型的變量其存儲(chǔ)單元的大小不同,變量在使用前必須定義。
(一)整型變量
整型變量分為4種:基本型(int)、短整型(short int 或short)、長整型(long int 或 long)和無符號(hào)型(unsigned int ,unsigned short,unsigned long)。
不同的編譯系統(tǒng)對(duì)上述四種整型數(shù)據(jù)所占用的位數(shù)和數(shù)值范圍有不同的規(guī)定。
類型說明符
字節(jié) 數(shù)值范圍 字符型
基本整型 char 1 C字符集
int 2 -32768 ~ 32767
短整型 short int 2 -32768 ~ 32767
長整型 long int 4 -214783648 ~ 214783647
無符號(hào)型 unsigned 2 0~65535
無符號(hào)長整型 unsigned long 4 0~4294967295
單精度實(shí)型 float 4 3/4E-38 ~3/4E+38
雙精度實(shí)型 double 8 1/7E-308~1/7E+308
單詞signed來說明“有符號(hào)”(即有正負(fù)數(shù)之分),不寫signed也隱含說明為有符號(hào),unsigned用來說明“無符號(hào)”(只表示正數(shù))。
(二)實(shí)型變量
C語言中,實(shí)型變量分為單精度類型( float )和雙精度類型( double )兩種。如:
float a , b ; double m ;
在vc中,float 型數(shù)據(jù)在內(nèi)存中占4個(gè)字節(jié)(32位),double型數(shù)據(jù)占8個(gè)字節(jié)。單精度實(shí)數(shù)提供7位有效數(shù)字,雙精度實(shí)數(shù)提供15~16位有效數(shù)字。實(shí)型常量不分float型和double型,一個(gè)實(shí)型常量可以賦給一個(gè)float 型或double型變量,但變量根據(jù)其類型截取實(shí)型常量中相應(yīng)的有效數(shù)字。
注意:實(shí)型變量只能存放實(shí)型值,不能用整型變量存放實(shí)型值,也不能用實(shí)型變量存放整型值。
(三)字符變量
字符變量用來存放字符常量,定義形式:
char 變量名;
其中關(guān)鍵字char定義字符型數(shù)據(jù)類型,占用一個(gè)字節(jié)的存儲(chǔ)單元。
例:char cr1,cr2; cr1= ‘A’ , cr2=‘B’ ;
將一個(gè)字符賦給一個(gè)字符變量時(shí),并不是將該字符本身存儲(chǔ)到內(nèi)存中,而是將該字符對(duì)應(yīng)的ASCII碼存儲(chǔ)到內(nèi)存單元中。例如,字符 ′A′ 的ASCII碼為65,在內(nèi)存中的存放形式如下:0
由于在內(nèi)存中字符以ASCII碼存放,它的存儲(chǔ)形式和整數(shù)的存儲(chǔ)形式類似,所以C語言中字符型數(shù)據(jù)與整型數(shù)據(jù)之間可以通用,一個(gè)字符能用字符的形式輸出,也能用整數(shù)的形式輸出,字符數(shù)據(jù)也能進(jìn)行算術(shù)運(yùn)算,此時(shí)相當(dāng)于對(duì)它們的ASCII碼進(jìn)行運(yùn)算。
類型的自動(dòng)轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換
當(dāng)同一表達(dá)式中各數(shù)據(jù)的類型不同時(shí),編譯程序會(huì)自動(dòng)把它們轉(zhuǎn)變成同一類型后再進(jìn)行計(jì)算。轉(zhuǎn)換優(yōu)先級(jí)為:
char < int < float < double
即左邊級(jí)別“低“的類型向右邊轉(zhuǎn)換。具體地說,若在表達(dá)式中優(yōu)先級(jí)最高的數(shù)據(jù)是double型,則此表達(dá)式中的其他數(shù)據(jù)均被轉(zhuǎn)換成double型,且計(jì)算結(jié)果也是double型;若在表達(dá)式中優(yōu)先級(jí)最高的數(shù)據(jù)是float型,則此表達(dá)式中的其他數(shù)據(jù)均被轉(zhuǎn)換成float型,且計(jì)算結(jié)果也是float型。
在做賦值運(yùn)算時(shí),若賦值號(hào)左右兩邊的類型不同,則賦值號(hào)右邊的類型向左邊的類型轉(zhuǎn)換;當(dāng)右邊的類型高于左邊的類型時(shí),則在轉(zhuǎn)換時(shí)對(duì)右邊的數(shù)據(jù)進(jìn)行截取。
除自動(dòng)轉(zhuǎn)換外,還有強(qiáng)制轉(zhuǎn)換,表示形式是:
( 類型 )(表達(dá)式); 例:(int)(a+b)
討論:當(dāng)a值賦值為3.4,b值賦值為2.7,(int)(a+b)和(int)a+b的值分別為多少?
C運(yùn)算符認(rèn)識(shí)
C語言的運(yùn)算符范圍很廣,可分為以下幾類:
、算術(shù)運(yùn)算符:用于各類數(shù)值運(yùn)算。包括加(+)、減(-)、乘(*)、除(/)、求余(%)、自增(++)、自減(--)共七種。
、賦值運(yùn)算符:用于賦值運(yùn)算,分為簡單賦值(=)、復(fù)合算術(shù)賦值(+=,-=,*=,/=,%=)和復(fù)合位運(yùn)算賦值(&=,|=,^=,>>=,<<=)三類共十一種。 <="" span="">
、逗號(hào)運(yùn)算符:用于把若干表達(dá)式組合成一個(gè)表達(dá)式(,)。
、關(guān)系運(yùn)算符:用于比較運(yùn)算。包括大于(>)、小于(<)、等于(==)、 大于等于(="">=)、小于等于(<=)和不等于(!=)六種。 <="" span="">
、邏輯運(yùn)算符:用于邏輯運(yùn)算。包括與(&&)、或(||)、非(!)三種。
、條件運(yùn)算符:這是一個(gè)三目運(yùn)算符,用于條件求值(?:)。
、位操作運(yùn)算符:參與運(yùn)算的量,按二進(jìn)制位進(jìn)行運(yùn)算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
8、指針運(yùn)算符:用于取內(nèi)容(*)和取地址(&)二種運(yùn)算。
9、求字節(jié)數(shù)運(yùn)算符:用于計(jì)算數(shù)據(jù)類型所占的字節(jié)數(shù)(sizeof)。
10、特殊運(yùn)算符:有括號(hào)(),下標(biāo)[],成員(→,.)等幾種。
另外,按參與運(yùn)算的對(duì)象個(gè)數(shù),C語言運(yùn)算符可分為:單目運(yùn)算符 (如 !)、雙目運(yùn)算符 (如+,- )和三目運(yùn)算符 (如 ? : )。
算術(shù)運(yùn)算符和算術(shù)表達(dá)式
一、 基本的算術(shù)運(yùn)算符
(1)+(加法運(yùn)算符或正值運(yùn)算符,如2+5)。
(2)-(減法運(yùn)算符或負(fù)值運(yùn)算符,如4-2)。
(3)*(乘法運(yùn)算符,如3*8)。
(4)/(除法運(yùn)算符,如11/5)。
/的運(yùn)算分為兩種情況:
a、“除”的左右兩邊都為整數(shù)時(shí),所得結(jié)果必然是整數(shù)(注意:僅取整數(shù)部分,不是四舍五入)
比如:5/2的值為2,不是2.5,1/2的值為0。
b、“除”的左右兩邊至少有一個(gè)是實(shí)型數(shù)據(jù)(即小數(shù))時(shí),所得結(jié)果為實(shí)型數(shù)據(jù)。
比如:5/2.0的值為2.5,7.0/2.0的值為3.5.
(5)%(模運(yùn)算符或稱求余運(yùn)算符,%兩側(cè)均應(yīng)為整型數(shù)據(jù),如9%7的值為2)。
需要說明的是:當(dāng)運(yùn)算對(duì)象為負(fù)數(shù)時(shí),所得結(jié)果隨編譯器不同而不同,在vc中,結(jié)果的符號(hào)與被除數(shù)相同,比如:13%-2值為1,而-15%2值為-1。
二、 算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級(jí)與結(jié)合性
算術(shù)表達(dá)式是用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算量(也稱操作數(shù))連接起來的、符合C語言語法規(guī)則的表達(dá)式。運(yùn)算對(duì)象包括函數(shù)、常量和變量等。
在計(jì)算機(jī)語言中,算術(shù)表達(dá)式的求值規(guī)律與數(shù)學(xué)中的四則運(yùn)算的規(guī)律類似,其運(yùn)算規(guī)則和要求如下。
(1)在算術(shù)表達(dá)式中,可使用多層圓括號(hào),但括號(hào)必須配對(duì)。運(yùn)算時(shí)從內(nèi)層圓括號(hào)開始,由內(nèi)向外依次計(jì)算各表達(dá)式的值。
(2)在算術(shù)表達(dá)式中,對(duì)于不同優(yōu)先級(jí)的運(yùn)算符,可按運(yùn)算符的優(yōu)先級(jí)由高到低進(jìn)行運(yùn)算,若表達(dá)式中運(yùn)算符的優(yōu)先級(jí)相同,則按運(yùn)算符的結(jié)合方向進(jìn)行運(yùn)算。
(3)如果一個(gè)運(yùn)算符兩側(cè)的操作數(shù)類型不同,則先利用自動(dòng)轉(zhuǎn)換或強(qiáng)制類型轉(zhuǎn)換,使兩者具有相同類型,然后進(jìn)行運(yùn)算。
三、 自增自減運(yùn)算符
作用:使變量的值增1或減1。
如:++i,--i (在使用i之前,先使i的值加1、減1)。 i++,i-- (在使用i之后,使i的值加1、減1)。
(1)只有變量才能用自增運(yùn)算符 (++)和自減運(yùn)算符(--),而常量或表達(dá)式不能用,如10++或(x+y)++都是不合法的。
(2)++和--的結(jié)合方向是“自右向左“,如 -i++ ,i的左邊是負(fù)號(hào)運(yùn)算符,右邊是自增運(yùn)算符,負(fù)號(hào)運(yùn)算和自增運(yùn)算都是 “自右向左“結(jié)合的,相當(dāng)于 -(i++)。
在循環(huán)語句中常用到自增(減)運(yùn)算符,在指針中也常用到該運(yùn)算符,考生要弄清楚“i++”和“++i”及“i--”和“--i”的區(qū)別,特別弄清楚表達(dá)式的值和變量的值。
賦值運(yùn)算符與賦值表達(dá)式
一、賦值運(yùn)算符與賦值表達(dá)式
賦值符號(hào) “=“就是賦值運(yùn)算符,作用是將一個(gè)數(shù)據(jù)賦給一個(gè)變量或?qū)⒁粋€(gè)變量的值賦給另一個(gè)變量,由賦值運(yùn)算符組成的表達(dá)式稱為賦值表達(dá)式。一般形式為:
變量名 = 表達(dá)式
在程序中可以多次給一個(gè)變量賦值,每賦一次值,與它相應(yīng)的存儲(chǔ)單元中的數(shù)據(jù)就被更新一次,內(nèi)存中當(dāng)前的數(shù)據(jù)就是最后一次所賦值的那個(gè)數(shù)據(jù)。
例:a=12; 此表達(dá)式讀作“將10的值賦值給變量a”。
a、如果賦值號(hào)兩邊的運(yùn)算對(duì)象類型不一致,系統(tǒng)會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換,轉(zhuǎn)換的規(guī)則:將賦值號(hào)右邊表達(dá)式的值的類型轉(zhuǎn)換成賦值號(hào)左邊變量的類型,
例:int y=3.5; 在變量y中最終存儲(chǔ)的是整數(shù)3。
b、 可以將復(fù)制表達(dá)式的值再賦值給變量,形成連續(xù)賦值。
例如:x=y=25 是一個(gè)連續(xù)賦值表達(dá)式,x=y=25 等價(jià)于x=(y=25),所以表達(dá)式x=y=25 最終的值為25 。
二、復(fù)合的賦值運(yùn)算符
在賦值運(yùn)算符之前加上其他運(yùn)算符可以構(gòu)成復(fù)合賦值運(yùn)算符。其中與算術(shù)運(yùn)算有關(guān)的復(fù)合運(yùn)算符是:+=,-=,*=,/=,%= 。
兩個(gè)符號(hào)之間不可以有空格,復(fù)合賦值運(yùn)算符的優(yōu)先級(jí)與賦值運(yùn)算符的相同。表達(dá)式n+=1等價(jià)于n=n+1,作用是取變量n中的值增1再賦給變量n,其他復(fù)合的賦值運(yùn)算符的運(yùn)算規(guī)則依次類推。
如求表達(dá)a+=a-=a*a 的值,其中a的初值為12 。
步驟:
(1)先進(jìn)行“a-=a*a“運(yùn)算,相當(dāng)于a=a-a*a=12-144=-132 。 (2)再進(jìn)行“a+=-132“運(yùn)算,相當(dāng)于 a=a+(-132)==-264 。
逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式
在c語言中,逗號(hào)除了作為分隔符,還可以用作一種運(yùn)算符----逗號(hào)運(yùn)算符,用逗號(hào)運(yùn)算符將幾個(gè)表達(dá)式連接起來,例如a=b+c,a=b*c等稱為逗號(hào)表達(dá)式。
一般形式為:
表達(dá)式1 ,表達(dá)式2 ,表達(dá)式3 , …,表達(dá)式n
例:x=2,y=3,z=4
逗號(hào)表達(dá)式具有從左至右的結(jié)合性,即先求解表達(dá)式1,然后依次求解表達(dá)式2,直到表達(dá)式n的值。表達(dá)式n的值就是整個(gè)逗號(hào)表達(dá)式的值。上述的逗號(hào)表達(dá)式的值就是表達(dá)式z=4的值4.需要注意的是,逗號(hào)運(yùn)算符是所有運(yùn)算符中級(jí)別最低的。
例:有如下程序段:
main() { int a=2,b=4,c=6,x,y; y=(x=a+b),(b+c); printf("y=%d,x=%d",y,x); }
程序顯示結(jié)果為:y=6,x=6
討論:將y=(x=a+b),(b+c);改為y=((x=a+b),b+c) 的程序結(jié)果?
關(guān)系運(yùn)算符和關(guān)系表達(dá)式
一、 C語言中的邏輯值
C語言中的邏輯值只有兩個(gè):真(true)和假(flase)。用非零代表真,用零代表假。因此,對(duì)于任意一個(gè)表達(dá)式,如果它的值為零,就代表一個(gè)假值,如果它的值為非零,就代表一個(gè)真值。只要值不是零,不管是正數(shù),負(fù)數(shù),整數(shù),實(shí)數(shù),都代表一個(gè)真值。例如-5的邏輯值為真。
二、 邏輯表達(dá)式
“&&”和“||”的運(yùn)算對(duì)象有兩個(gè),故它們都是雙目運(yùn)算符,而!的運(yùn)算對(duì)象只有一個(gè),因此它是單目運(yùn)算符。邏輯運(yùn)算舉例如下:
(1)a&&b: 當(dāng)&&兩邊都為“真”時(shí),表達(dá)式a&&b的值才是真。
值得注意的是:在數(shù)學(xué)中,關(guān)系式0
(2)a||b: 當(dāng)||兩邊有一個(gè)為“真”時(shí),表達(dá)式a||b的值就是真。
(3)!a: 表示取反,如果a為真,則!A為假,反之亦然。例如!-5的值就為0.
在C語言中,由&&或||組成的邏輯表達(dá)式,在某些特定情況下會(huì)產(chǎn)生“短路“現(xiàn)象。
(1)x && y && z ,只有當(dāng)x為真(非0)時(shí),才需要判別y的值;只有x和y都為真時(shí),才需要去判別z的值;只要x為假就不必判別y和z,整個(gè)表達(dá)式的值為0。口訣:“一假必假”。
例:(!5==1)&&(++i==0) (!5==1)表達(dá)式的值為0,所以計(jì)算機(jī)運(yùn)行中就跳過(++i==0)此表達(dá)式,(!5==1)&&(++i==0)表達(dá)式的值為0.
(2)x||y||z ,只要x的值為真(非零),就不必判別y和z的值 ,整個(gè)表達(dá)式的值為1,只有x的值為假,才需要判別y的值,只有x和y的值同時(shí)為假才需要判別z的值,口訣:“一真必真”。
位運(yùn)算
一、 位運(yùn)算符
在計(jì)算機(jī)中,數(shù)據(jù)都是以二進(jìn)制數(shù)形式存放的,位運(yùn)算就是指對(duì)存儲(chǔ)單元中二進(jìn)制位的運(yùn)算。C語言提供6種位運(yùn)算符。
二、位運(yùn)算
位運(yùn)算符 & |~<< >> ∧ 按優(yōu)先級(jí)從高到低排列的順序是:
位運(yùn)算符中求反運(yùn)算“~“優(yōu)先級(jí)最高,而左移和右移相同,居于第二,接下來的順序是按位與 “&“、按位異或 “∧“和按位或 “|“。順序?yàn)閪 << >> & ∧ | 。
例1:左移運(yùn)算符“<<”是雙目運(yùn)算符。其功能把“<< ”左邊的運(yùn)算數(shù)的各二進(jìn)位全部左移若干位,由“<<”右邊的數(shù)指定移動(dòng)的位數(shù),高位丟棄,低位補(bǔ)0。="" <="" span="">
例如: a<<4 指把a(bǔ)的各二進(jìn)位向左移動(dòng)4位。如a=00000011(十進(jìn)制3),左移4位后為00(十進(jìn)制48)。
例2:右移運(yùn)算符“>>”是雙目運(yùn)算符。其功能是把“>> ”左邊的運(yùn)算數(shù)的各二進(jìn)位全部右移若干位,“>>”右邊的數(shù)指定移動(dòng)的位數(shù)。
例如: 設(shè) a=15, a>>2 表示把右移為十進(jìn)制3)。
應(yīng)該說明的是,對(duì)于有符號(hào)數(shù),在右移時(shí),符號(hào)位將隨同移動(dòng)。當(dāng)為正數(shù)時(shí),最高位補(bǔ)0,而為負(fù)數(shù)時(shí),符號(hào)位為1,最高位是補(bǔ)0或是補(bǔ)1 取決于編譯系統(tǒng)的規(guī)定。
例3:設(shè)二進(jìn)制數(shù)a是00 ,若通過異或運(yùn)算a∧b 使a的高4位取反,低4位不變,則二進(jìn)制數(shù)b是。
解析:異或運(yùn)算常用來使特定位翻轉(zhuǎn),只要使需翻轉(zhuǎn)的位與1進(jìn)行異或操作就可以了,因?yàn)樵瓟?shù)中值為1的位與1進(jìn)行異或運(yùn)算得0 ,原數(shù)中值為0的位與1進(jìn)行異或運(yùn)算結(jié)果得1。而與0進(jìn)行異或的位將保持原值。異或運(yùn)算還可用來交換兩個(gè)值,不用臨時(shí)變量。
如 int a=3 , b=4;,想將a與b的值互換,可用如下語句實(shí)現(xiàn): a=a∧b;
b=b∧a;
a=a∧b;
所以本題的答案為: 。
C語言作為一門非常適合編程入門的語言,打好基礎(chǔ)的重要性不言而喻。
C語言基礎(chǔ)知識(shí)總結(jié)
主要內(nèi)容:1.C數(shù)據(jù)類型
2.簡單的算術(shù)運(yùn)算和表達(dá)式
3.鍵盤輸入和屏幕輸出
4.選擇控制結(jié)構(gòu)
總結(jié)風(fēng)格:分條羅列,主要是知識(shí)點(diǎn),有例題不多
5.循環(huán)控制結(jié)構(gòu)
一、C數(shù)據(jù)類型
1.C語言處理兩種數(shù)據(jù):常量和變量
2.常量:整形常量、實(shí)型常量、字符常量、字符串常量、枚舉常量
3.整形常量:正整數(shù)、負(fù)整數(shù)、零 eg: 10,-30,0
4.實(shí)型常量:實(shí)數(shù)、小數(shù)、浮點(diǎn)數(shù) eg: 3.14,-0.56,18.0
5.字符常量:字符型常量、用單引號(hào)括起來的任意字符 eg: 'x' 'X' '?' ',' '9'
6.字符串常量:用雙引號(hào)括起來的一個(gè)或多個(gè)字符 eg: "x" "Hello" "Y78"
7.在C程序中,整型常量可以用十進(jìn)制、八進(jìn)制、十六進(jìn)制形式表示,但編譯器都會(huì)自動(dòng)將
其轉(zhuǎn)換成二進(jìn)制存儲(chǔ)
8.整型常量的類型:長整型、短整型、有符號(hào)、無符號(hào)。
9.不同進(jìn)制的整型常量的表示形式:
1)十進(jìn)制:0~9數(shù)字組合,可帶正負(fù)號(hào) eg: 256,-128,0,+7
2)八進(jìn)制:0開頭,后面跟0~7數(shù)字組合 eg: 021,-017
3)十六進(jìn)制:0x(0X)開頭,后跟0~9,a~f(A~F)數(shù)字組合 eg:0x12,-0x1F
10.不同類型的整形常量的表示形式:
1) 有符號(hào)整型常量:默認(rèn)int型定義為有符號(hào)整數(shù),無需signed eg:10,-30,0
2) 無符號(hào)整形常量:常量值后跟u或U,只能表示>=0的數(shù) eg:30u,256U
3) 長整型常量:常量值后跟l或L eg:-256l,1024L
4) 無符號(hào)長整型常量:常量值后跟LU、Lu 、lU 、lu eg:30lu
11.C程序中,實(shí)型常量兩種表示形式:小數(shù)、指數(shù)
12.不同形式的實(shí)型常量的表示形式:
1) 十進(jìn)制表示形式:數(shù)字和小數(shù)點(diǎn)組成,必須要有小數(shù)點(diǎn),整數(shù)部分可省略 eg:0.123, -12.35, .98
2) 指數(shù)形式:e或E代表以10為底的指數(shù), e左邊是數(shù)值部分(有效數(shù)字,可以是整
數(shù)、小數(shù),不能省略),e右邊是指數(shù)部分(必須是整數(shù)形式) eg:3.45e-6
13.實(shí)型常量有單精度和雙精度之分,無有符號(hào)和無符號(hào)之分
14.不同類型的實(shí)型常量表示形式:
1)單精度實(shí)型常量:常量值后跟F或f eg:1.25F,1.25e-2f
2)雙精度實(shí)型常量(double):實(shí)型常量默認(rèn)按雙精度處理 eg:0.123,-12.35, .98
3)長雙精度實(shí)型常量(long double):常量值后跟L或l eg:1.25L
15.變量:在程序執(zhí)行過程中可以改變的量
16.變量在必須先定義后使用,定義時(shí)需要聲明變量的類型和變量名,一般形式:類型關(guān)鍵
字 變量名;
17.關(guān)鍵字是C語言預(yù)先規(guī)定具有特殊意義的單詞,類型關(guān)鍵字用于聲明變量的類型
18.標(biāo)準(zhǔn)C語言編寫的程序都是以main()作為開頭,指定了C程序執(zhí)行的起點(diǎn),在C程序中
只能出現(xiàn)一次,稱為主函數(shù)
19.C程序總是從main函數(shù)開始執(zhí)行,與他在程序中的位置無關(guān),main函數(shù)主體部分稱為語
句,用{}括起來,一般C語句以;結(jié)束
20.變量的類型決定了編譯器為其分配內(nèi)存單元的字節(jié)數(shù)、數(shù)據(jù)在內(nèi)存單元中的存放形式、
該類型變量合法的取值范圍以及該類型變量可參與的運(yùn)算種類
21.變量名是用戶定義的標(biāo)識(shí)符,用于標(biāo)識(shí)內(nèi)存中具體的存儲(chǔ)單元,存放的數(shù)據(jù)稱為變量的
值
22.新數(shù)據(jù)存放于存儲(chǔ)單元時(shí),舊數(shù)據(jù)將會(huì)被修改,反應(yīng)變量的值是可以改變的
23.變量名的命名規(guī)則:
1)標(biāo)識(shí)符只能由英文字母、數(shù)字、下劃線組成
2)標(biāo)識(shí)符必須以字母或下劃線開頭
3)不允許使用C關(guān)鍵字為標(biāo)識(shí)符命名
4)標(biāo)識(shí)符可以包含任意多個(gè)字符,但一般會(huì)有最大長度限制,預(yù)編譯器有關(guān),一般不會(huì)超過,最好不超過8個(gè)字符
注意:標(biāo)識(shí)符區(qū)分大小寫
eg:x y3 _imax ELSE X A_to_B (合法)
eg:7x int #No bad one re-input(不合法)
24.標(biāo)準(zhǔn)C規(guī)定所有變量必須在第一條可執(zhí)行語句之前定義
25.在同一條語句中可以同時(shí)定義多個(gè)相同類型變量,多個(gè)變量之間用逗號(hào)分隔,沒有順序要求
26.在使用標(biāo)準(zhǔn)輸入/輸出函數(shù)時(shí),必須在程序開頭加上編譯預(yù)處理命令
27.中stdio為頭文件,std是standard,i為input,o為output,h為head
28.編譯預(yù)處理命令#include的作用:將在輸入/輸出函數(shù)的頭文件stdio.h包含到用戶源文件中
29.%d按十進(jìn)制整數(shù)個(gè)格式輸出,%f按十進(jìn)制小數(shù)格式輸出,一般輸出6位小數(shù),%c輸出一個(gè)字符,\n換行,雙引號(hào)內(nèi)字符原樣輸出
30.不同類型的數(shù)據(jù)在內(nèi)存中占用不同大小的存儲(chǔ)單元,他們所能表示的數(shù)據(jù)的取值范圍各不相同,不同類型的數(shù)據(jù)表示形式及其可以參與的運(yùn)算種類也不同
31.定義整型變量時(shí),只要不指定為無符號(hào)型,其隱含類型為有符號(hào)型,signed通常省略不寫
32.C程序中每個(gè)變量的值都是按字節(jié)編址,都被存儲(chǔ)在內(nèi)存中特定的存儲(chǔ)單元中,這個(gè)存儲(chǔ)空間實(shí)際是一個(gè)線性地址表,即每個(gè)字節(jié)的存儲(chǔ)空間對(duì)應(yīng)一個(gè)唯一的地址
33.1個(gè)字節(jié)等于8個(gè)二進(jìn)制位,即8個(gè)位為一個(gè)字節(jié),一個(gè)字節(jié)可以表示的整數(shù)最小為0,最大255,即8個(gè)位可以表示0-255之間的數(shù),一個(gè)二進(jìn)制位的值只能是0或1
34.同種類型在不同的平臺(tái)所占字節(jié)數(shù)不同,要計(jì)算數(shù)據(jù)類型所占內(nèi)存空間的字節(jié)數(shù)需要用sizeof()運(yùn)算符
35.sizeof是C語言關(guān)鍵字,不是函數(shù)名,sizeof(變量名)計(jì)算一個(gè)變量所占內(nèi)存的字節(jié)數(shù)
36.計(jì)算不同類型運(yùn)算符的表達(dá)式時(shí),要考慮運(yùn)算符的優(yōu)先級(jí)和結(jié)合性
37.正數(shù)的反碼、補(bǔ)碼與原碼都相同,負(fù)數(shù)的補(bǔ)碼等于反碼加1
38.在計(jì)算機(jī)內(nèi)存中負(fù)數(shù)都是用補(bǔ)碼來表示
39.對(duì)于實(shí)數(shù),無論小數(shù)海曙指數(shù)形式,在計(jì)算機(jī)內(nèi)存中都采用浮點(diǎn)形式來存儲(chǔ)
40.浮點(diǎn)數(shù)分為階碼、尾數(shù)兩部分,實(shí)數(shù)N=S*pow(r,j),S為尾數(shù)(無論正負(fù),規(guī)定用存小數(shù)),j為階碼(無論正負(fù),必須是整數(shù)),r是基數(shù) eg:10.0111=0.100111*pow(2,10)
41.階碼所占位數(shù)決定實(shí)數(shù)的取值范圍,尾數(shù)所占位數(shù)決定實(shí)數(shù)的精度,尾數(shù)的符號(hào)決定實(shí)數(shù)的正負(fù),階碼和尾數(shù)的字節(jié)大小與編譯器有關(guān)
42.float型變量能接收實(shí)型常量的7位有效數(shù)字,double型變量能接收16位
43.運(yùn)算符的優(yōu)先級(jí):單目運(yùn)算<算術(shù)運(yùn)算<關(guān)系運(yùn)算<邏輯運(yùn)算<條件運(yùn)算<賦值運(yùn)算<逗號(hào)運(yùn)算
44.素?cái)?shù):又稱質(zhì)數(shù),指在大于1的自然數(shù)中,除1和本身不能被其他自然數(shù)整除的數(shù)
45.合數(shù):指在自然數(shù)中除1和本身外還能被其他自然數(shù)整除的數(shù)
46.因子:所有能整除這個(gè)數(shù)的數(shù),不包括自身,但包括1
47.閏年:能被4整除但不能被100整除,或能被400整除
二、 簡單的算術(shù)運(yùn)算和表達(dá)式
1.條件運(yùn)算符是C語言提供的唯一一個(gè)三元運(yùn)算符,C語言中沒有冪運(yùn)算符
2.只有計(jì)算相反數(shù)是一元運(yùn)算符,其余運(yùn)算符都是二元運(yùn)算符
3.一元運(yùn)算符也叫單目運(yùn)算符,二元運(yùn)算符也叫雙目運(yùn)算符,三元運(yùn)算符也叫三目運(yùn)算符
4.整數(shù)除法的結(jié)果是整數(shù),浮點(diǎn)數(shù)除法的結(jié)果是浮點(diǎn)數(shù)
5.求余運(yùn)算限定參與運(yùn)算的兩個(gè)操作數(shù)必須為整型,余數(shù)的符號(hào)與被除數(shù)的符號(hào)相同,不能對(duì)兩個(gè)實(shí)型數(shù)進(jìn)行求余運(yùn)算
6.所有的算術(shù)運(yùn)算符中只有一元的去相反數(shù)運(yùn)算符為右結(jié)合,其余的結(jié)合性都為左結(jié)合
7.同一優(yōu)先級(jí)的運(yùn)算符進(jìn)行混合運(yùn)算時(shí),從左向右依次進(jìn)行
8.運(yùn)算符的優(yōu)先級(jí):單目運(yùn)算>算術(shù)運(yùn)算>關(guān)系運(yùn)算>邏輯運(yùn)算>條件運(yùn)算>賦值運(yùn)算>逗號(hào)運(yùn)算
9.計(jì)算并輸出一個(gè)三位整數(shù)的個(gè)位、十位、百位數(shù)字之和
#include
void main()
{
int x=321;
int a,b,c,sum;
a=x%10;//a=1
b=(x/10)%10;//b=2
c=x/100;//c=3
sum=a+b+c;
printf("a=%d,b=%d,c=%d\nsum=%d\n",a,b,c,sum);
}
10.涉及算術(shù)運(yùn)算的復(fù)合賦值運(yùn)算符有5個(gè):+=,-=,*=,/=,%=
11.增1運(yùn)算符也稱自增運(yùn)算符,減1運(yùn)算符也稱自減運(yùn)算符,都是一元運(yùn)算符,只有一個(gè)操作數(shù)必須是變量不能是常量或表達(dá)式
12.自增自減運(yùn)算符作為前綴時(shí),先執(zhí)行加1或減1然后使用;自增自減運(yùn)算符作為后綴時(shí),先使用再執(zhí)行加1或減1;
13.考慮優(yōu)先級(jí)與結(jié)合性的實(shí)例
m=-n++《=》m=-(n++)《=》m=-n,n=n+1;
//正面:-和++都是一元運(yùn)算符,優(yōu)先級(jí)相同,此時(shí)要考慮結(jié)合性,結(jié)合性都是右結(jié)合的,所以先算++后算-
//反面:如果等價(jià)m=(-n)++就不合法了,因?yàn)楸磉_(dá)式不能進(jìn)行自增操作
14.scanf函數(shù)和printf函數(shù)都是C的標(biāo)準(zhǔn)輸入/輸出函數(shù),&為取地址運(yùn)算符
15.宏常量與宏替換:
1) 在程序中直接使用的常數(shù)稱為幻數(shù),將幻數(shù)定義為宏常量或const常量是為了提高程序的可讀性和可維護(hù)性
2) 宏常量也稱符號(hào)常量,沒有數(shù)據(jù)類型,編譯器不對(duì)其進(jìn)行類型檢查,只進(jìn)行字符串替換
3) 宏定義一般形式:#define 標(biāo)識(shí)符 字符串。標(biāo)識(shí)符被稱為宏名,宏名與字符串之間可有多個(gè)空白符,不加等號(hào),結(jié)尾不加分號(hào)
4) 宏常量是由宏定義編譯預(yù)處理命令來定義,宏名替換成字符串的過程稱為宏替換,宏替換不做任何語法檢查
5) 當(dāng)宏定義是一個(gè)表達(dá)式時(shí),調(diào)用時(shí),是一個(gè)數(shù)就可以直接帶入,而是表達(dá)式也要看成是一個(gè)數(shù)代進(jìn)宏定義表達(dá)式中,
而看成一個(gè)數(shù)這就要求把調(diào)用的數(shù)加上圓括號(hào),為了減少不必要的錯(cuò)誤,最好都加上圓括號(hào)
6) 宏替換的過程是將宏名原樣替換成字符串,而不是直接計(jì)算出值,所以要用調(diào)用后的結(jié)果參與其他運(yùn)算就需要把調(diào)用的結(jié)果加上圓括號(hào)
7) 例題:
#include
#define N 2 //N=2
#define M N+1 //M=2+1
#define NUM 2*M+1 //NUM=2*2+1+1=6
void main()
{
int i;
for(i=1;i<=NUM;i++);
printf("%d\n",i); //執(zhí)行完空循環(huán),i=7
i--; // i=6
printf("%d\n",i);
}
8) 例題:
#include
#define f(x) x*x
void main()
{
int b;
b=f(4+4); //b=4+4*4+4=24,解釋見5)
printf("b=%d\n",b);
}
9) 例題:
#include
#define f(x) x*x
void main()
{
int b;
b=f(4+4)/(2+2); //b=4+4*4+4/(2+2)=21解釋見6)
printf("b=%d\n",b);
}
10) 例題:
#include
#define f(x) x*x
void main()
{
int b;
b=f((4+4)); //b=(4+4)*(4+4)=64
printf("b=%d\n",b);
}
11) 例題:
#include
#define f(x) (x*x)
void main()
{
int b;
b=f((4+4))/(2+2); //b=((4+4)*(4+4))/(2+2)=16
printf("b=%d\n",b);
}
16.const常量
1) const常量只能在定義時(shí)賦初值,因?yàn)榫幾g器將其放在只讀存儲(chǔ)區(qū),不允許在程序中修改
2) const常量的定義一般形式:const 類型名 標(biāo)識(shí)符=字符串;//將標(biāo)識(shí)符聲明為具有該數(shù)據(jù)類型的const常量
3) const是一種類型修飾符,const常量具有數(shù)據(jù)類型,編譯器要對(duì)其進(jìn)行類型檢查
17.表達(dá)式中的自動(dòng)類型轉(zhuǎn)換:
1) 表達(dá)式中,操作數(shù)類型相同,運(yùn)算的結(jié)果類型與操作數(shù)類型相同
2) 表達(dá)式中,操作數(shù)類型不相同,C編譯器自動(dòng)將所有操作數(shù)進(jìn)行類型提升,轉(zhuǎn)換成同一類型,所占字節(jié)最大,再計(jì)算
18.賦值中的自動(dòng)類型轉(zhuǎn)換:
1) 賦值運(yùn)算符左側(cè)變量與右側(cè)表達(dá)式類型不同時(shí),發(fā)生自動(dòng)類型轉(zhuǎn)換:右側(cè)表達(dá)式的值轉(zhuǎn)換成左側(cè)變量的類型
19.強(qiáng)制類型轉(zhuǎn)換:
1) 強(qiáng)制類型轉(zhuǎn)換運(yùn)算符是一元運(yùn)算符
2) 強(qiáng)制類型轉(zhuǎn)換也稱強(qiáng)轉(zhuǎn),是將表達(dá)式的值轉(zhuǎn)換為任意類型,并不改變變量本身的數(shù)據(jù)類型
3) 強(qiáng)轉(zhuǎn)一般形式:(類型)表達(dá)式
4) 演示強(qiáng)制類型轉(zhuǎn)換運(yùn)算符的使用
#include
void main()
{
int m=5;
printf("m/2=%d\n",m/2);//m=2
printf("(float)(m/2)=%f\n",(float)(m/2));//m=2.000000
printf("(float)m/2=%f\n",(float)m/2);//m=2.500000
printf("m=%d\n",m);//m=5,只是將m強(qiáng)轉(zhuǎn)為實(shí)型數(shù)據(jù),并不改變m的數(shù)據(jù)類型 }
20.常用的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù):
1) 使用C標(biāo)準(zhǔn)數(shù)學(xué)函數(shù),要在程序開頭加上編譯預(yù)處理命令:#include
2) 例:已知三角形三邊長為a,b,c,計(jì)算三角形的面積
#include
#include
void main()
{
float a,b,c,s,area;
printf("Input a,b,c:");
scanf("%f,%f,%f",&a,&b,&c);
s=(a+b+c)/2;
area=(float)sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%f\n",area);
}
21.賦值運(yùn)算符的左側(cè)不能出現(xiàn)表達(dá)式,變量與變量之間可以賦值
例1:若有定義:int a,b,c;下列表達(dá)式中哪一個(gè)是合法的C語言賦值表達(dá)式(C、D)
A)a=7+b=c=7 B)a=b++=c=7 C)a=(b=7,c=12) D)a=3,b=a+5,c=b+2
//A.7+b表達(dá)式不能做左值 B.b++表達(dá)式不能做左值 C.逗號(hào)表達(dá)式a=12 D.依次賦值
例2:下面不正確的賦值語句是(B)
A)a=++a B)a=b++=10 C)a+=b D)a=1>'a'
//D.算術(shù)運(yùn)算符優(yōu)先級(jí)高于賦值運(yùn)算符,先算1>'a'再將其結(jié)果賦給a
例3:若有下列定義:int a=3,b=2,c=1;以下選項(xiàng)錯(cuò)誤的賦值表達(dá)式是(A)
A)a=(b=4)=3 B)a=b=c+1 C)a=(b=4)+c D)a=1+(b=c=4)
//A.先計(jì)算圓括號(hào)里的值等于4,然后按照賦值表達(dá)式的順序從右向左計(jì)算,將3賦值給4這是不對(duì)的,
即賦值號(hào)左側(cè)只能是變量,不能出現(xiàn)表達(dá)式b=4
三、 鍵盤輸入和屏幕輸出
1.字符常量:
把字符放在一對(duì)單引號(hào)內(nèi),適用于多數(shù)可打印字符
2.轉(zhuǎn)義字符:
以反斜線(\)開頭,也是放在一對(duì)單引號(hào)內(nèi),適用于控制字符(如回車符,換行符)
3.常用的轉(zhuǎn)義字符:
1) '\n' — 換行 8) '\a' — 響鈴報(bào)警提示音
2) '\r' — 回車(不換行) 9) '\"' — 一個(gè)雙引號(hào)
3) '\0' — 空字符 10) '\'' — 一個(gè)單引號(hào)
4) '\t' — 水平制表 11) '\\' — 一個(gè)反斜線
5) '\v' — 垂直制表 12) '\?' — 問號(hào)
6) '\b' — 退格 13) '\ddd' —1到3位八進(jìn)制ASCII碼值所代表的字符
7) '\f' — 走紙換頁 14) '\xhh' —1到2位十六進(jìn)制ASCII碼值所代表的字符
4.\n,是將光標(biāo)移到下一行起始位置,\r是將光標(biāo)移到當(dāng)前行的起始位置
5.\t,是水平制表符,相當(dāng)于按下Tab鍵,每次按下Tab鍵并不是從當(dāng)前光標(biāo)位置向后移動(dòng)一個(gè)Tab寬度,而是移到下一個(gè)制表位
實(shí)際移動(dòng)的寬度視當(dāng)前光標(biāo)位置距相鄰的下一個(gè)制表位的距離而定
6.制表位,屏幕上的一行被分為若干個(gè)域,相鄰域之間的交接點(diǎn)稱為制表位,每個(gè)域的寬度就是一個(gè)Tab寬度,多數(shù)習(xí)慣上為4
7.當(dāng)轉(zhuǎn)義序列出現(xiàn)在字符串中時(shí),是按單個(gè)字符計(jì)數(shù)的
8.一個(gè)整形數(shù)在內(nèi)存中是以二進(jìn)制形式存儲(chǔ)的,而一個(gè)字符在內(nèi)存中也是以其對(duì)應(yīng)的ASCII碼的二進(jìn)制形式存儲(chǔ)的,
但char型數(shù)據(jù)在內(nèi)存中只占一個(gè)字節(jié),而int型數(shù)據(jù)在16位系統(tǒng)中占2個(gè)字節(jié),32位系統(tǒng)占4個(gè)字節(jié)
9.在ASCII碼取值范圍內(nèi),char型數(shù)據(jù)可以和int型數(shù)據(jù)進(jìn)行混合運(yùn)算,char型數(shù)據(jù)也能以int型輸出,直接輸出其對(duì)應(yīng)的ASCII碼的十進(jìn)制值
10.字符的輸入/輸出:
1) getchar()和putchar()是C標(biāo)準(zhǔn)函數(shù)庫中專門用于字符輸入/輸出的函數(shù),功能是只能輸入/輸出一個(gè)字符
2) 例:從鍵盤輸入一個(gè)大寫英文字母,將其轉(zhuǎn)換為小寫字母顯示在屏幕上
#include
void main()
{
char ch;
ch=getchar();//鍵盤輸入一個(gè)字符,再按回車表示輸入結(jié)束,字符存入變量ch,注意:getchar()沒有參數(shù),直接返回讀入的字符
ch=ch+32;
putchar(ch);//第二次按回車,將顯示轉(zhuǎn)換后的結(jié)果
putchar('\n');//注意:putchar()內(nèi)一定要有參數(shù),參數(shù)就是待輸出的字符,可以是可打印字符,也可是轉(zhuǎn)義字符
}
11.數(shù)據(jù)的格式化屏幕輸出:
1) 函數(shù)printf()的一般格式:printf(格式控制字符串);或者printf(格式控制字符串,輸出值
參數(shù)表);
2) 格式控制字符串包括:格式轉(zhuǎn)換說明符,需要原樣輸出的普通字符
3) 函數(shù)printf()的格式轉(zhuǎn)換說明符:
%d — 輸出帶符號(hào)十進(jìn)制整數(shù),整數(shù)符號(hào)省略
%u — 輸出無符號(hào)十進(jìn)制整數(shù)
%o — 輸出無符號(hào)八進(jìn)制整數(shù),不輸出前導(dǎo)符0
%x — 輸出無符號(hào)十六進(jìn)制整數(shù)(小寫),不輸出前導(dǎo)符0x
%X — 輸出無符號(hào)十六進(jìn)制整數(shù)(大寫),不輸出前導(dǎo)符0x
%c — 輸出一個(gè)字符
%s — 輸出字符串
%f — 以十進(jìn)制小數(shù)形式輸出實(shí)數(shù),包含單,雙精度,隱含6位小數(shù),但并非全是有效數(shù)字,單精度有效7位,雙精度16位
%e — 以指數(shù)形式輸出實(shí)數(shù)(小寫e表示指數(shù)部分),小數(shù)點(diǎn)前有且僅有一位非0數(shù)字
%E — 以指數(shù)形式輸出實(shí)數(shù)(大寫E表示指數(shù)部分)
%g — 自動(dòng)選取f或e格式中寬度較小的一種使用,不輸出無意義的0
%% — 輸出%
4) 輸出值參數(shù)表:需要輸出的數(shù)據(jù)項(xiàng)的列表,可以是變量或表達(dá)式,逗號(hào)隔開,類型與格式轉(zhuǎn)換說明符相匹配
5) 每個(gè)格式轉(zhuǎn)換說明符與輸出值參數(shù)表中的輸出值參數(shù)一一對(duì)應(yīng),沒有輸出值參數(shù),格式控制字符串就不需要格式轉(zhuǎn)換說明符
6) 例:從鍵盤輸入一個(gè)大寫英文字母,將其轉(zhuǎn)換為小寫字母和其十進(jìn)制ASCII碼值顯示在屏幕上
#include
void main()
{
char ch;
printf("Please enter a key:");
ch=getchar();
ch=ch+32;
printf("%c,%d\n",ch,ch);//printf("%c",ch)<<=>>putchar(ch),printf("\n")<<=>>putchar('\n') }
7) 函數(shù)printf()中的格式修飾符:在%和格式符中間插入格式修飾符,用于輸出格式的微調(diào),如:指定輸出域?qū)挕⒕?、左?duì)齊等
英文字母l — 修飾格式符d,o,x,u時(shí),用于輸出long型數(shù)據(jù)
英文字母L — 修飾格式符f,e,g時(shí),用于輸出long double型數(shù)據(jù)
英文字母h — 修飾格式符d,o,x時(shí),用于輸出short型數(shù)據(jù)
輸出域?qū)抦 — m為整數(shù),輸出時(shí)占m列,若m>0,當(dāng)數(shù)據(jù)寬度小于m時(shí),域內(nèi)右靠齊,左補(bǔ)空格,當(dāng)數(shù)據(jù)寬度大于m時(shí),修飾符失效,按實(shí)際寬度輸出,若m有前導(dǎo)符0,左邊多余位補(bǔ)0;若m<0,輸出數(shù)據(jù)在域內(nèi)左靠齊
顯示精度 .n — n為大于等于0的整數(shù),精度修飾符位于最小域?qū)捫揎椃?,由圓點(diǎn)和整數(shù)構(gòu)成,對(duì)于浮點(diǎn)數(shù),用于指定輸出的浮點(diǎn)數(shù)小數(shù)位數(shù);對(duì)于字符串,用于指定從字符串左側(cè)開始截取的子串字符個(gè)數(shù)
8) 使用const常量定義pi,編程從鍵盤輸入圓的周長和面積,使其輸出數(shù)據(jù)保留兩位小數(shù)
#include
void main()
{
const double pi=3.14159;
double r,circum,area;
printf("Please enter r:");
scanf("%lf",&r);
circum=2*pi*r;
area=pi*r*r;
printf("輸出沒有寬度和精度的值:");
printf("circum=%f,area=%f\n",circum,area);
printf("輸出沒有寬度和精度的值:");
printf("circum=%7.2f,area=%7.2f\n",circum,area);//域?qū)挒?,占7個(gè)字符寬度,小數(shù)點(diǎn)也算一個(gè)字符,精度為2,小數(shù)點(diǎn)后保留2位
}
12.數(shù)據(jù)的格式化鍵盤輸入:
1) 函數(shù)scanf()的一般格式:scanf(格式控制字符串,參數(shù)地址表);
2) 格式控制字符串:包括格式轉(zhuǎn)換說明符,分隔符
3) 格式轉(zhuǎn)換說明符以%開始,以格式字符結(jié)束,用于指定各參數(shù)的輸入格式
4) 函數(shù)scanf()的格式轉(zhuǎn)換說明符:
%d — 輸入十進(jìn)制整數(shù)
%o — 輸入八進(jìn)制整數(shù)
%x — 輸入十六進(jìn)制整數(shù)
%c — 輸入一個(gè)字符,空白字符(包括空格、回車、制表符)也作為有效字符輸入 %s — 輸入字符串,遇到第一個(gè)空白字符(包括空格、回車、制表符)時(shí)結(jié)束 %f或%e — 輸入實(shí)數(shù),以小數(shù)或指數(shù)形式輸入均可
%% — 輸入一個(gè)%
5) 參數(shù)地址表:由若干變量的地址組成的列表,用逗號(hào)分隔
6) 函數(shù)scanf()中的格式修飾符:在%和格式符中間插入格式修飾符
英文字母l — 加在格式符d,o,x,u之前,用于輸入long型數(shù)據(jù);加在f,e之前,用于輸入double型數(shù)據(jù)
英文字母L — 加在格式符f,e之前,用于輸入long double型數(shù)據(jù)
英文字母h — 加在格式符d,o,x時(shí),用于輸入short型數(shù)據(jù)
輸出域?qū)抦 — m為正整數(shù),指定輸入數(shù)據(jù)的寬度,系統(tǒng)自動(dòng)按此寬度截取所需數(shù)據(jù)
顯示精度 .n — n為0或正整數(shù),scanf()沒有精度格式修飾符,輸入時(shí)不能規(guī)定精度 忽略輸入修飾符* — 表示對(duì)應(yīng)的輸入項(xiàng)在讀入后不賦給相應(yīng)的變量
7) 函數(shù)scanf()輸入數(shù)值型數(shù)據(jù)時(shí),被認(rèn)為輸入結(jié)束的幾種情況:遇空格符、回車符、制表符;達(dá)到輸出域?qū)?遇非法字符輸入
8) 如果函數(shù)scanf()的格式控制字符串中存在除格式轉(zhuǎn)換說明符以外的其他字符,必須將這些字符原樣輸入
#include
void main()
{
int a,b;
scanf("%d %d",&a,&b); //以空格作為分隔符,等價(jià)于scanf("%d%d",&a,&b),等價(jià)于scanf("%d %d",&a,&b),
printf("a=%d,b=%d\n",a,b);//實(shí)際輸入時(shí),空格、回車符、制表符都可作為分隔符,即輸入:12空格34 12回車34 12制表符34均可,
}
#include
void main()
{
int a,b;
scanf("%d,%d",&a,&b);//輸入時(shí)必須以逗號(hào)作為分隔符,即只能輸入:12,34
printf("a=%d,b=%d\n",a,b);
}
#include
void main()
{
int a,b;
scanf("a=%d,b=%d",&a,&b);//輸入時(shí)必須將"a="和"b="原樣輸入,即只能輸入:a=12,b=34 printf("a=%d,b=%d\n",a,b);
}
#include
void main()
{
int a,b;
scanf("%2d%2d",&a,&b);//輸入時(shí)將前兩位數(shù)讀入存到a中,接著兩位存到b中,然后結(jié)束讀取,即輸入:1234,或123456結(jié)果一樣
printf("a=%d,b=%d\n",a,b);
}
#include
void main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("a=\"%d\",b=\"%d\"\n",a,b);//輸出a="12",b="34"
}
#include
void main()
{
int a,b;
scanf("%d%*c%d",&a,&b);//任意字符都可作為分隔符,即輸入:12,34或12?34或12+34結(jié)果都一樣
printf("a=%d,b=%d\n",a,b);
}
#include
void main()
{
int a,b;
scanf("%2d%*2d%d",&a,&b);//忽略兩位,輸入123456
printf("a=%d,b=%d\n",a,b);//輸出a=12,b=56
}
對(duì)于程序
#include
void main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("a=%d,b=%d\n",a,b);
}
如果輸入12 34a回車,則結(jié)果a=12,b=3,程序在遇到非法字符a時(shí),會(huì)導(dǎo)致程序輸入終止,此時(shí)a會(huì)讀入12,b會(huì)讀入3
如果輸入123a回車,則結(jié)果a=123,b=-858993460,程序在遇到非法字符a時(shí),會(huì)導(dǎo)致程序輸入終止,此時(shí)a會(huì)讀入123,而b未能讀入指定數(shù)據(jù)項(xiàng)數(shù)
如果在scanf()函數(shù)中忘記在變量前加取地址運(yùn)算符&,會(huì)導(dǎo)致非法內(nèi)存訪問
13.%c格式符使用幾種情況:
1) 用%c格式讀入字符時(shí),空格字符和轉(zhuǎn)義字符(包括回車)都會(huì)被當(dāng)做有效字符讀入 例:鍵盤輸入一個(gè)整數(shù)加法算式:操作數(shù)1+操作數(shù)2,輸出:操作數(shù)1+操作數(shù)2=計(jì)算結(jié)果
#include
void main()
{
int data1,data2;
char op; //輸入:12空格+空格3 回車//輸出:12 -858993460=-858993448
printf("Enter data1+data2\n");//輸入:12空格3 回車//輸出:12 3=15
scanf("%d%c%d",&data1,&op,&data2);//輸入:12+3 回車//輸出:12+3=15 printf("%d%c%d=%d\n",data1,op,data2,data1+data2);
}
2) 先輸入一個(gè)數(shù)據(jù)后再輸入字符型變量時(shí),輸入一個(gè)數(shù)據(jù)后,輸入的回車符將被當(dāng)做有效字符讀給字符型變量
例:編程從鍵盤先后輸入int型、char型和float型數(shù)據(jù),要求每輸入一個(gè)數(shù)據(jù)就顯示這個(gè)數(shù)據(jù)的類型和數(shù)據(jù)值
void main()
{
int a;
char b;
float c;
printf("Please input an integer:");
scanf("%d",&a);
printf("integer:%d\n",a);
//在輸入一個(gè)整型數(shù)據(jù)后,輸入的回車符被當(dāng)做有效字符讀給了字符型變量b了
printf("Please input a character:");
scanf("%c",&b);
printf("chracter:%c\n",b);
printf("Please input a float number:");
scanf("%f",&c);
printf("float:%f\n",c);
}
14.%c格式符存在問題的解決方法
1) 用函數(shù)getchar()將數(shù)據(jù)輸入時(shí)存入緩沖區(qū)中的回車符讀入,以避免被后面的字符型變量作為有效字符讀入
#include
void main()
{
int a;
char b;
float c;
printf("Please input an integer:");
scanf("%d",&a);
printf("integer:%d\n",a);
getchar();//將存于緩沖區(qū)中的回車符讀入,避免在后面作為有效字符讀入
//函數(shù)getchar()的返回值是一個(gè)回車符,已經(jīng)避免了錯(cuò)誤,不需要再將其賦給字符型變量使用
printf("Please input a character:");
scanf("%c",&b);
printf("chracter:%c\n",b);
printf("Please input a float number:");
scanf("%f",&c);
printf("float:%f\n",c);
}
2) 在%c前面加一個(gè)空格,將前面數(shù)據(jù)輸入時(shí)存于緩沖區(qū)的回車符讀入,避免被后面的字符型變量作為有效字符讀入
void main()
{
int a;
char b;
float c;
printf("Please input an integer:");
scanf("%d",&a);
printf("integer:%d\n",a);
printf("Please input a character:");
scanf(" %c",&b);//在%c前面加空格,將存于緩沖區(qū)中的回車符讀入
printf("chracter:%c\n",b);
printf("Please input a float number:");
scanf("%f",&c);
printf("float:%f\n",c);
}
//解釋:在%c前加空格為什么能將存于緩沖區(qū)中的回車符讀入
因?yàn)槿绻瘮?shù)scanf()的格式控制字符串中存在除格式轉(zhuǎn)換說明符以外的其他字符,必須將這些
字符原樣輸入,所以在%c前加空格,就必須在輸入字符型數(shù)據(jù)前先原樣輸入空格,而空格,回車符,制表符在
函數(shù)scanf()輸入數(shù)值型數(shù)據(jù)時(shí)都代表輸入結(jié)束,由實(shí)踐可知,空格符、回車符、制表符在輸入時(shí)等效
所以,緩沖區(qū)中的回車將代替需要原樣輸入的空格,因此,實(shí)際上,在%c前增加空格或者Tab鍵都可以完成,
并且與增加的`數(shù)量無關(guān),且可以混合增加
3)*經(jīng)典例題:編程實(shí)現(xiàn)鍵盤任意輸入字符,統(tǒng)計(jì)字母、數(shù)字、空格、其他字符數(shù)量 首選字符串的方法:
#include
#define N 100
int main()
{
char a[N];
int i,m=0,n=0,b=0,c=0;
printf("請輸入字符:\n");
gets(a);
for(i=0;a[i]!='\0';i++)
{
if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')) m++;
else if(a[i]>=0&&a[i]<=9) n++;
else if(a[i]==' ') b++;
else c++;
}
printf("字母個(gè)數(shù):%d\n",m);
printf("數(shù)字個(gè)數(shù):%d\n",n);
printf("空格個(gè)數(shù):%d\n",b);
printf("其他字符個(gè)數(shù):%d\n",c);
return 0;
}
單個(gè)字符輸入的方法,但是要解決緩沖區(qū)的問題
#include
int main()
{
char ch;
int a,b,c,d;
a=b=c=d=0;
printf("請輸入字符:\n");
do{
ch=getchar();
getchar();//清除緩沖區(qū)的回車鍵,不然會(huì)當(dāng)做第二個(gè)字符讀入
if(ch!=' ')//用Tab鍵控制輸入結(jié)束,他在程序中只會(huì)出現(xiàn)一次并且統(tǒng)計(jì)一次, { //然后結(jié)束,所以要去掉它,可以使用if語句,也可在前面初始化為d=-1 if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) a++;
else if(ch>='0'&&ch<='9') b++;
else if(ch==' ') c++;
else d++;
}
}while(ch!=' ');
printf("字母個(gè)數(shù):%d\n",a);
printf("數(shù)字個(gè)數(shù):%d\n",b);
printf("空格個(gè)數(shù):%d\n",c);
printf("其他字符個(gè)數(shù):%d\n",d);
return 0;
}
//解釋:你可以把Tab控制結(jié)束改成其他任意字符,包括字母、數(shù)字、/;都可以,
就是不能直接使用回車控制結(jié)束,因?yàn)槟阍趯?shí)際鍵盤輸入時(shí),需要打回車才能把前面的 字符讀入,當(dāng)你輸完回車后,就已經(jīng)換行了,再回車就達(dá)不到你要的效果了,不可能把 他讀入,但是他會(huì)留在緩沖區(qū)下一次使用,所以說,理論上任意字符都可以控制結(jié)束, 但是不能直接使用回車再回車的方法,而getchar()函數(shù)一次只能讀一個(gè)字符,當(dāng)你回車 讀入字符后,回車符就會(huì)留在緩沖區(qū)下一次使用,你可以試試,你把getchar()這行語句 注釋,然后一次輸入兩個(gè)字符再回車的話,那么這時(shí)他也只能讀入第一個(gè)字符,第二個(gè) 字符和回車就會(huì)計(jì)入第二次、第三次的結(jié)果。
總結(jié):這種方式與用字符串的區(qū)別在于,字符串可以統(tǒng)計(jì)任何字符,但是這種方式不能統(tǒng)計(jì) 你用來控制結(jié)束的字符,比如說,你用/控制結(jié)束,那么就不能統(tǒng)計(jì)/的數(shù)量了,而且你要把 他去掉,因?yàn)樵谡麄€(gè)程序中/只會(huì)出現(xiàn)一次,然后就結(jié)束了
**當(dāng)程序中出現(xiàn)兩次或以上的鍵盤輸入時(shí),就有可能出現(xiàn)緩沖區(qū)的問題,只有一次輸入,回車直接結(jié)束沒有這種問題
15.考點(diǎn)題型:字符串常量的長度問題:
1)字符串常量"ab\\c\td\376"的長度是(A)
A) 7 B) 12 C) 8 D) 14
// a b \\ c \t d \376
2)語句printf("%d",strlen("abs\no12\1\\"));的輸出結(jié)果是(C)
A) 11 B) 10 C) 9 D) 8
// a b s \n o 1 2 \1 \\
16.考點(diǎn)題型:賦值運(yùn)算、關(guān)系運(yùn)算的混合運(yùn)算問題:
1)設(shè)m,n,a,b,c,d的值均為0,執(zhí)行(m=a==b)||(n=c==d),m,n的值是(C)
A) 0,0 B) 0,1 C) 1,0 D) 1,1
// "=="是算術(shù)運(yùn)算符,"="是賦值運(yùn)算符,優(yōu)先級(jí):算術(shù)運(yùn)算符>賦值運(yùn)算符,先判斷a==b?是否正確
正確則為真,把1賦給m,"||"是或運(yùn)算,前面已經(jīng)為真,所以||后面的就不會(huì)再運(yùn)算了,結(jié)果就為真
所以m=1,n=0不變
2)int a,b,m,n;初值依次為4,3,2,1,經(jīng)計(jì)算m=(a<=b)&&(n=m
A) 1,1 B) 1,0 C) 0,1 D) 0,0
// a<=b為假,&&是并,前面已經(jīng)為假,后面就不會(huì)再運(yùn)算了,結(jié)果就為假,把0賦給m,即m=0,n=1不變
四、 選擇控制結(jié)構(gòu)
1.沃思提出“數(shù)據(jù)結(jié)構(gòu)+算法=程序”只在面向過程的語言(如C語言)成立
2.算法的正確性衡量方法:
1)有窮性 2)確定性 3)有效性 4)允許沒有輸入或者有多個(gè)輸入 5)必須有一個(gè)或者多個(gè)輸出
3.算法的描述方法:
1)自然語言描述 2)流程圖描述 3)NS結(jié)構(gòu)化流程圖描述 4)偽碼描述
4.關(guān)系表達(dá)式:用作判斷條件,結(jié)果只有真和假,(n%2!=0)等價(jià)于(n%2),0表示假,非0表示真
5.分支結(jié)構(gòu):當(dāng)條件P成立時(shí),執(zhí)行A操作,否則執(zhí)行B操作;如果B操作為空,即為單分支結(jié)構(gòu);
如果B操作不為空,即為雙分支結(jié)構(gòu);如果B操作中又包含另一選擇結(jié)構(gòu),則構(gòu)成多分支選擇結(jié)構(gòu);
6.單分支例題:計(jì)算輸出兩整數(shù)最大值
單分支(一般形式):if(表達(dá)式P) 語句A
#include
void main()
{
int a,b,max;
printf("Enter a,b:");
scanf("%d%d",&a,&b);
if(a>b) //單分支:if(表達(dá)式P) 語句A
max=a;
if(a<=b) //單分支:if(表達(dá)式P) 語句A
max=b;
printf("max=%d\n",max);
}
7.雙分支例題:計(jì)算輸出兩整數(shù)最大值
雙分支(一般形式):if(表達(dá)式P) 語句1
else 語句2
#include
void main()
{
int a,b,max;
printf("Enter a,b:");
scanf("%d%d",&a,&b);
if(a>b)
max=a;
else
max=b;
printf("max=%d\n",max);
}
8.條件運(yùn)算符是C語言中唯一的三元運(yùn)算符,需要三個(gè)操作數(shù)
9.條件運(yùn)算符例題:計(jì)算輸出兩整數(shù)最大值
條件運(yùn)算符(一般形式):表達(dá)式1?表達(dá)式2:表達(dá)式3
含義:若表達(dá)式1為非0,則結(jié)果為表達(dá)式2的值,否則是表達(dá)式3的值
#include
void main()
{
int a,b,max;
printf("Enter a,b:");
scanf("%d%d",&a,&b);
max=a>b?a:b;
printf("max=%d\n",max);
}
10.多分支控制條件語句(一般形式):
if(表達(dá)式1) 語句1
else if(表達(dá)式2) 語句2
...
else if(表達(dá)式m) 語句m
else 語句m+1
11.條件語句在語法上只允許每個(gè)條件分支中帶一條語句,而要在分支里處理多條語句 就要使用花括號(hào),構(gòu)成復(fù)合語句
12.隨機(jī)數(shù)的使用方法:
1) 符號(hào)常量RAND_MAX在頭文件#include中定義,標(biāo)準(zhǔn)C規(guī)定RAND_MAX不大于雙字節(jié)整數(shù)的最大值32767
2)隨機(jī)函數(shù)rand()產(chǎn)生的是一個(gè)在0~RAND_MAX之間的整數(shù),即[0,32767]之間的整數(shù)
3) 利用求余運(yùn)算rand()%b可將函數(shù)rand()生成的隨機(jī)數(shù)變化到[0,b-1]
4) 利用rand()%b+a可將隨機(jī)數(shù)的取值范圍平移到[a,a+b-1]
例:產(chǎn)生1~100的隨機(jī)數(shù): rand()%100+1
13.例題:猜數(shù)游戲:計(jì)算機(jī)想一個(gè)數(shù),人猜對(duì)了提示Right!,否則提示W(wǎng)rong!,并告訴大小 #include
#include
void main()
{
int magic,guess;
magic=rand(); //隨機(jī)數(shù)
printf("Please guess a number:");
scanf("%d",&guess);
if(guess>magic) //多分支
{
printf("Wrong!Too big!\n"); //復(fù)合語句
}
else if(guess
{
printf("Wrong!Too small!\n");
}
else{
printf("Right!\n");
printf("The number is:%d\n",magic);
}
}
14.switch語句:用于多路選擇,一般情況大于三種,用開關(guān)語句代替條件語句
1) switch語句(一般形式):
switch(表達(dá)式)
{
case 常量1:
可執(zhí)行語句序列1 //注意:語句序列不使用花括號(hào)
case 常量2:
可執(zhí)行語句序列2
........
case 常量n:
可執(zhí)行語句序列n
default:
可執(zhí)行語句序列n+1
}
2) switch語句相當(dāng)于一系列的if-else語句
3)switch后圓括號(hào)內(nèi)的表達(dá)式只能是char型或int型
4)關(guān)鍵字case后接常量,類型與表達(dá)式類型一致,常量的值必須互不相同
5)常量與case中間至少有一個(gè)空格,常量后面是冒號(hào)
6)case本身并沒有條件判斷的功能,若case后面的語句省略不寫,則表示它與后續(xù)case執(zhí)行相同的語句
7)switch語句的執(zhí)行過程:
第一步,計(jì)算switch后表達(dá)式的值
第二步,將表達(dá)式的值依次與case后的常量比較
第三步,如果相等,執(zhí)行case后的代碼段,執(zhí)行完畢,可使用break語句跳出switch語句
如果沒有break語句,不會(huì)再比較,程序?qū)⒁来螆?zhí)行下面的case后的語句,直到遇到break或者switch的}為止
15.例題:編程實(shí)現(xiàn)簡單計(jì)算器功能
#include
void main()
{
int data1,data2;
char op;
printf("Enter your expression:");
scanf("%d%c%d",&data1,&op,&data2);
switch(op)
{
case '+':
printf("%d+%d=%d\n",data1,data2,data1+data2);
break;
case '-':
printf("%d-%d=%d\n",data1,data2,data1-data2);
break;
case '*':
case 'x':
case 'X':
printf("%d*%d=%d\n",data1,data2,data1*data2);
break;
case '/':
if(0==data2)//也可寫成data2==0,寫0==data2的好處:
{ //因?yàn)橘x值表達(dá)式左值必須是變量,如果把==誤寫成=,會(huì)提示錯(cuò)誤
printf("Division by zero!\n");
}
else{
printf("%d/%d=%d\n",data1,data2,data1/data2);
}
break;
default:
printf("Invalid operator!\n");
//break;這句一般不需要,因?yàn)闆]有break就會(huì)依次執(zhí)行下面的步驟直到break或者switch的}
} //這里已經(jīng)是switch的}了
}
16.例題:編程實(shí)現(xiàn)簡單計(jì)算器功能,能進(jìn)行浮點(diǎn)數(shù)運(yùn)算,操作數(shù)與運(yùn)算符之間可加入任意多個(gè)空格
#include
#include
void main()
{
float data1,data2;
char op;
printf("Enter your expression:");
scanf("%f %c%f",&data1,&op,&data2);
switch(op)
{
case '+':
printf("%f+%f=%f\n",data1,data2,data1+data2);
break;
case '-':
printf("%f-%f=%f\n",data1,data2,data1-data2);
break;
case '*':
case 'x':
case 'X':
printf("%f*%f=%f\n",data1,data2,data1*data2);
break;
case '/':
if(fabs(data2)<=1e-7)
{
printf("Division by zero!\n");
}
else{
printf("%f/%f=%f\n",data1,data2,data1/data2);
}
break;
default:
printf("Invalid operator!\n");
}
}
//內(nèi)存中的浮點(diǎn)數(shù)所表示的精度是有限的,所以比較實(shí)型變量data2與0是否相等時(shí), 不能像整型變量與0比較那樣直接用相等關(guān)系運(yùn)算符與0比較,而應(yīng)使用如下方式判斷 實(shí)型變量data2的值是否位于0附近的一個(gè)很小的區(qū)間內(nèi),即:if(fabs(data2)<=1e-7)
17.邏輯運(yùn)算符和邏輯表達(dá)式
邏輯非:!,單目運(yùn)算符,右結(jié)合, 優(yōu)先級(jí)最高
邏輯與:&&,雙目運(yùn)算符,左結(jié)合,優(yōu)先級(jí)較高
邏輯或:||,雙目運(yùn)算符,左結(jié)合,優(yōu)先級(jí)較低
例:判斷某一年year是否是閏年的條件:
1) 能被4整除,但不能被100整除;
1)能被400整除
邏輯表達(dá)式:((year%4==0)&&(year%100!=0))||(year%400==0)
或:(year%4==0)&&(year%100!=0)||(year%400==0)
18.特別注意:在計(jì)算含有邏輯運(yùn)算符(&&和||)的表達(dá)式時(shí),通常盡量使用最少的操作數(shù)來 確定表達(dá)式的值,這就意味著表達(dá)式中的某些操作數(shù)可能不會(huì)被計(jì)算。
例:if(a>1&&b++>2&&c--!=0)中,僅在條件表達(dá)式a>1為真時(shí),才會(huì)計(jì)算后面的值
19.程序測試:
1)程序測試只能證明程序有錯(cuò),不能證明程序無錯(cuò)
2)例:編程輸入三角形三邊長a,b,c,判斷他們能否構(gòu)成三角形,能構(gòu)成什么三角形 #include
#include
#define EPS 1e-1
void main()
{
float a,b,c;
int flag=1;
printf("Enter a,b,c:");
scanf("%f,%f,%f",&a,&b,&c);
if(a+b>c&&b+c>a&&a+c>b)
{
if(fabs(a-b)<=EPS&&fabs(b-c)<=EPS&&fabs(c-a)<=EPS)
{
printf("等邊");
flag=0;
}
else if(fabs(a-b)<=EPS||fabs(b-c)<=EPS||fabs(c-a)<=EPS)
{
printf("等腰");
flag=0;
}
if(fabs(a*a+b*b-c*c)<=EPS||fabs(b*b+c*c-a*a)<=EPS||fabs(a*a+c*c-b*b)<=EPS) {
printf("直角");
flag=0;
}
if(flag)
{
printf("一般");
}
printf("三角形\n");
}
else{
printf("不是三角形\n");
}
}
3)例:編程將輸入的百分制成績轉(zhuǎn)換為五分制成績輸出
#include
void main()
{
int score,mark;
printf("Enter score:");
scanf("%d",&score);
if(score<0||score>100)
{
mark=-1;//這個(gè)if語句很重要,如果去掉,邊界測試101~109,-1~-9會(huì)出錯(cuò) }
else{
mark=score/10;
}
switch(mark)
{
case 10:
case 9:
printf("%d-優(yōu)!\n",score);
break;
case 8:
printf("%d-良!\n",score);
break;
case 7:
printf("%d-中!\n",score);
break;
case 6:
printf("%d-及格!\n",score);
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
printf("%d-不及格!\n",score);
break;
default:
printf("Input error!\n");
}
}
20.對(duì)輸入非法字符的檢查與處理
1)例:輸入兩個(gè)整型數(shù),計(jì)算并輸出兩個(gè)整數(shù)的最大值
#include
void main()
{
int a,b,max;
printf("Enter a,b:");
scanf("%d,%d",&a,&b);
max=a>b?a:b;
printf("max=%d\n",max);
}
//隱含問題:在Visual C++下
1.如果輸入3.2,1則輸出3
2.如果輸入1,3.2則輸出3
3.如果輸入q則輸出-858993460
//解決辦法:
#include
void main()
{
int a,b,max,ret;
do{
printf("Enter a,b:");
ret=scanf("%d,%d",&a,&b);
if(ret!=2)//返回在遇到非法字符前已成功讀入的數(shù)據(jù)項(xiàng)數(shù)
{
//但是scanf()函數(shù)不做類型檢查,所以輸入1,3.2會(huì)輸出3
printf("Input error!\n");
while(getchar()!='\n');
}
else{
max=a>b?a:b;
printf("max=%d\n",max);
}
}while(ret!=2);
}
21.位運(yùn)算符的使用
1)位運(yùn)算是對(duì)字節(jié)或字內(nèi)的二進(jìn)制數(shù)位進(jìn)行測試、抽取、設(shè)置或移位等操作
2) 位運(yùn)算的操作對(duì)象只能是char和int類型
3) C語言中共有6種位運(yùn)算符,只有按位取反是單目運(yùn)算符,其他都是雙目運(yùn)算符
4)關(guān)系運(yùn)算和邏輯運(yùn)算的結(jié)果要么是0,要么是1,而位運(yùn)算結(jié)果可為任意值,但每一位都只能是0或1
5)6種位運(yùn)算符:
按位取反 ~ 用于加密處理,一次求反加密,二次求反解密
左移位 <<
右移位 >>
按位與 & 用于對(duì)字節(jié)中某位清零
按位異或 ^
按位或 | 用于對(duì)字節(jié)中某位置1
6)按位取反 ~1=0,~0=1
例:~5=-6
~ 00000101
———————
11111010 是-6的補(bǔ)碼
7)按位與 0&0=0,0&1=0,1&1=1
例:將15的最低位不變,其余位清零 15&1=1
00001111
& 00000001
——————
00000001
8)按位或 0|0=0,0|1=1,1|1=1
例:將15的最高位不變,其余位均置1 15|127=127
00001111
| 01111111
——————
01111111 是127的補(bǔ)碼
9)按位異或 0^0=0,0^1=1,1^1=0
例:3^5=6
00000011
^ 00000101
——————
00000110 是6的補(bǔ)碼
10)左移位
x<
例:將15左移1、2、3位的二進(jìn)制補(bǔ)碼如下
初始字節(jié)內(nèi)容 00001111 對(duì)應(yīng)十進(jìn)制15
左移1位字節(jié)內(nèi)容 00011110 對(duì)應(yīng)十進(jìn)制30
左移2位字節(jié)內(nèi)容 00111100 對(duì)應(yīng)十進(jìn)制60
左移3位字節(jié)內(nèi)容 01111000 對(duì)應(yīng)十進(jìn)制120
11)右移位
x>>n 表示把x的每一位向右移n位,當(dāng)x為有符號(hào)數(shù)時(shí),左邊空位補(bǔ)符號(hào)位值—算術(shù)移位
當(dāng)x為無符號(hào)位時(shí),左邊空位補(bǔ)0—邏輯移位
例1:將15右移1、2、3位的二進(jìn)制補(bǔ)碼如下
初始字節(jié)內(nèi)容 00001111 對(duì)應(yīng)十進(jìn)制15
右移1位字節(jié)內(nèi)容 00000111 對(duì)應(yīng)十進(jìn)制7
右左移2位字節(jié)內(nèi)容 00000011 對(duì)應(yīng)十進(jìn)制3
右移3位字節(jié)內(nèi)容 00000001 對(duì)應(yīng)十進(jìn)制1
例2:將-15右移1、2、3位的二進(jìn)制補(bǔ)碼如下
初始字節(jié)內(nèi)容 11110001 對(duì)應(yīng)十進(jìn)制-15
右移1位字節(jié)內(nèi)容 11111000 對(duì)應(yīng)十進(jìn)制-8
右左移2位字節(jié)內(nèi)容 11111100 對(duì)應(yīng)十進(jìn)制-4
右移3位字節(jié)內(nèi)容 11111110 對(duì)應(yīng)十進(jìn)制-2
12) 無論左移位還是右移位,從一端移走的位不移入另一端,移走的位的信息就丟失了
13)左移位和右移位可以分表代替整數(shù)的乘法和除法,左移n位相當(dāng)于乘以2^n,右移n為相當(dāng)于除以2^n
14) 例:寫出運(yùn)行結(jié)果
#include x 0000 0000 0000 1100
void main() ~x 1111 1111 1111 0011
{ ~x反碼1000 0000 0000 1100
int x=12,y=8; ~x反碼加一1000 0000 0000 1101 -13 printf("%5d%5d%5d\n",!x,x||y,x&&y);
printf("%5u%5d%5d\n",~x,x|y,x&y);
printf("%5d%5d%5d\n",~x,x|y,x&y);
}
輸出: 0 1 1
4294967283 12 8
-13 12 8
五、循環(huán)控制結(jié)構(gòu)
1.循環(huán):包括計(jì)數(shù)控制的循環(huán)和條件控制的循環(huán)
2.結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)
3.循環(huán)結(jié)構(gòu)的類型:
1)當(dāng)型循環(huán)結(jié)構(gòu):for語句(適合循環(huán)次數(shù)已知,計(jì)數(shù)控制的循環(huán))
2)直到型循環(huán)結(jié)構(gòu):while語句、do-while語句(適合循環(huán)次數(shù)未知,條件控制的循環(huán))
4.while語句
1)一般形式為:
while(循環(huán)控制表達(dá)式)
{ |
語句系列 |循環(huán)體
} |
2)循環(huán)控制表達(dá)式在執(zhí)行循環(huán)體之前測試
3)執(zhí)行過程:
計(jì)算循環(huán)控制表達(dá)式的值
如果循環(huán)控制表達(dá)式的值為真,那么執(zhí)行循環(huán)體中的語句,并返回步驟1
如果循環(huán)控制表達(dá)式的值為假,就退出循環(huán),執(zhí)行循環(huán)體后面的語句
5.do-while語句
1)一般形式為:
do
{ |
語句系列 |循環(huán)體
}while(循環(huán)控制表達(dá)式);
2)循環(huán)控制表達(dá)式在執(zhí)行循環(huán)體之后測試
3)執(zhí)行過程:
執(zhí)行循環(huán)體中的語句
計(jì)算循環(huán)控制表達(dá)式的值
如果循環(huán)控制表達(dá)式的值為真,那么返回步驟1
如果循環(huán)控制表達(dá)式的值為假,就退出循環(huán),執(zhí)行循環(huán)體后面的語句
6.for語句
1)一般形式為:
for(初始化表達(dá)式;循環(huán)控制表達(dá)式;增值表達(dá)式)
{ |
語句系列 |循環(huán)體
} |
2) 在每次循環(huán)體被執(zhí)行之前,都要對(duì)循環(huán)控制條件測試一次,每次循環(huán)體執(zhí)行完以后都要執(zhí)行一次增值表達(dá)式
3)初始化表達(dá)式作用:循環(huán)變量初始化,即賦初值
4)循環(huán)控制表達(dá)式:是控制繼續(xù)執(zhí)行的條件,當(dāng)表達(dá)式的值為非0時(shí)重復(fù)執(zhí)行循環(huán)
5)增值表達(dá)式作用:每執(zhí)行一次循環(huán),循環(huán)控制變量增值
6)for語句三個(gè)表達(dá)式之間用分號(hào)分隔,有且只能有兩個(gè)分號(hào)
7)循環(huán)控制表達(dá)式若省略,表示循環(huán)條件為永真
8)初始化表達(dá)式和增值表達(dá)式都可省略,但是必須有其他語句反應(yīng)其作用
7.例:從鍵盤輸入n,然后計(jì)算輸出1+2+3+??n的值
1)while語句編程實(shí)現(xiàn)
#include
void main()
{
int i=1,n,sum=0;//sum一定要初始化,不然會(huì)是隨機(jī)值
printf("Enter n:");
scanf("%d",&n);
while(i<=n)
{
sum+=i;
i++;
}
printf("1+2+3+??+%d=%d\n",n,sum);
}
2)do-while語句編程實(shí)現(xiàn)
#include
void main()
{
int i=0,n,sum=0;
printf("Enter n:");
scanf("%d",&n);
do
{
sum+=i;
i++;
}while(i<=n);
printf("1+2+3+??+%d=%d\n",n,sum);
}
3)for語句編程實(shí)現(xiàn)
#include
void main()
{
int i=1,n,sum=0;
printf("Enter n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum+=i;
}
printf("1+2+3+??+%d=%d\n",n,sum);
}
8.逗號(hào)運(yùn)算符
1)所有運(yùn)算符中優(yōu)先級(jí)最低,左結(jié)合
2)作用:可實(shí)現(xiàn)對(duì)各個(gè)表達(dá)式的順序求值
3)結(jié)果:將最后一個(gè)表達(dá)式的值作為整個(gè)逗號(hào)表達(dá)式的值
4)例:從鍵盤輸入n,然后計(jì)算輸出1+2+3+??n的值
#include
void main()
{
int i,j,n,sum=0;
printf("Enter n:");
scanf("%d",&n);
for(i=1,j=n;i<=j;i++,j--)
{
sum+=i+j;
}
printf("1+2+3+??+%d=%d\n",n,sum);
}
9.空語句
1)僅由一個(gè)分號(hào)構(gòu)成的語句
2)作用:什么也不做,只起延時(shí)作用
3)例:for(i=1;i<50000000;i++)
{
;
}
或for(i=1;i<50000000;i++)
{
}
或for(i=1;i<50000000;i++);
for(i=1;i<=n;i++);
{
sum+=i;
}
等價(jià)于
for(i=1;i<=n;i++)
{
;
}
sum+=i;
4) 例:從鍵盤輸入n,然后計(jì)算輸出1+2+3+??n的值
#include
void main()
{
int i,j,n,sum=0;
printf("Enter n:");
scanf("%d",&n);
for(i=1,j=n;i<=j;i++,j--);
{
sum+=i+j;
}
printf("1+2+3+??+%d=%d\n",n,sum);
}//輸出結(jié)果:101
10.死循環(huán)
1)while語句行末加分號(hào)將導(dǎo)致死循環(huán)
2)例:i=1;
while(i<=n);//行末加分號(hào)導(dǎo)致死循環(huán)
{
sum+=i;
i++;
}
相當(dāng)于
i=1;
while(i<=n)//當(dāng)輸入大于1的n值,循環(huán)體中沒有語句可以改變控制變量i { //使得循環(huán)條件為永真,導(dǎo)致死循環(huán)
;
}
sum+=i;
i++;
11.while語句和do-while語句的區(qū)別
1)while先判斷后執(zhí)行,有可能一次都不執(zhí)行,do-while先執(zhí)行后判斷,至少執(zhí)行一次
2)例:n=101; n=101;
while(n<100) do
{ {
printf("n=%d\n",n); printf("n=%d\n",n);
n++; n++;
} }while(n<100);
//循環(huán)一次也不執(zhí)行 //結(jié)果:輸出n=101,循環(huán)執(zhí)行一次
3)例:分別用while和do-while語句編程,輸入一組數(shù)據(jù),然后顯示每次輸入數(shù)據(jù)進(jìn)行累加運(yùn)算的結(jié)果,輸入0結(jié)束
do-while語句實(shí)現(xiàn):
#include
void main()
{
int num,sum=0;
do{
printf("Enter num:");
scanf("%d",&num);
sum+=num;
printf("sum=%d\n",sum);
}while(num!=0);
}
while語句實(shí)現(xiàn)
#include
void main()
{
int num=1,sum=0;//給num賦任意非0值都可以
while(num!=0)
{
printf("Enter num:");
scanf("%d",&num);
sum+=num;
printf("sum=%d\n",sum);
}
}
12.計(jì)數(shù)控制的循環(huán):循環(huán)次數(shù)事先已知的循環(huán)
1)例1:編寫一個(gè)程序,從鍵盤輸入n,計(jì)算輸出n! #include
void main()
{
int i,n,sum=1;
printf("Enter n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum*=i;
}
printf("%d!=%ld\n",n,sum);
}
2)例2:編寫一個(gè)程序,從鍵盤輸入n,計(jì)算輸出1!,2!??n! #include
void main()
{
int i,n,sum=1;
printf("Enter n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum*=i;
printf("%2d!=%ld\n",i,sum);
}
}
3)例:鍵盤輸入n,編程計(jì)算1!+2!+3!+??+n!
#include
void main()
{
int term=1,sum=0,i,n;
printf("Enter n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
term*=i;
sum+=term;
}
printf("1!+2!+3!+??+%d!=%ld\n",n,sum);
}
13.條件控制的循環(huán):循環(huán)次數(shù)事先未知,由條件控制
1)例1:輸入兩個(gè)整型數(shù),計(jì)算并輸出兩個(gè)整型數(shù)的最大值,如若輸入非法字符,提示錯(cuò)誤并重新輸入
//解釋:非法字符,需要輸入數(shù)字時(shí),字符相對(duì)它來說就是非法字符,而需要輸入字符型,數(shù)字對(duì)它不是非法字符,所有都是合法
#include
void main()
{
int a,b,max,ret;
printf("Enter a,b:");
ret=scanf("%d %d",&a,&b);
while(ret!=2)//判斷數(shù)據(jù)個(gè)數(shù)或格式是否錯(cuò)誤
{
while(getchar()!='\n');//清除緩沖區(qū)中的錯(cuò)誤數(shù)據(jù)
printf("Enter a,b:");
ret=scanf("%d %d",&a,&b);
}
max=a>b?a:b;
printf("max=%d\n",max);
}
//注意:scanf()函數(shù)不做參數(shù)類型匹配檢查,當(dāng)輸入1 3.2時(shí),scanf返回2,不會(huì)導(dǎo)致重新輸入
但是,此后的小數(shù)點(diǎn)仍留在緩沖區(qū),如果此后還需輸入內(nèi)容,就要先清除緩沖區(qū)內(nèi)容
2)例2:先由計(jì)算機(jī)想一個(gè)1-100之間的數(shù)請人猜,若猜對(duì),則計(jì)算機(jī)提示Right!結(jié)束 游戲,否則提示W(wǎng)rong!,并告訴人是大是小,直到猜對(duì)為止,記錄人猜的次數(shù),反應(yīng)猜數(shù)的水平
#include
#include
void main()
{
int magic;
int guess;
int counter=0;
magic=rand()%100+1;
do{
printf("Please guess a magic number:");
scanf("%d",&guess);
counter++;
if(guess>magic)
{
printf("Wrong!Too big!\n");
}
else if(guess
{
printf("Wrong!Too small!\n");
}
else{
printf("Right!\n");
}
}while(guess!=magic);
printf("counter=%d\n",counter);
}
14.隨機(jī)數(shù)的使用
a.隨機(jī)數(shù)的產(chǎn)生: rand()
1) 符號(hào)常量RAND_MAX在頭文件#include中定義,標(biāo)準(zhǔn)C規(guī)定RAND_MAX不大于雙字節(jié)整數(shù)的最大值32767
2)隨機(jī)函數(shù)rand()產(chǎn)生的是一個(gè)在0~RAND_MAX之間的整數(shù),即[0,32767]之間的整數(shù)
3) 利用求余運(yùn)算rand()%b可將函數(shù)rand()生成的隨機(jī)數(shù)變化到[0,b-1]
4) 利用rand()%b+a可將隨機(jī)數(shù)的取值范圍平移到[a,a+b-1]
b.隨機(jī)數(shù)的產(chǎn)生: srand(time(NULL))
1)用rand()直接產(chǎn)生的隨機(jī)數(shù)只是一個(gè)偽隨機(jī)數(shù),反復(fù)調(diào)用產(chǎn)生的隨機(jī)數(shù)序列是一樣的,而且每次都只用第一個(gè)
2)隨機(jī)化:使程序每次運(yùn)行時(shí)產(chǎn)生不同的隨機(jī)數(shù)序列的過程
3)隨機(jī)化的實(shí)現(xiàn):通過調(diào)用標(biāo)準(zhǔn)庫函數(shù)srand()為函數(shù)rand()設(shè)置隨機(jī)數(shù)種子來實(shí)現(xiàn)
4)隨機(jī)數(shù)種子的設(shè)置:
法1:每次通過用戶輸入來完成隨機(jī)化,srand(1),srand(2),srand(seed),輸入seed
法2:的通過函數(shù)time()讀取計(jì)算機(jī)的時(shí)鐘值,并把該值設(shè)置為隨機(jī)數(shù)種子srand(time(NULL))
5)函數(shù)time()返回以秒計(jì)算的當(dāng)前時(shí)間值,即一個(gè)代表時(shí)間的字符串,使用NULL作為time()的參數(shù)時(shí),
time(NULL)的返回值被轉(zhuǎn)換成一個(gè)無符號(hào)整數(shù),可作為隨機(jī)數(shù)發(fā)生器的種子
6)使用time()函數(shù)時(shí),必須在程序開頭將頭文件包含到程序中
15.例:先由計(jì)算機(jī)想一個(gè)1-100之間的數(shù)請人猜,若猜對(duì),則計(jì)算機(jī)提示Right!結(jié)束
游戲,否則提示W(wǎng)rong!,并告訴人是大是小,直到猜對(duì)為止,記錄人猜的次數(shù),反應(yīng)猜數(shù)的水平
#include
#include
#include
void main()
{
int magic;
int guess;
int counter=0;
srand(time(NULL));
magic=rand()%100+1;
do{
printf("Please guess a magic number:");
scanf("%d",&guess);
counter++;
if(guess>magic)
{
printf("Wrong!Too big!\n");
}
else if(guess
{
printf("Wrong!Too small!\n");
}
else{
printf("Right!\n");
}
}while(guess!=magic);
printf("counter=%d\n",counter);
}
16.例:先由計(jì)算機(jī)想一個(gè)1-100之間的數(shù)請人猜,若猜對(duì),則計(jì)算機(jī)提示Right!屏幕輸出多少次成功,
結(jié)束游戲,否則提示W(wǎng)rong!,并告訴人是大是小,最多猜10次,超過就結(jié)束,要避免非法字符的輸入
#include
#include
#include
void main()
{
int magic;
int guess;
int counter=0;
int ret;//保存scanf()函數(shù)的返回值
srand(time(NULL));
magic=rand()%100+1;
do{
printf("Please guess a magic number:");
ret=scanf("%d",&guess);
while(ret!=1)//若存在輸入錯(cuò)誤,則重新輸入
{
while(getchar()!='\n');//清楚緩沖區(qū)中的內(nèi)容
printf("Please guess a magic number:");
ret=scanf("%d",&guess);
} //若存在非法字符,則重新輸入
counter++;
if(guess>magic)
{
printf("Wrong!Too big!\n");
}
else if(guess
{
printf("Wrong!Too small!\n");
}
else{
printf("Right!\n");
}
}while(guess!=magic&&counter<10);
printf("counter=%d\n",counter);
}
延伸拓展:先由計(jì)算機(jī)想一個(gè)1-100之間的數(shù)請人猜,若猜對(duì),則計(jì)算機(jī)提示Right!屏幕輸出多少次成功,
結(jié)束游戲,否則提示W(wǎng)rong!,并告訴人是大是小,最多猜10次,超過就繼續(xù)猜下一個(gè)數(shù),每次運(yùn)行程序,可
反復(fù)猜多個(gè)數(shù),直到操作者想停時(shí)結(jié)束,要注意避免非法字符輸入的問題
#include
#include
#include
void main()
{
int magic;
int guess;
int counter;
char reply;//保存用戶輸入的答案
int ret;//保存scanf()函數(shù)的返回值
srand(time(NULL));
do{
magic=rand()%100+1;
counter=0;
do{
printf("Please guess a magic number:");
ret=scanf("%d",&guess);
while(ret!=1)//若存在輸入錯(cuò)誤,則重新輸入
{
while(getchar()!='\n');//清楚緩沖區(qū)中的內(nèi)容
printf("Please guess a magic number:");
ret=scanf("%d",&guess);
} //若存在非法字符,則重新輸入
counter++;
if(guess>magic)
{
printf("Wrong!Too big!\n");
}
else if(guess
{
printf("Wrong!Too small!\n");
}
else{
printf("Right!\n");
}
}while(guess!=magic&&counter<10);
printf("counter=%d\n",counter);
printf("Do you want to continue(Y/N or y/n)?");
scanf(" %c",&reply);//%c前有一個(gè)空格,讀取緩沖區(qū)中的回車符
}while(reply=='Y'||reply=='y');
}
17.設(shè)計(jì)一個(gè)簡單計(jì)算器,允許連續(xù)做多次算術(shù)運(yùn)算
#include
#include
void main()
{
float data1,data2;
char op;
char reply;
do{
printf("Please enter your expression:\n");
scanf("%f %c%f",&data1,&op,&data2);//加空格可在操作數(shù)和運(yùn)算符之間加任意多個(gè)空白符
switch(op)
case '+':
printf("%f+%f=%f\n",data1,data2,data1+data2);
break;
case '-':
printf("%f-%f=%f\n",data1,data2,data1-data2);
break;
case '*':
case 'X':
case 'x':
printf("%f*%f=%f\n",data1,data2,data1*data2);
break;
case '/':
if(fabs(data2)<=1e-7)
{
printf("Division by zero!\n");
}
else{
printf("%f/%f=%f\n",data1,data2,data1/data2);
}
break;
default:
printf("Invalid operator!\n");
}
printf("Do you want to continue(Y/y or N/n)?");
scanf(" %c",&reply);//加空格清除緩沖區(qū)中的回車符
}
while(reply=='Y'||reply=='y');
}
18.嵌套循環(huán)
一個(gè)循環(huán)語句放在另一個(gè)循環(huán)語句中構(gòu)成的循環(huán)稱為嵌套循環(huán)
1) 嵌套循環(huán)的總循環(huán)次數(shù)等于外層循環(huán)次數(shù)和內(nèi)層循環(huán)次數(shù)的乘積
2)為避免造成混亂,嵌套循環(huán)的內(nèi)層和外層的循環(huán)控制變量不要同名
3)例:鍵盤輸入n,編程計(jì)算1!+2!+3!+??+n!
#include
void main()
{
int term,sum=0,i,j,n;
printf("Enter n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
term=1;
for(j=1;j<=i;j++)
term*=j;
}
sum+=term;
}
printf("1!+2!+3!+??+%d!=%ld\n",n,sum);
}
19累加求和構(gòu)成規(guī)律:
1)當(dāng)累加項(xiàng)較為復(fù)雜或者前后項(xiàng)之間無關(guān)時(shí),需要單獨(dú)計(jì)算每個(gè)累加項(xiàng)
2)當(dāng)累加項(xiàng)前項(xiàng)與后項(xiàng)之間有關(guān)時(shí),根據(jù)前項(xiàng)計(jì)算后項(xiàng)
#include
void main()
{
int i,n;
long term=1,sum=0;
printf("Enter n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
term=term*i;
sum=sum+term;
}
printf("1!+2!+3!+??%d=%ld\n",n,sum);
}
20.goto語句
1)功能:使程序無條件跳轉(zhuǎn)到語句標(biāo)號(hào)所標(biāo)識(shí)的語句去執(zhí)行,所跳過的語句不再執(zhí)行
2)一般形式:
①向前跳轉(zhuǎn) ②向后跳轉(zhuǎn)
goto 語句標(biāo)號(hào); 語句標(biāo)號(hào):??(后)
?? ??
語句標(biāo)號(hào):?? (前) goto 語句標(biāo)號(hào);
3)應(yīng)用:通常情況,goto語句與if語句聯(lián)合使用
if(表達(dá)式) goto語句標(biāo)號(hào); 語句標(biāo)號(hào):??
?? ??
語句標(biāo)號(hào):?? if(表達(dá)式) goto語句標(biāo)號(hào);
21.break語句
1)功能:①用于退出switch結(jié)構(gòu)
②用于退出由while,do-while和for語句構(gòu)成的循環(huán)體
2)原理:當(dāng)執(zhí)行循環(huán)體遇到break語句時(shí),循環(huán)體將立即終止,從循環(huán)語句后的第一條語句開始繼續(xù)執(zhí)行
3)應(yīng)用:break語句通常與if聯(lián)合使用,表明在任何條件下跳轉(zhuǎn)到緊接循環(huán)語句后的第一條語句
22.continue語句
1)功能:跳過continue后面尚未執(zhí)行的語句,開始下一次循環(huán),只結(jié)束本次循環(huán),不終止整
個(gè)循環(huán)
2)例題:
#include
void main()
{
int i,n;
for(i=1;i<=5;i++)
{
printf("Please enter n:");
scanf("%d",&n);
if(n<0) continue;
printf("n=%d\n",n);
}
printf("Program is over!\n");
}
23.函數(shù)exit()
1) 標(biāo)準(zhǔn)庫函數(shù)exit()用于控制程序的流程,調(diào)用時(shí),需要加頭文件
2)一般形式:exit(code);
3)功能:終止整個(gè)程序的執(zhí)行,強(qiáng)制返回操作系統(tǒng),并將int型參數(shù)code的值傳給調(diào)用進(jìn)程 (一般為操作系統(tǒng)),當(dāng)code的值為0或宏常量EXIT_FAILURE,表示程序出現(xiàn)某種錯(cuò)誤后退出
24.goto,break,continue,exit()的比較
1)goto,break,continue,exit()都用于控制程序的流程,前三個(gè)是流程控制語言,exit()是C標(biāo)準(zhǔn)函數(shù)
1)功能:goto語句可以向任意方向跳轉(zhuǎn),break語句只限定流程跳轉(zhuǎn)到循環(huán)語句之后 的第一條語句,continue語句結(jié)束本次循環(huán),exit()直接終止所有程序
2)break,goto語句和exit()函數(shù)都可用于終止整個(gè)循環(huán)的執(zhí)行,continue不能終止整個(gè)循環(huán)
3)在嵌套循環(huán)下,break語句和continue語句只對(duì)包含他們的最內(nèi)層循環(huán)語句起作用, 不能用break語句跳出多重循環(huán),只能一層一層的跳出
4)使用goto語句的兩種特定情形:
①快速跳出多重循環(huán)
②跳向共同的出口位置,進(jìn)行退出前的錯(cuò)誤處理工作
25.例題:韓信點(diǎn)兵:x%5==1&&x%6==5&&x%7==4&&x%11==10
①窮舉法(循環(huán)條件自定義,不具實(shí)際意義)
②break退出循環(huán)(循環(huán)條件省略,滿足條件結(jié)束循環(huán))
③exit(0)結(jié)束程序(循環(huán)條件省略,滿足條件結(jié)束整個(gè)程序)
④使用標(biāo)志變量(循環(huán)條件為標(biāo)識(shí)變量為0,最佳方法)
#include
void main()
{
int x;
int find=0;
for(x=1;!find;x++)
{
if(x%5==1&&x%6==5&&x%7==4&&x%11==10)
{
printf("x=%d\n",x);
find=1;
}
}
}
26.類型溢出
1)原因:當(dāng)運(yùn)算的結(jié)果超出了類型所能表示的數(shù)的上界,導(dǎo)致進(jìn)位到達(dá)了最前面的符號(hào) 位或者更多進(jìn)位的丟失,就會(huì)發(fā)生類型溢出
2)解決辦法:采用取值范圍更大的數(shù)據(jù)類型來定義變量
27.結(jié)構(gòu)化程序設(shè)計(jì)的基本思想
1)采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)作為程序設(shè)計(jì)的基本單元,語法結(jié)構(gòu)具有4個(gè)特性 ①只有一個(gè)入口
②只有一個(gè)出口
③無不可達(dá)語句,即不存在永遠(yuǎn)執(zhí)行不到的語句
④無死循環(huán),即不存在永遠(yuǎn)都執(zhí)行不完的循環(huán)
2)盡量避免使用goto語句,因?yàn)樗茐牧私Y(jié)構(gòu)化設(shè)計(jì)風(fēng)格,并且容易帶來錯(cuò)誤的隱患
3)采用自頂向下、逐步求精的模塊化程序設(shè)計(jì)方法進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)
c語言入門基礎(chǔ)知識(shí)
數(shù)據(jù)類型----C的數(shù)據(jù)類型包括:整型、字符型、實(shí)型或浮點(diǎn)型、枚舉類型、數(shù)組類型、結(jié)構(gòu)體類型、共用體類型、指針類型和空類型。
常量與變量----常量其值不可改變,符號(hào)常量名通常用大寫。變量是以某標(biāo)識(shí)符為名字,其值可以改變的量。變量在編譯時(shí)為其分配相應(yīng)存儲(chǔ)單元。
數(shù)組----C++語言代碼如果一個(gè)變量名后面跟著一個(gè)有數(shù)字的中括號(hào),這個(gè)聲明就是數(shù)組聲明。字符串也是一種數(shù)組。
指針----如果一個(gè)變量聲明時(shí)在前面使用 * 號(hào),表明這是個(gè)指針型變量。換句話說,該變量存儲(chǔ)一個(gè)地址,指針不僅可以是變量的.地址,還可以是數(shù)組、數(shù)組元素、函數(shù)的地址。
字符串----C語言的字符串其實(shí)就是char型數(shù)組,使用字符型并不需要引用庫,但是使用字符串就就需要C標(biāo)準(zhǔn)庫里面的一些用于對(duì)字符串進(jìn)行操作的函數(shù)。它們不同于字符數(shù)組。
文件輸入/輸出----在C語言中,輸入和輸出是經(jīng)由標(biāo)準(zhǔn)庫中的一組函數(shù)來實(shí)現(xiàn)的。標(biāo)準(zhǔn)輸入/輸出有三個(gè)標(biāo)準(zhǔn)輸入/輸出是標(biāo)準(zhǔn)I/O庫預(yù)先定義的:stdin標(biāo)準(zhǔn)輸入、stdout標(biāo)準(zhǔn)輸出、stderr輸入輸出錯(cuò)誤。
運(yùn)算----C語言的運(yùn)算非常靈活,功能十分豐富,運(yùn)算種類遠(yuǎn)多于其它程序設(shè)計(jì)語言。
關(guān)鍵字----又稱為保留字,就是已被C語言本身使用,不能作其它用途使用的字。例如關(guān)鍵字不能用作變量名、函數(shù)名等標(biāo)識(shí)符。由ANSI標(biāo)準(zhǔn)定義的C語言關(guān)鍵字共32個(gè):
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static inline
restrict _Bool _Complex _Imaginary _Generic
- 關(guān)于c語言基礎(chǔ)知識(shí)教程
- 有關(guān)c語言入門基礎(chǔ)知識(shí)有哪些
- 有關(guān)IT常用基礎(chǔ)知識(shí)有哪些
- 關(guān)于c語言基本知識(shí)有哪些
- 關(guān)于c語言的常用知識(shí)點(diǎn)有哪些
- 有關(guān)c語言的基礎(chǔ)知識(shí)有哪些
- 關(guān)于c語言程序設(shè)計(jì)知識(shí)點(diǎn)有哪些
- 有關(guān)c語言??贾R(shí)點(diǎn)有哪些
- 關(guān)于必備IT基礎(chǔ)知識(shí)有哪些
- 有關(guān)java面試基礎(chǔ)知識(shí)
- 關(guān)于學(xué)習(xí)java需要哪些基礎(chǔ)知識(shí)
- 關(guān)于c語言程序設(shè)計(jì)基礎(chǔ)知識(shí)