達(dá)內(nèi)C語(yǔ)言筆記_第1頁(yè)
達(dá)內(nèi)C語(yǔ)言筆記_第2頁(yè)
達(dá)內(nèi)C語(yǔ)言筆記_第3頁(yè)
達(dá)內(nèi)C語(yǔ)言筆記_第4頁(yè)
達(dá)內(nèi)C語(yǔ)言筆記_第5頁(yè)
已閱讀5頁(yè),還剩143頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

TOC\o"1-5"\h\z>dayOl(C編程基本結(jié)構(gòu)輸出函數(shù)) 4\o"CurrentDocument"gcc編譯器 4\o"CurrentDocument"基本數(shù)據(jù)類(lèi)型 10\o"CurrentDocument"原碼與補(bǔ)碼 10\o"CurrentDocument"ASCH碼 12\o"CurrentDocument"常量與變量 12\o"CurrentDocument"變量與數(shù)據(jù)類(lèi)型 13\o"CurrentDocument"變量與變量的size 13\o"CurrentDocument"類(lèi)型轉(zhuǎn)換 13\o"CurrentDocument"范例 14\o"CurrentDocument"AdayO2AM(變量常量) 15\o"CurrentDocument"C的保留字 15\o"CurrentDocument"C變量名 15\o"CurrentDocument"vi初始化文件 15\o"CurrentDocument"變量聲明 16\o"CurrentDocument"常量 20const限定符 20\o"CurrentDocument"表達(dá)式的左值與右值 22\o"CurrentDocument"算數(shù)運(yùn)算符 22\o"CurrentDocument"賦值運(yùn)算符 22\o"CurrentDocument"關(guān)系運(yùn)算符 23\o"CurrentDocument"判等運(yùn)算符 23\o"CurrentDocument"邏輯運(yùn)算符 23\o"CurrentDocument"位運(yùn)算 25按位取反 25按位與 25按位或 25按位異或 26左移 26右移 26\o"CurrentDocument"取地址運(yùn)算符 27\o"CurrentDocument"逗號(hào)運(yùn)算符 28\o"CurrentDocument"條件運(yùn)算符 28\o"CurrentDocument"自增/自減運(yùn)算 29\o"CurrentDocument"運(yùn)算符與結(jié)合性 32>day03AM(格式化輸入控制語(yǔ)句) 34\o"CurrentDocument"scanf()從鍵盤(pán)輸入 34\o"CurrentDocument"程序語(yǔ)句 35\o"CurrentDocument"流程控制語(yǔ)句 36\o"CurrentDocument"條件判斷語(yǔ)句 36\o"CurrentDocument"分支語(yǔ)句 38\o"CurrentDocument"A dayO3PM(循環(huán)枚舉) 39\o"CurrentDocument"循環(huán)語(yǔ)句 39\o"CurrentDocument"用typedef定義類(lèi)型 46\o"CurrentDocument"枚舉類(lèi)型 46\o"CurrentDocument"> day04(數(shù)組結(jié)構(gòu)體) 49\o"CurrentDocument"范例 49\o"CurrentDocument"復(fù)雜數(shù)據(jù)類(lèi)型 49\o"CurrentDocument"數(shù)組 50\o"CurrentDocument"字符串字面量 56\o"CurrentDocument"二維數(shù)組 59\o"CurrentDocument"結(jié)構(gòu)體 63\o"CurrentDocument"> dayO5AM(struct位段union) 67\o"CurrentDocument"內(nèi)存的對(duì)齊與補(bǔ)齊 67\o"CurrentDocument"位段 68共用體(聯(lián)合) 71\o"CurrentDocument"> dayO5PM(函數(shù)) 72\o"CurrentDocument"■ 函數(shù) 72函數(shù)的定義 72函數(shù)的聲明 72函數(shù)的調(diào)用 73\o"CurrentDocument"函數(shù)范例一 75\o"CurrentDocument"函數(shù)范例二 76\o"CurrentDocument"C與C++的部分區(qū)別 78\o"CurrentDocument"> dayO6AM(變量種類(lèi)棧堆) 79\o"CurrentDocument"變量種類(lèi) 80\o"CurrentDocument"變量的作用域與可見(jiàn)性 80\o"CurrentDocument"register變量 85\o"CurrentDocument"volatile變量 85\o"CurrentDocument"棧的技術(shù)簡(jiǎn)介 85\o"CurrentDocument"堆與內(nèi)存管理 86\o"CurrentDocument"> dayO6PM(函數(shù)傳參) 87\o"CurrentDocument"函數(shù)傳參 87\o"CurrentDocument"數(shù)組作參數(shù) 89\o"CurrentDocument"可變長(zhǎng)參數(shù)的函數(shù) 92\o"CurrentDocument"遞歸函數(shù) 95\o"CurrentDocument"漢諾塔程序 98\o"CurrentDocument"> day07(預(yù)處理命令) 99■ 宏定義指令#define 99不帶參數(shù)的宏定義 99帶參數(shù)的宏定義(宏函數(shù)) 100#和## 101\o"CurrentDocument"“文件包含”處理 103\o"CurrentDocument"條件編譯指令 103?編譯器預(yù)定義宏 107\o"CurrentDocument"> day08AM(指針) 108\o"CurrentDocument"指針的定義 108\o"CurrentDocument"指針的操作 109地址作為參數(shù) 113\o"CurrentDocument"數(shù)組作為參數(shù) 114\o"CurrentDocument"字符串 115\o"CurrentDocument"虛擬內(nèi)存,內(nèi)核空間,用戶(hù)空間,內(nèi)存映射 118虛擬內(nèi)存 118內(nèi)核空間到物理內(nèi)存的映射 118頁(yè)式映射 119\o"CurrentDocument"> day。8PM(多級(jí)指針 空指針) 120\o"CurrentDocument"不同的main()格式 120\o"CurrentDocument"多級(jí)指針 122\o"CurrentDocument"空指針(void*) 123> day09(數(shù)組指針函數(shù)指針 堆空間) 125\o"CurrentDocument"指針數(shù)組 125\o"CurrentDocument"數(shù)組指針 125函數(shù)指針 128\o"CurrentDocument"堆空間 133\o"CurrentDocument"malloc 133\o"CurrentDocument"calloc 133\o"CurrentDocument"realloc 134\o"CurrentDocument"free 134>day10(1/0流文件格式控制) 136\o"CurrentDocument"I/O流 136\o"CurrentDocument"字符串:sscanf,sprintf 137\o"CurrentDocument"文件:fscanf,fprintf 138\o"CurrentDocument"文件:fopen,fclose 139\o"CurrentDocument"格式字符串 141\o"CurrentDocument"gets.puts,fgets,fputs 143\o"CurrentDocument"getchar.putchar.fgetc/getc?fputc/putc 144fseek 148\o"CurrentDocument"fread.fwrite 150\o"CurrentDocument"ungetc 153\o"CurrentDocument"feof 154dayO1(C編程基本結(jié)構(gòu)輸出函數(shù))標(biāo)準(zhǔn)化20世紀(jì)70年代,出現(xiàn)了第一本關(guān)于C語(yǔ)言的書(shū)籍一《CprogrammingLanguage》,這本書(shū)成了程序員編寫(xiě)程序事實(shí)上的標(biāo)準(zhǔn)。1983年美國(guó)開(kāi)始制定本國(guó)的C語(yǔ)言標(biāo)準(zhǔn),在1989年12月正式通過(guò),我們把這個(gè)標(biāo)準(zhǔn)稱(chēng)為C89。1995年C語(yǔ)言有做出一些改變,1999年通過(guò)了C99標(biāo)準(zhǔn)。經(jīng)典hello程序c程序文件的后綴名必須是?c。C程序文件不是可執(zhí)行文件,是源代碼程序。需要用gcc來(lái)翻譯,它會(huì)把c程序轉(zhuǎn)換成對(duì)應(yīng)的機(jī)器指令,存放在a.out文件中,它是一個(gè)可執(zhí)行文件。vixxx.c編輯(edit),生成c語(yǔ)言源文件。gccxxx.c——編譯連接(compilelink),如果沒(méi)錯(cuò)誤,就生成可執(zhí)行文件a.out。編譯連接可分開(kāi)做:編譯:gcc-cxxx.c>如果沒(méi)錯(cuò)誤,會(huì)產(chǎn)生一個(gè)目標(biāo)文件xxx.o(windows中是xxx.obj);連接:gccxxx.o如果沒(méi)錯(cuò)誤,生成a.out。a.out--運(yùn)行,shell首先找到這個(gè)可執(zhí)行文件,然后內(nèi)核來(lái)執(zhí)行它。c源程序是采用標(biāo)準(zhǔn)c語(yǔ)法來(lái)寫(xiě),標(biāo)準(zhǔn)c是國(guó)際標(biāo)準(zhǔn),所以c源程序是可移植的,可以應(yīng)用于任何操作系統(tǒng)以及任何的編譯工具,但是不可執(zhí)行。a.out已經(jīng)生成了具體的系統(tǒng)下的機(jī)器碼了,所以它是不可移植的。不同操作系統(tǒng)的可執(zhí)行文件的格式不同,linux系統(tǒng)中可執(zhí)行文件格式一般為ELF,windows系統(tǒng)是PE。gcc編譯器我們已經(jīng)使用過(guò)了gcc命令,那么gcc是什么呢?GCC是C語(yǔ)言的最流行的一個(gè)編譯器,GCC(GNUCompilerCollection,GNU編譯器套裝),是一套由GNU開(kāi)發(fā)的編程語(yǔ)言編譯器。它是一套以GPL及LGPL許可證所發(fā)行的自由軟件,也是GNU計(jì)劃的關(guān)鍵部分,亦是自由的類(lèi)Unix及蘋(píng)果電腦MacOSX操作系統(tǒng)的標(biāo)準(zhǔn)編譯器。GCC最基本的用法是:gcc(options)|filenames|o其中options就是編譯器所需要的參數(shù),filenames給出相關(guān)的文件名稱(chēng)。C:只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.C等源代碼文件生成.O為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。ooutput_filename:確定輸出文件的名稱(chēng)為output_filename,同時(shí)這個(gè)名稱(chēng)不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out。g:產(chǎn)生符號(hào)調(diào)試工具(GNU的gdb)所必要的符號(hào)資訊,要想對(duì)源代碼進(jìn)行調(diào)試,我們就必須加入這個(gè)選項(xiàng)。O:對(duì)程序進(jìn)行優(yōu)化編譯、連接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、連接過(guò)程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。02:比-0更好的優(yōu)化編譯、連接,當(dāng)然整個(gè)編譯、連接過(guò)程會(huì)更慢。std:選擇編譯程序所使用的C語(yǔ)言的標(biāo)準(zhǔn),可以使用-std=c89或者-std=c99。S:生成匯編代碼文件。E:查看預(yù)處理后的代碼,顯示在終端屏幕上。|root@192cl|#vihello.cmain()|root@192cl|#gcchello.c|root@192cl|#Isa.outhello.cprintf.c|root@192cl|#a.out|root@192cl|#rm-fa.out[root@192cl|#gcc-chello.c|root@192cl|#Ishello.chello.oprintf.c|root@192cl|#gcchello.o[root@I92cl|#lsa.outhello.chello.oprintf.c[root@192cl|#a.out|root@192cl|#rm-fa.out[root@192cl|#Ishello.chello.oprintf.c|root@192cl|#gcchello.o-ohello[-o:指定可執(zhí)行文件的名字,不指定就叫a.outo]|root@192cl|#Ishellohello.chello.oprintf.c|root@192cl|#rm-fhellohello.o[root@192cl|#Ishello.cprintf.c|root@192cl|#gcchello.c-ohello 【兩步并一步】|root@192cl|#Ishellohello.cprintf.c規(guī)范的寫(xiě)法:intmain()【前面如果不寫(xiě)int,默認(rèn)也是int】{return0;【返回一個(gè)整數(shù)0,與前面的int相呼應(yīng);返回0表示一切正常:默認(rèn)的返回值是0,出錯(cuò)返回-1;習(xí)慣上,一切正常,就寫(xiě):return。;在main函數(shù)中,如果不寫(xiě)該句,編譯器會(huì)自動(dòng)產(chǎn)生return0;對(duì)于其他函數(shù),如果要求有返回值,但沒(méi)寫(xiě)return,就會(huì)隨機(jī)帶回一個(gè)值】)main函數(shù)(主函數(shù))是一個(gè)C程序中必備的且只能有一個(gè),否則連接出錯(cuò)。標(biāo)準(zhǔn)c自帶很多頭文件,存放在目錄/usr/include下。C語(yǔ)言的一個(gè)突出優(yōu)點(diǎn)就是標(biāo)準(zhǔn)庫(kù),里面包含了很多用于輸入輸出,字符串操作,分配內(nèi)存等非常實(shí)用的函數(shù)。標(biāo)準(zhǔn)庫(kù)中的函數(shù)名全部小寫(xiě)。頭文件里存放的一般都是函數(shù)的聲明。[root@192cl|#vihello.c/*這是我的第一個(gè)Linux環(huán)境下的C程序【注釋?zhuān)部捎谩ㄗ⑨屢恍?;多行注釋不可嵌套】?jīng)典不容錯(cuò)過(guò)的helloworld*/#include<stdio.h>[#開(kāi)頭的行叫預(yù)處理行;將stdio.h頭文件的內(nèi)容插入到該位置;預(yù)處理行要寫(xiě)在一行上,如果太長(zhǎng),可在文件末尾用'\'作為續(xù)行符;預(yù)處理行結(jié)尾不加分號(hào)】intmain()(printf("hellocsdl007!\n");【以分號(hào)結(jié)尾的稱(chēng)為一條語(yǔ)句,表達(dá)一個(gè)相對(duì)完整的命令】return0;[root@192cl]#gcchello.c-ohello[root@192cl]#hellohellocsdl007!<>:里面寫(xiě)的是標(biāo)準(zhǔn)c自帶的頭文件,插入自己寫(xiě)的文件可用雙引號(hào)寫(xiě)成<>,就只去標(biāo)準(zhǔn)C的頭文件目錄/usr/include下去找,寫(xiě)成“”,就在當(dāng)前目錄下找;如果帶了路徑,就按路徑查找。例如要用/usr/include目錄下的sys目錄下的socket.h,需要寫(xiě)成:#include<sys/socket.h>?要查看某個(gè)函數(shù)在哪兒頭文件中,只需要:man-a函數(shù)名。[chenzongquan]$man-aprintfPRINTF(1) UserCommandsPRINTF(l)NAMEprintf-formatandprintdataSYNOPSISprintfFORMAT[ARGUMENT]...printfOPTIONDESCRIPTIONPrintARGUMENT(s)accordingtoFORMAT.—helpdisplaythishelpandexit-versionoutputversioninformationandexitFORMATcontrolstheoutputasHnCprintf.Interpretedsequencesare:此時(shí)顯示的是用戶(hù)命令,按q進(jìn)入到下一個(gè)printf:PRINTF(P) POSIXProgrammerfsManualPRINTF(P)NAMEprintf—writeformattedoutputSYNOPSISprintfformat「argument,..]IDESCRIPTIONTheDrintfutilityshallwriteformattedoperandstothestandardoutput.Theargumentoperandsshallbeformattedundercontroloftheformatoperand.OPTIONSNone.OPERANDSThefollowingoperandsshallbesupported:formatAstringdescribingtheformattousetowriteI此時(shí)顯示的還是一個(gè)命令,再按q進(jìn)入到下一個(gè)printf:PRINTF(PRINTF(3)PRINTF(3)NAMELinuxProgrammer*sManualprintf, fprintf,sprintf,snprlntf,vprintf,vfprintf,vsprintf,vsnprintf-formattedoutputconversionSYNOPSIS#include<stdio.h:intprintf(constchar*format.,intfprintf(FILE*stream,constchar*format.,??.);intsprintf(char*str,constchar*format,???);intsnprintf(char*str,size_tsize,constchar*for-mat,???);#include<stdarg.h>intvprintf(constchar*format.,va_listap);intvfprintf(FILE*stream,constchar *format,可以看到printf后面有個(gè)3,所以也可以直接輸入以下命令:[chenzongquan]$man3printf一般情況下,標(biāo)準(zhǔn)C的函數(shù)都是數(shù)字3。嚴(yán)格地說(shuō),應(yīng)該寫(xiě)成下面的形式:[chenzongquan]$man-s3printflinux中,寫(xiě)s,unix中,寫(xiě)S。printf:按格式打印;print-打印,f表示格式。其中,雙引號(hào)包起來(lái)的叫字符串,可長(zhǎng)可短,原樣輸出,除非有特殊含義,如轉(zhuǎn)義字符。printf(格式字符串,表達(dá)式1,表達(dá)式2,…);【用表達(dá)式替換格式字符串中的占位符%;如果沒(méi)寫(xiě)表達(dá)式,占位符會(huì)隨機(jī)找數(shù)據(jù)來(lái)替換;如果沒(méi)有格式占位符,后面的表達(dá)式就沒(méi)用處】在stdio頭文件中聲明了printf,所以需包含頭文件stdio.h。單引號(hào)包起來(lái)的叫字符,單引號(hào)只能包一個(gè)字符,不能包多個(gè),也不能一個(gè)都不包,但是還存在一些轉(zhuǎn)義字符,如'\n',也是一個(gè)字符,表示newline,換一行。用“\”打頭的字符都有特殊含義,稱(chēng)為轉(zhuǎn)義字符。表3T轉(zhuǎn)義字符及其作用字符形式含義ASCII代碼\n換行,將當(dāng)前位置移到下一行開(kāi)頭10\t水平制表(跳到下一個(gè)Tab位置)9\b退格,將當(dāng)前位置移到前一列8\r回車(chē),將當(dāng)前位置移到本行開(kāi)頭13\f換頁(yè),將當(dāng)前位置移到下頁(yè)開(kāi)頭12\\代表一個(gè)反斜杠字符92V代表一個(gè)單引號(hào)(撇號(hào))字符39代表一個(gè)雙引號(hào)字符34\ddd1到3位八進(jìn)制數(shù)所代表的字符\xhh1到2位十六進(jìn)制數(shù)所代表的字符輸入回車(chē)鍵其實(shí)相當(dāng)于輸入了一個(gè)換行符。而上是回車(chē)符,回到本行最左邊,它并不換行。|root@192cl|#viabcprintf("大家好!\n*');prinlf(”祝大家好運(yùn)!\n");【在c程序的末尾最好留一個(gè)空行,因?yàn)椴涣艨招?,有些編譯器給警告】|root@192cl|#vihello.c#include<stdio.h>intmain()(printf(nhellocsd1007!\nM);#include"abc1'【把另一個(gè)文件的內(nèi)容插進(jìn)來(lái)】return0;}|root@192cl|#catabcprintf("大家好!\nM);printf("祝大家好運(yùn)!\nM);[root@192cl|#gcchello.c[root@192cl|#a.outhellocsdl007!大家好!祝大家好運(yùn)![root@192cl|#■基本數(shù)據(jù)類(lèi)型程序運(yùn)行時(shí),所有的數(shù)據(jù)都放在內(nèi)存中。為了使用起來(lái)方便,我們可以給某些內(nèi)存區(qū)域取一個(gè)名字,這就是所謂的變量。變量用來(lái)存放數(shù)據(jù),數(shù)據(jù)有不同的類(lèi)型,所以變量必須有類(lèi)型。int是整型;char是字符型;char"是字符數(shù)組,存放一組字符,不同于字符串,字符串是以\0為結(jié)束標(biāo)志的一組字符。定義了變量,這個(gè)變量就有了數(shù)據(jù),如果不給其賦值,里面存的就是垃圾數(shù)據(jù)。整型:int字符型:char實(shí)型:float,double【float一般精確到7位有效數(shù)字,double一般是15位】還有非標(biāo)準(zhǔn)的類(lèi)型:longdouble【有些編譯器不支持,精度能達(dá)到30多位】char類(lèi)型變量占1個(gè)字節(jié);int、long和float占4個(gè)字節(jié),double占8個(gè)字節(jié)。基本數(shù)據(jù)類(lèi)型羅列:char,unsignedchar【可以表示0?255】,signedchar【可以表示-128?127】(這兩個(gè)對(duì)字符本身沒(méi)有任何意義,主要是用來(lái)存放整數(shù)時(shí)用到),默認(rèn)的是,unsigned(int),(signed)int,short(int)【2個(gè)字節(jié)】,unsignedshort(int),signedshort(int).long(int),signedlong(int).unsignedlong(int),longlong【8個(gè)字節(jié)float,double,longdouble(無(wú)unsigned,實(shí)數(shù)總是可正可負(fù)的)。void(空類(lèi)型,不確定類(lèi)型,沒(méi)有用void定義的變量,它有其他用途)規(guī)定新類(lèi)型的方法:enum(枚舉),struct(結(jié)構(gòu)體),union(聯(lián)合體),array(數(shù)組),pointer(指針)。SD卡就是用4個(gè)字節(jié)設(shè)計(jì)的存儲(chǔ)容量,遺憾的是它設(shè)計(jì)的時(shí)候設(shè)成了有符號(hào)的,即存儲(chǔ)容量為:-231~23=(2G),但存儲(chǔ)容量是不可能為負(fù)的,所以SD卡最大容量就是2G。也有擴(kuò)展到4G的SD卡,但如果設(shè)備不支持?jǐn)U展的SD,也沒(méi)辦法識(shí)別。1P=1O24T;1T=1O24G;1G=1024M=1024*1024KB=1073741824字節(jié)=2種字節(jié);2G=231字節(jié)。■原碼與補(bǔ)碼整數(shù)在計(jì)算機(jī)中用二進(jìn)制來(lái)表示,最高位表示符號(hào)位,最高位為0表示非負(fù)數(shù),為1就表示是負(fù)數(shù)。比如一個(gè)字節(jié)有八位二進(jìn)制位:非負(fù)數(shù)可以表示出0?127,負(fù)數(shù)可以表示出-1~-128(因?yàn)闆](méi)有-0,所以多增加一個(gè),到-128)。如果是無(wú)符號(hào)的八位二進(jìn)制位,可以表示0?255。以前的計(jì)算機(jī)用原碼的方式存放數(shù)據(jù),比如-1,在計(jì)算機(jī)里表示為:10000001;但這種方法使得計(jì)算起來(lái)很麻煩。所以現(xiàn)在的計(jì)算機(jī)采用補(bǔ)碼的方式存數(shù)據(jù):非負(fù)數(shù)的補(bǔ)碼與原碼相同,負(fù)數(shù)的補(bǔ)碼是對(duì)應(yīng)的正數(shù)的原碼按位取反再加1,比如-1,它對(duì)應(yīng)的整數(shù)1的原碼為00000001,按位取反后11111110,再加1就是11111111。這樣在進(jìn)行運(yùn)算就簡(jiǎn)單了,比如-1+1,最高位的1溢出,結(jié)果就是0。如果知道一個(gè)負(fù)數(shù),比如11111111,將它按位取反再加1就可以知道它表示的是負(fù)幾。再比如10000000,就是-128。小數(shù)是按照指數(shù)形式存儲(chǔ)的,小數(shù)都會(huì)被化為數(shù)值乘以2的n次方,比如0.45*23,45叫做尾數(shù),3叫做階碼。整數(shù)的表示是精確的,小數(shù)的表示只能是近似的。比如10000個(gè)0.0001相加,結(jié)果可能不是1.0。一般也不直接比較兩個(gè)小數(shù)是否相等,一般用fabs(a-b)<le-5,fabs是取絕對(duì)值函數(shù)。[le-5或1E-5,表示1*10工e(E)之前必須有數(shù)字,之后的指數(shù)必須為整數(shù)】float存儲(chǔ)方式為:符號(hào)位(1位)+階碼(8位)+尾數(shù)(23位)。double存儲(chǔ)方式為:符號(hào)位(1位)+階碼(11位)+尾數(shù)(52位)?!鯝SCII碼每個(gè)字符都有自身對(duì)應(yīng)著的ASCII碼,如:'a'就是97(0x61),'b,是98,'z'是122(0x7a);'A'是65(0x41),'B'是66,'Z'是90(0x5a);*0'是48(0x30),T'是49,'9'是57(0x39);空格字符是32(0x20);回車(chē)字符\r是13;換行符\n是10;制表符\t是9。ASCII碼的范圍是0~127;ASCII碼為32及32以下的字符都是看不見(jiàn)的字符。ASCII碼為0的字符叫空字符,有個(gè)特殊的表示方式:'\0',它被賦予了特殊的含義:作為字符串的結(jié)束標(biāo)志。ASCIIvalueCharacterControlcharacterASCIIvalueCharacterASCIIvalueCharacterASCIIvalueCharacter000(null)NUL032(space)0643096001oSOH033I065A097a002STX034*066B098b003■ETX035*067C099c004EOT036$068D100d005AENQ037%069E101e006AACK038&070F102f007(beep)BEL039071G103g008DBS040(072H104h009(tab)HT041)073I105i010(linefeed)LFE.10741ion(home)VT043075K107k012(formfeed)FF044076L1081013(carriagereturn)CR045077MIOSmOHCSO046078NUOn015aSI0470790IIIo016ADLE0480080P112P017VDC1049108)Q113q0181DC20502082R114r019I!DC30513083S115s020ITDC40524084T1161021§NAK0535085U117u022MMSYN0546086V118V0231ETB0557087w119w024CAN0568088X120X0251EM0579089Y121y026SUB058090Z122z027?—ESC059091(1231028(cursorright)FS060<032\124029(cursorleft)GS061093!125i030(cursorup)RS062094A126031(cursordown)US063095-127a■常量與變量?內(nèi)存?程序的內(nèi)存使用?常量(不變的變量,放在內(nèi)存空間中,放進(jìn)去后就不允許改變了)?字面量(直接的數(shù)據(jù),如20,'x',"abc”:inta=l,a是變量,1是字面量)?變量?動(dòng)態(tài)內(nèi)存?變量的類(lèi)型(一個(gè)變量有類(lèi)型,名字和數(shù)值;一個(gè)變量的類(lèi)型、地址、名字終生不變)■變量與數(shù)據(jù)類(lèi)型?先聲明,后使用?C編譯器對(duì)變量聲明的處理編譯器會(huì)對(duì)聲明的變量規(guī)劃一塊內(nèi)存空間,在運(yùn)行時(shí)變量才真正得到空間。規(guī)劃的空間大小由變量類(lèi)型決定,與具體數(shù)值無(wú)關(guān)?!鲎兞颗c變量的size?變量都有類(lèi)型?變量在內(nèi)存中的大?。簊izeof(類(lèi)型),sizeof(變量),sizeof(數(shù)值),sizeof(表達(dá)式);返回的是字節(jié)數(shù);sizeof只關(guān)心類(lèi)型,不關(guān)心數(shù)值;sizeof(數(shù)值):數(shù)值如果寫(xiě)的是整數(shù),會(huì)被當(dāng)成int類(lèi)型;小數(shù)會(huì)被當(dāng)成double類(lèi)型。sizeof(表達(dá)式):只關(guān)心數(shù)據(jù)類(lèi)型,只會(huì)分析括號(hào)中的類(lèi)型,不會(huì)對(duì)括號(hào)中的內(nèi)容進(jìn)行運(yùn)算,只看如果算了最終會(huì)是什么類(lèi)型。如果寫(xiě)一個(gè)小數(shù),希望它是float類(lèi)型,就加個(gè)f,如3.14f;希望它是10ngdouble類(lèi)型的,就寫(xiě)成3.14L或3.141,但盡量用大寫(xiě),容易區(qū)分。整數(shù)也是一樣,比如35L,表示是longint類(lèi)型;35LL,表示是longlong類(lèi)型。C語(yǔ)言沒(méi)有專(zhuān)門(mén)用來(lái)表示真假的數(shù)據(jù)類(lèi)型,C語(yǔ)言用數(shù)值來(lái)表示真假,非零數(shù)值表示真,NULL、0、,\0'為假。反之,如果為真,就當(dāng)成數(shù)值1;如果為假,就當(dāng)成數(shù)值0?!鲱?lèi)型轉(zhuǎn)換c語(yǔ)言有自動(dòng)類(lèi)型提升機(jī)制。進(jìn)行運(yùn)算時(shí):char、short類(lèi)型都會(huì)提升成int類(lèi)型,float類(lèi)型會(huì)提升成double類(lèi)型再做運(yùn)算;int和unsignedint進(jìn)行混合運(yùn)算時(shí),首先將int轉(zhuǎn)換成unsignedint然后參與運(yùn)算;如果有整數(shù)和小數(shù)的混合運(yùn)算,整數(shù)會(huì)轉(zhuǎn)換成小數(shù)double。#include<stdio.h>intmain()(charc=0xcd;printf(,,%d,%x\n,',c,c);return0;[root@192c2]#a.out-51,ffffffcd 【帶符號(hào)擴(kuò)展,Oxcd的最高位為1,char提升為int時(shí),前面的24位都是1】■范例#include<stdio.h>intmain()(printf(Mhello,data!\nn);printf("aaa%ibbb%fccc%cddd\n,');return0;)|root@192cl|#gccprintf.c[root@192cl|#a.outhello,data!aaa-1075708976bbb0.000000ccc^ddd%:稱(chēng)為格式占位符,%打頭的都會(huì)依次被后面的數(shù)據(jù)代替。%i、%f、%(:都被別的數(shù)據(jù)代替了。|root@192cl|#viprintf.c改為: printf(naaa%ibbb%fccc%cddd\nn,l23,45.6,'a');[root@192cl|#gccprintf.c|root@192cl|#a.outhello,data!aaal23bbb45.600000cccaddd%1或%(1:int【i表示int;d表示十進(jìn)制】%hd或%15shortint/longint%u:unsignedint%(*或%£Hoat/double%c:char%§:,,字符串,,%,或%0:無(wú)符號(hào)的十六進(jìn)制/無(wú)符號(hào)的八進(jìn)制【自己寫(xiě)十六進(jìn)制數(shù)時(shí),加Ox,如0x2FA;八進(jìn)制,加0】%e:以指數(shù)的形式輸出浮點(diǎn)數(shù)%p:變量地址%g:float/double在f和e之間選擇一個(gè)較短格式輸出,去掉了尾隨的零#include<stdio.h>intmain()(printf(“十六進(jìn)制%x,八進(jìn)制%o\n”,763,763);return0;}|root@192cl|#a.out十六進(jìn)制21b,八進(jìn)制1373dayO2AM(變量常量)c的保留字auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,printf,register,return,scanf,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,while,...c變量名?變量名(identifier)只能使用字母,數(shù)字,或下劃線第一個(gè)字符必須是字母或下劃線(不能是數(shù)字,如5L,表示long型數(shù)值)中間不能斷開(kāi)不能是保留字,不能與全局函數(shù)和數(shù)據(jù)類(lèi)型同名C嚴(yán)格區(qū)分大小寫(xiě)(UNIX中 )使用易懂的變量名,最好能見(jiàn)名知意(一般是相關(guān)的英語(yǔ)單詞或者縮寫(xiě))長(zhǎng)度一般不要超過(guò)32個(gè)字符不單是變量名,所有需要自己起名的地方都需要遵守這樣的規(guī)則?!鰒i初始化文件vi的初始化文件是主目錄下的.exrc文件??梢栽趘i的編輯模式下用命令setall查看可以設(shè)置的所有東西。$vi?/.exrc:setall 選項(xiàng) aleph=224noiconnoshowcmdnoarabiciconstring=noshowfulltagarabicshapenoignorecasenoshowmatchnoallowrevinsiminsert=Oshowmodenoaltkeymapimsearch=Oshowtabline=lambiwidth=singleincludeexpr=sidescroll=0noautochdirnoincsearchsidescrolloff=0noautoindentindentexpr=nosmartcasenoautoreadnoinfercasenosmartindentnoautowritenoinsertmodenosmarttabnoautowriteallisprint=O,161-255softtabstop=0background=lightJoinspacesnospell Tnobackupkey=spellfile=backupcopy=autokeymap=spelllang=enbackupext=~keymodel=spellsugsest=bestbackupskip=/tmp/*keywordprg=mannosplitbelownobinarylangmap=nosplitrightnobomblangmenu=startoflinebufhidden=laststatus=lstatusline=—更多一一文件(E)編捐(E)查看Q)終端d)setnusetts=4setnu:設(shè)置顯示行號(hào);setts=4:設(shè)置一個(gè)tab鍵跑4個(gè)字符?!鲎兞柯暶魅魏巫兞吭谑褂弥氨仨氝M(jìn)行聲明。變量聲明類(lèi)似于下面這種形式:數(shù)據(jù)類(lèi)型變量名稱(chēng);比如:intx;也可以一次性聲明多個(gè)同類(lèi)型變量:floaty,z;對(duì)變量可以進(jìn)行初始化,也可以在之后對(duì)它賦值。早期的C編譯器有個(gè)規(guī)定:變量聲明必須放在最前面。但現(xiàn)在很多編譯器無(wú)此規(guī)定。|root@192c2|#viinit.c#include<stdio.h>intmain()(doubleincome;〃垃圾數(shù)據(jù)shortintpen,notebook;〃垃圾數(shù)據(jù)printf(Mpen=%hd,notebook=%hd\n",pen,notebook);printf(Mincome=%hd\n",123);return0;)[root@192c2|#gccinit.c|root@192c2|#a.outpen=-28684,notebook=38income=123|root@I92c2|#改為:printf(Mincome=%hd\nM,123.0);[root@192c2|#gccinit.c|root@192c2|#a.outpen=20468,notebook=200income=0|root@192c2|#viinit.c#include<stdio.h>intmain()(doubleincome; 〃垃圾數(shù)據(jù)shortintpen,notebook;〃垃圾數(shù)據(jù)intage=40;〃指定值初始化doublesalary=1234.56,weight=78.9; 〃指定值初始化printf(,,pen=%hd,notebook=%hd\n,',pen,notebook);printf(,'income=%lf\n'\income);printf(nage=%d\n",age);printf("salary=%lf,weight=%lf\nH,salary,weight);age=18;〃賦值,用的時(shí)候直接用名字,不用再加類(lèi)型printf(Mage=%d\nH,age);age=age-10;〃賦值printf("age=%d\n",age);return0;)|root@192c2|#gccinit.c|root@192c2|#a.outpen=10824,notebook=-16499income=0age=40salary=l234.560000,weight=78.900000age=18age=8|root@I92c2|#[root@192c2|#vitype.c#include<stdio.h>intmain()(intn=12345.6;doubled=1.5e3O;printf(nn=%d\nu,n);〃小數(shù)部分直接截?cái)鄍rintf(Mn=%f\nH,n); //變量n是整型數(shù)據(jù)return0;}[root@192c2|#gcctype.c|root@192c2|#a.outn=12345n=-0.020396[root@192c2|#

添加語(yǔ)句:1.5e30;〃會(huì)將數(shù)值轉(zhuǎn)換為int類(lèi)型(隱式轉(zhuǎn)換),結(jié)果會(huì)溢出printf(Mn=%d\n';n);|root@192c2|#gcctype.ctype.c:Infunction'main':type.c:9:警告:隱式常量轉(zhuǎn)換溢出|root@192c2|#a.outn=12345n=-0.007939n=2147483647〃實(shí)際是2G-1,2G用十六進(jìn)制表示就是7fffffff|root@192c2|#|root@192c2|#vitype.c#include<stdio.h>intmain()〃小數(shù)部分直接截?cái)唷ㄗ兞縩是整型數(shù)據(jù)〃強(qiáng)制轉(zhuǎn)換;這樣不會(huì)有警告〃類(lèi)型轉(zhuǎn)換轉(zhuǎn)換的是數(shù)值,不會(huì)改變變量類(lèi)型intn=12345.6;doubled=1.5e3O;printfC'n=%d\n';n);printf(Mn=%f\nM,n);n=(int)1.5e30;printf(Hn=%d\n",n);printf(Mn=%x\n';n);printf(,〃小數(shù)部分直接截?cái)唷ㄗ兞縩是整型數(shù)據(jù)〃強(qiáng)制轉(zhuǎn)換;這樣不會(huì)有警告〃類(lèi)型轉(zhuǎn)換轉(zhuǎn)換的是數(shù)值,不會(huì)改變變量類(lèi)型printf(Mdasdouble:%g\nn,d);printf(Mdasinteger:%d\nM,d);return0;[root@192c2|#geetype.c|root@192c2|#a.outn=12345n=-0.020396n=2147483647n=7fffffff-2147483648dasdouble:1.5e+30dasinteger:-348624465|root@192c2|#|root@192c2|#visizeof.c#include<stdio.h>intmain()(intn=10;printf(M%i\n\sizeof(int));printf("%i\n,',sizeof(n));printf(M%i\n\sizeof(n+5));printf(M***%i\nM,sizeof(n+5.5));//5.5為double類(lèi)型,最終是double類(lèi)型數(shù)據(jù),不會(huì)計(jì)算printf("%i\n”,sizeof(n=123));〃只關(guān)心數(shù)據(jù)類(lèi)型,不做計(jì)算,只會(huì)分析類(lèi)型printf(Mn=%i\nn,n);return0;}|root@192c2|#gccsizeof.c[root@192c2|#a.out4444n=10|root@192c2|#查看匯編代碼:[root@192c2|#gcc-Ssizeof.c|root@192c2|#Isa.c a.out const.clogic.c sizeof.ctype.caddress.cbits.c init.c ppmm.c|root@192c2|#rm-fa.out|root@192c2|#gccsizeof.s【可以直接編譯】[root@192c2|#a.out444***84n=10|root@192c2|#visizeof.s.file"sizeof.c".section.rodata.LCO:.string"%i\n”.LC1:.LC2:.string,'n=%i\nM.text.globlmain【全局main].typemain,?function[main的類(lèi)型是函數(shù)】main:leal4(%esp),%ecxsub1 $36,%espmovl$10,-8(%ebp)(對(duì)應(yīng)intn=10;]movl $4,4(%esp)movl $.LC0,(%esp)call printfmovl $4,4(%esp)movl $.LC0,(%esp)call printfmovl $4,4(%esp)movl $.LC0,(%esp)call printfmovl $&4(%esp)movl $.LC1,(%esp)call printfmovl $4,4(%esp)movl $.LC0,(%esp).identnGCC:(GNU)4.1.220080704(RedHat4.1.2-54)”.section .note.GNU-stack,,,n,@progbits■常量常量與常量的數(shù)據(jù)類(lèi)型constdoublePI=3.14;(加const就表示變量是不可變的,常量必須給其初始值)const類(lèi)型名字=初始值:或類(lèi)型const名字=初始值;常量一般用大寫(xiě)字母?!鯿onst限定符?限定一個(gè)常量或者函數(shù)?方便編譯器來(lái)檢測(cè)非法的修改操作#include<stdio.h>#defineCLASS,,csdlOO7H〃預(yù)處理,宏定義,遇到CLASS就替換成"csdlOO7”#defineDATE20100730〃遇到DATE就替換成20100730#defineAAPI#defineBB10+student_numintmain()(constdoublePI=3.14;〃定義成常量后,以后若想改動(dòng)該值,只需在此處改intconststudent_nuin=40;printf(nPI=%g,student_num=%d\n'\PI,student_num);//PI=3.15; 〃會(huì)出現(xiàn)編譯錯(cuò)誤或者警告printf(n%s,%d\n”,CLASS,DATE); 〃編譯前,先經(jīng)過(guò)預(yù)處理printf(M%g\n'\AA*BB);//157?71.4?換為:PI*10+student_numconstdoubleaa=PI;constintbb=1()+student_num;printf("%g\n",aa*bb);//157return0;)|root@192c2|#a.outPI=3.14,student_num=40csdl007,2010073071.4157|root@192c2|#gcc-Econst.c>const.i|root@192c2|#gccconst.i[可以直接編譯】|root@192c2|#a.outPI=3.14,student_num=40csdl007,2010073071.4157|root@192c2|#>dayO2PM(運(yùn)算符)■表達(dá)式的左值與右值簡(jiǎn)單的說(shuō),左值就是放在等號(hào)左邊的值。左值就是變量或者結(jié)果是變量的式子(如前++、前一、賦值)。右值就是放在等號(hào)右邊的值?!鏊銛?shù)運(yùn)算符算術(shù)運(yùn)算符是包括c語(yǔ)言在內(nèi)的許多編程語(yǔ)言都廣泛使用的一種運(yùn)算符。這類(lèi)運(yùn)算符包括:+-*/%(取余)。(1)運(yùn)算符/可能產(chǎn)生意外的結(jié)果:當(dāng)兩個(gè)操作數(shù)都是整數(shù)的時(shí)候,運(yùn)算符/會(huì)丟掉分?jǐn)?shù)部分來(lái)”截取“結(jié)果。如想得到小數(shù),可以在前面乘以1.0,如1.0*a/b,不要寫(xiě)成a/b*1.0,因?yàn)橄人鉧/b,此時(shí)已經(jīng)丟掉了小數(shù)部分,也可以寫(xiě)成(double)a/b,把a(bǔ)的值強(qiáng)制轉(zhuǎn)換。(2)%要求操作數(shù)都為整數(shù),如果其中一個(gè)不是整數(shù),編譯將無(wú)法通過(guò)。(3)0不能做除數(shù),不能對(duì)0進(jìn)行取余運(yùn)算。(4)兩個(gè)整數(shù)相除,取結(jié)果的整數(shù)部分。(5)-1%2=-1;-1/2=0。這里,我們?cè)僖雰赏獾囊粋€(gè)概念:加法運(yùn)算符需要兩個(gè)操作數(shù),所以它屬于二元運(yùn)算符,只需要一個(gè)操作數(shù)的運(yùn)算符稱(chēng)為一元運(yùn)算符?!鲑x值運(yùn)算符求出表達(dá)式的數(shù)值之后,常常需要將其存儲(chǔ)到變量中,以便將來(lái)使用。我們知道一般的運(yùn)算符不會(huì)改變操作數(shù)的值,而C語(yǔ)言提供的=運(yùn)算符可以用于此目的。另外,賦值運(yùn)算還有右結(jié)合性。賦值運(yùn)算可以分為兩種:(1)簡(jiǎn)單賦值inti,j;i=j=100;串在一起賦值inti;floatf;f=(i=2.3);可能產(chǎn)生非預(yù)期的結(jié)果。(2)復(fù)合賦值利用變量原來(lái)的數(shù)值經(jīng)過(guò)一系列的計(jì)算之后再賦值給這個(gè)變量的操作叫做復(fù)合賦值。i=i+2;可以寫(xiě)成i+=2;n=n?3;可以寫(xiě)成n?=3;a=aAb;可以寫(xiě)成aA=b:-=*=/=%=&=|=?=...【所有的數(shù)學(xué)運(yùn)算和雙目的位運(yùn)算都可以這樣寫(xiě)】注意:不要交換兩個(gè)運(yùn)算符的位置i+=2;不要寫(xiě)成i=+2;關(guān)系運(yùn)算符C語(yǔ)言中的關(guān)系運(yùn)算符和數(shù)學(xué)上的<、>、<=和>=運(yùn)算符相對(duì)應(yīng),只是用在C語(yǔ)言的表達(dá)時(shí)產(chǎn)生的結(jié)果是0(假)或者1(真)。關(guān)系運(yùn)算符可以用于比較整數(shù)和浮點(diǎn)數(shù),也允許比較混合類(lèi)型的操作數(shù)。10<11:邏輯結(jié)果成立(真1);1K10:不成立(假0)。注意:(1)關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算數(shù)運(yùn)算符(2)我們?cè)跀?shù)學(xué)上可以這樣表達(dá):而在C語(yǔ)言里:i<j<k也是合法的,但是可能不是你所期望的含義,因?yàn)椤炊际亲蠼Y(jié)合的。所以:(i<j)<k,如果括號(hào)里的為真,即i<j,則變?yōu)閘<k;正確的寫(xiě)法為:i<j&&j<k.判等運(yùn)算符C語(yǔ)言中表示關(guān)系運(yùn)算符的符號(hào)與其他許多編程語(yǔ)言中的相同,但是判等運(yùn)算符卻有著獨(dú)一無(wú)二的形式:==等于(數(shù)學(xué)=)!=不等于注意:等于不要漏掉等號(hào),if(15==data);判等運(yùn)算符的優(yōu)先級(jí)低于關(guān)系運(yùn)算符,i<(j==x)<k?邏輯運(yùn)算符邏輯運(yùn)算符所產(chǎn)生的結(jié)果是:邏輯結(jié)果,。或者I,當(dāng)然操作數(shù)的數(shù)值經(jīng)常是1或者0,所以邏輯運(yùn)算符將任何非零操作數(shù)作為真值來(lái)處理,同時(shí)將任何的零值操作數(shù)作為假值來(lái)處理。&&邏輯與II邏輯或!邏輯非運(yùn)算規(guī)則:!表達(dá)式【對(duì)表達(dá)式取反】表達(dá)式1&&表達(dá)式2表達(dá)式1表達(dá)式2結(jié)果真真真真假假假真假假假假表達(dá)式111表達(dá)式2TOC\o"1-5"\h\z表達(dá)式1表達(dá)式2結(jié)果真 真 真真 假 真假 真 真假 假 假短路特性:表達(dá)式1&&表達(dá)式2:如果表達(dá)式1為假就不會(huì)進(jìn)行表達(dá)式2的計(jì)算;表達(dá)式1||表達(dá)式2: 如果表達(dá)式1為真就不會(huì)進(jìn)行表達(dá)式2的計(jì)算。另外一個(gè)短路運(yùn)算符:?:#include<stdio.h>intmain()(inta=3,b=5;printf(M%d,%d,%d\nu,a<=b,a>=b,a>=3);a=-3;printf(H%d,%d\n'\a>=0&&a<=100,0<=a<=100);printf(M%d,%d\n'\a<0||a>100,b<0||b>100);inty=2010;printf(M%d\nM,!(y%4==0&&y%100!=0||y%400==0));return0;[root@192c2|#a.out0,11,0■位運(yùn)算位運(yùn)算有這樣的特性:參加位運(yùn)算的操作數(shù)轉(zhuǎn)換二進(jìn)制?按位取反?200000000000000000000000000001010011111111111111111111111111101011可以發(fā)現(xiàn):20按位取反是-21,3按位取反是-4,4按位取反是.5;n按位取反是-(n+1)。-1按位取反是0,-3按位取反是2。?按位與經(jīng)常用來(lái)屏蔽某些二進(jìn)制位(置0)。也可以知道一個(gè)數(shù)的某一位是1還是0。3&5:-00000011-00000101… 0001將某位置0:-00011011―11110111-00010011想知道某位是1還是0:-00010111-00000100-00000100如果它=0,就意味著那位是0,如果不=0,就是1。?按位或經(jīng)常用來(lái)將某些二進(jìn)制位置1,也可以知道某個(gè)二進(jìn)制位是1還是0。1與誰(shuí)按位或就是1;0與誰(shuí)按位或就是誰(shuí)。1|x=l;0|x=Xo3|5-00000011-00000101-00000111將某位置1:-00011011-00000100-00011111想知道某位是1還是0:-00010111-11111011-11111111如果它-“11111111,就意味著那位是1,如果不等,就是0。按位異或可以用來(lái)將指定的位反轉(zhuǎn)。【1與。異或是1,1與1異或是0。]運(yùn)算規(guī)則:對(duì)應(yīng)的二進(jìn)制位上的數(shù)字相同,則結(jié)果為0;否則為1。3A5-00000011-00000101-00000110經(jīng)典程序:inta=X,b=Y;a=aAb;[a=XAY]b=aAb;[b=XAYAY=X]a=aAb;[a=XAYAX=XAXAY=Y;位運(yùn)算符可以交換順序】則a=Y,b=X?左移整數(shù)<<k位(可以是變量或表達(dá)式)【對(duì)于小數(shù)左移右移沒(méi)有意義】10100101?101001010左移的時(shí)候右邊的空位補(bǔ)零。右移10100101?1右移的時(shí)候左邊空位全補(bǔ)上符號(hào)位。正數(shù):左移一位相當(dāng)于乘以2,右移一位相當(dāng)于除以2。左移兩位相當(dāng)于乘以22,右移兩位相當(dāng)于除以22。#include<stdio.h>intmain()(printfC,%d,%d,%d\n",-20,-1,-0);unsignedintn="l;printf(M%u,%x,%d\n0,n,n,n);intm=-l;printf(H%x,%x\nn,n?3,m?3); [n>m的值并沒(méi)改變】printf(M%x,%x\n';n,m);printf(M%x,%x\nM,n?3,m?3);m=200;printf(M%d,%d\nH,m?3,m?3);m=0x3862517b;【一個(gè)整數(shù)有4個(gè)字節(jié),現(xiàn)在想取出某個(gè)字節(jié)的內(nèi)容】printf(M%x\nM,(char)m);printf(,'%x\nM,(char)(m?16));inta=0x12,b=0x34,c=0x56,d=0x78;printf(,'%x\n,\(a?24)|(b?16)|(c?8)|d);return0;|root@192c2|#geebits.c|root@192c2|#a.out-21,0,fTfffTff,-1IffTffff,ffffffffffffffff,fffffffffffffffB,fffffffB1600,257b6212345678|root@192c2|#取地址運(yùn)算符1>&運(yùn)算符取地址(取變量或常量的地址,此處的常量指的是const定義的常量)。2>*根據(jù)地址取變量或常量(如*&a就是a變量的值)。3>printf中的%p用來(lái)輸出地址。4>取地址取得的是一個(gè)變量的開(kāi)始地址。5>地址是按字節(jié)編號(hào)的?!龆禾?hào)運(yùn)算符逗號(hào)在很多地方是作分隔符的,但有時(shí)也用來(lái)做運(yùn)算符。一般形式:表達(dá)式1,表達(dá)式2,表達(dá)式3,…,表達(dá)式n求解過(guò)程:先求解表達(dá)式1,再計(jì)算表達(dá)式2,…,最后計(jì)算表達(dá)式n,整個(gè)逗號(hào)表達(dá)式的值是表達(dá)式n的值。#include<stdio.h>intmain()(inta;intb;printf(n&a=%p,&b=%p\nH,&a,&b);(*&a)=100;(*&b)=888888;printf(Ha=%d,b=%d\nM,a,b);printf(,,%d\n'\(a=123,b=a+45));printf(,,%d\n'\(b,a));return0;|root@192c2|#geeaddress.c|root@192c2|#a.out&a=0xbfefdea0,&b=0xbfefde9ca=100,b=888888168123|root@192c2|#■條件運(yùn)算符表達(dá)式1?表達(dá)式2:表達(dá)式3它是C語(yǔ)言中唯一的一個(gè)三元運(yùn)算符。先求解表達(dá)式1,若其值為真(非0),則將表達(dá)式2的值作為整個(gè)表達(dá)式的取值,否則將表達(dá)式3的值作為整個(gè)表達(dá)式的取值。取a的絕對(duì)值:a<0?-a:a?!鲎栽?自減運(yùn)算自增和自減運(yùn)算是最常用于變量的兩種運(yùn)算符。當(dāng)然,可以通過(guò)下面的方式來(lái)完成操作:i=i+l;j=j-l;復(fù)合賦值可以將上面的語(yǔ)句縮短一些: i+=l; j-=l;C語(yǔ)言中,允許使用自增(++)和自減(-)將上面的這些語(yǔ)句變得更短些。i=i+l;i+=l;i++;//++i;前綴:++i-i先運(yùn)算后使用后綴:i++i-先使用后運(yùn)算;注意:在同一個(gè)表達(dá)式中,不要對(duì)同一個(gè)變量進(jìn)行多次自增或者自減運(yùn)算。<2>++/-可以用于浮點(diǎn)數(shù)的計(jì)算,很少見(jiàn)。范例:inta=99;printf(M%d\nM,a++);過(guò)程分析:先將a的值保存到某位置1,然后算a=a+1,最后打印出位置1的值。可以理解成:a++的結(jié)果是a原來(lái)的舊值,然后a=a+l。#include<stdio.h>intmain()(inta,b,c,d;a=b=c=d=O;a++;++b;printf(M%d,%d\nu,a,b);printf(M%d,%d\nM,C++,++d);〃后++與前++return0;|root@192c2|#a.out1,10,1|root@192c2|##include<stdio.h>intmain()|inta=0;intb=0;printf(n%d%d%d\nM,b=a+++(a+++2),b,a=b++);printf(M%d%d\nn,a,b);return0;}|root@192c2|#a.out22022[root@192c2|#分析:printf(n%d%d%d\nM,b=a+++(a+++2),b,a=b++);一般來(lái)說(shuō),會(huì)從右往左依次計(jì)算,但中間有個(gè)b沒(méi)有參與運(yùn)算,暫時(shí)跳過(guò),先計(jì)算a=b++,再計(jì)算b=a+++(a+++2)。先運(yùn)算a=b,此時(shí)a=0,然后把a(bǔ)保存到某位置1中;再算b=b+l;再計(jì)算b=a+a+2,此時(shí)b=2,然后把b保存到某位置2中;再算++a、++a,此時(shí)a=2;再把b保存到某位置3中;最后:printf(M%d%d%d\nn,位置2,位置3,位置1);查看匯編代碼:|root@192c2|#gcc-Sa.c[root@192c2|#via.s.file"a.c''.section .rodata.LCO:.string"%d%d%d\nM.LC1:.string"%d%d\nH.text.globlmain.typemain,?functionmain:leal4(%esp),%ecxandl$-16,%esppushl-4(%ecx)

pushl%ebpmovl%esp,%ebppushl%ecxsubl$36,%espmovl$0,-12(%ebp)[-12(%ebp)是a,此時(shí)a=0]movl$0,-8(%ebp)1?8(%ebp)是b,此時(shí)b=0]movl-8(%ebp),%eax【把b放到%eax中】movl%eax,-12(%ebp)[a=b,此時(shí)a=b=O]movl-12(%ebp),%edx【把a(bǔ)放到%edx中,%edx=O]addl$l,-8(%ebp)[b=b+l,b=l]movl-12(%ebp),%eax【把a(bǔ)放到%eax中】add!$2,%eax[a+2]addl-12(%ebp),%eax[a+a+2]movl%eax,-8(%ebp)[b=a+a+2,b=2]movl-8(%ebp),%ecx【把b放到%ecx中,%ecx=2]addl$l,-12(%ebp)[a=a+l9a=l]addl$l,-12(%ebp)[a=a+La=2]movl%edx,12(%esp)【把。放到12(%esp)中】movl-8(%ebp),%eax【把b放到%eax中,%eax=2]movl%eax,8(%esp)【把2放到8(%esp))中,8(%esp)=2]movl%ecx,4(%esp)【把2放到4(%e§p)中,4(%esp)=2]movlS.LCO,(%esp)callprintfmovl-8(%ebp),%eaxmovl%eax,8(%esp)movl-12(%ebp),%eaxmovl%eax,4(%esp)movl$.LCl,(%esp)callprintfmovl$0,%eaxadd!$36,%esppopl%ecxpop1%ebpleal-4(%ecx),%esp.sizemain,.-main.identMGCC:(GNU)4.1.220080704(RedHat4.1.2-54)M.section.note.GNU-stack,nM,@progbits

■運(yùn)算符與結(jié)合性?xún)?yōu)先級(jí)運(yùn)算符含義要求運(yùn)算對(duì)象的個(gè)數(shù)結(jié)合方向1()圓括號(hào)自左至右[]下標(biāo)運(yùn)算符->指向結(jié)構(gòu)體成員運(yùn)算符?給構(gòu)體成員運(yùn)算符21邏輯非運(yùn)算符1(單目運(yùn)算符)自右至左按位取反運(yùn)算符++自增運(yùn)算符—自減運(yùn)算符—負(fù)號(hào)運(yùn)算符(類(lèi)型)類(lèi)型轉(zhuǎn)換運(yùn)算符?指針運(yùn)算符&.取地址運(yùn)算符siaeof長(zhǎng)度運(yùn)算符3.乘法運(yùn)算符2(雙目運(yùn)算符)自左至右/除法運(yùn)算符%求余運(yùn)算符4十加法運(yùn)算符2(雙目運(yùn)算符)自左至右一城法運(yùn)算符5?左移運(yùn)算符2(雙目運(yùn)算符)自左至右?右移運(yùn)算符6<<=>>=關(guān)系運(yùn)算符2(雙目運(yùn)算符)自左至右

優(yōu)先級(jí)運(yùn)算符含義要求運(yùn)算對(duì)象的個(gè)數(shù)結(jié)合方向7==等于運(yùn)算符2(雙目運(yùn)算符)自左至右1=不等于運(yùn)算符8&按位與運(yùn)算符2(雙目運(yùn)算符)自左至右9A按位異或運(yùn)算符2(雙目運(yùn)算符)自左至右101按位或運(yùn)算符2(雙目運(yùn)算符)自左至右11&&邏輯與運(yùn)算符2(雙目運(yùn)算符)自左至右12II邏輯或運(yùn)算符2(雙目運(yùn)算符)自左至右13??條件運(yùn)算符3(三目運(yùn)算符)自右至左14=+=—=*=/=%=>>=<<=A=:=賦值運(yùn)算符2(雙目運(yùn)算符)自右至左15逗號(hào)運(yùn)算符(及序求值運(yùn)算符)自左至右>dayO3AM(格式化輸入控制語(yǔ)句)■scanf()從鍵盤(pán)輸入scanf一格式化輸入,根據(jù)指定的格式讀取輸入。scanf(“格式字符串”,地址列表);scanf(',%f%f%f',&sl,&s2,&s3);【輸

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論