起源與概括
1973年,為了Unix系統(tǒng)魄眉,貝爾實驗室發(fā)明砰盐。標(biāo)準(zhǔn)化兩個:C89(也就是ISO C90)和C99。C語系有:C++坑律、Java岩梳、perl、C#等晃择。特點:底層(與硬件接觸)冀值、小型(有限的語言特性;依賴標(biāo)準(zhǔn)函數(shù)庫)宫屠、包容性等列疗。
主函數(shù)main函數(shù)有且只能有一個,c89默認(rèn)返回值是int浪蹂,c99中規(guī)定必須寫成int man()相對應(yīng)有了return 0抵栈。用/* */注釋的時候,系統(tǒng)會自動從/*開始坤次,遇到下一個*/結(jié)束古劲,所以中間出現(xiàn)*是沒有問題的(引申各種格式的注釋,包括盒子一樣的)缰猴。
五大類型:基本數(shù)據(jù)類型产艾、構(gòu)造數(shù)據(jù)類型、指針類型滑绒、空闷堡、自定義類型。
三大結(jié)構(gòu):順序結(jié)構(gòu)疑故、選擇結(jié)構(gòu)杠览、循環(huán)結(jié)構(gòu)。
位操作
&按位與纵势,|或倦零,~取反误续,^異或吨悍,<<左移扫茅,>>右移
位操作都是針對二進(jìn)制進(jìn)行,假設(shè)原來的數(shù)為a育瓜,取反相當(dāng)于-1-a葫隙,移動如a<<n,左移n位躏仇。移動時恋脚,低位補0,高位移出焰手。
應(yīng)用:數(shù)據(jù)交換糟描、異或?qū)崿F(xiàn)文件加密(一次加密,二次解密)书妻。
變量與字符
變量是內(nèi)存中的一片空間船响,有名字及類型,類型決定了變量在內(nèi)存中空間的大小躲履,名稱可以是字母见间、數(shù)字和下劃線的組合,開頭第一個字符不能是數(shù)字工猜。且不能是C中的關(guān)鍵詞米诉,如int、if篷帅、struct之類史侣,C中區(qū)分大小寫,如是INT等就可以魏身。定義(類型 名稱)→賦值(assign惊橱,賦值符=)。
基本類型:
計算機(jī)基本的計算單位是字節(jié)(Bytes)叠骑,每個字節(jié)是8個二進(jìn)制的位(bit)李皇。
1. 整型與字符型
除了整型外,其余定義的時候宙枷,int可以省略掉房,如 long long a。unsigned開頭的慰丛,代表無符號卓囚,即非負(fù),里面所有的d替換成u進(jìn)行輸入輸出诅病。如果要顯示02這種格式哪亿,可以用%.2d粥烁,如果沒有小數(shù)點,輸出的會有兩個字符蝇棉,但其中一個是空格讨阻,%-表示左對齊。
整數(shù)在實際保存的時候篡殷,是按照二進(jìn)制保存钝吮。但賦值的時候有三種方式:十進(jìn)制(平時的寫法)、八進(jìn)制(數(shù)字0開頭)和十六進(jìn)制(0x開頭)板辽。在輸出時:十進(jìn)制是d奇瘦,八進(jìn)制是#o,十六進(jìn)制是#x(如果是X劲弦,表示輸入或者輸出的時候耳标,里面的字母是大寫的),#表示顯示前綴,沒有則不顯示邑跪。
char字符型次坡,單個字符(1個字節(jié)),包括字母單個數(shù)字空格等字符呀袱。ASCII碼中贸毕,’A’的編碼是65,’a’是97夜赵。中文字符是字符串明棍,10也已經(jīng)是字符串了(所以之前看到的一個定義紙牌上從A到K,用的是二維數(shù)組而不是一維)寇僧。
2. 浮點型
可以用科學(xué)計數(shù)法表示數(shù)據(jù)浮點數(shù)摊腋,永遠(yuǎn)無法精確表示。float是四個字節(jié)嘁傀,double是八個兴蒸,long double是16個。
%g用來輸出實數(shù)细办,它根據(jù)數(shù)值的大小橙凳,自動選f格式或e格式(選擇輸出時占寬度較小的一種),且不輸出無意義的0笑撞。即%g是根據(jù)結(jié)果自動選擇科學(xué)記數(shù)法還是一般的小數(shù)記數(shù)法岛啸。%f默認(rèn)保留6位小數(shù),要制定保留的小數(shù)位數(shù)茴肥,用%.nf坚踩,n為要保留的位數(shù)。
注意瓤狐,a=.123, b=5e6是有意義的賦值語句瞬铸。另外批幌,scanf函數(shù)會跳過空白字符(white-space,包括空格嗓节、橫向和縱向制表符荧缘、換頁符和換行符)根據(jù)格式來匹配讀數(shù)。
備注(C的32個關(guān)鍵詞赦政,我按照自己的方式分了個類胜宇, 注意,main不是關(guān)鍵詞):
int, long, short, unsigned, signed, float, double, char, void, struct, union, enum, typedef, sizeof
if, else, do, while, switch, case, default, break, continue, goto, for, return
auto, extern, static, register, const, volatile
特殊字符
\n換行 \r回車(本行的行首) \t制表符(若干空格) \b退格符 \轉(zhuǎn)義符 %占位符 &取地址符
\轉(zhuǎn)義符:特殊符號的打印如雙引號”恢着、斜線,在前面加上\财破,百分號打印的時候是%%
%叫做占位符掰派,在標(biāo)準(zhǔn)化輸入輸出的時候,會先預(yù)留空間左痢,用后面的來替換靡羡。
scanf(“%*[^\n]”);從輸入緩沖區(qū)清空一行內(nèi)容(%*指跳過,后面的是指非換行符俊性,即一直跳過直到遇到換行符\n)
類型強(qiáng)轉(zhuǎn)換
C語言是弱類型的略步,類型不同的運算會先轉(zhuǎn)換成相同的類型再進(jìn)行。在使用強(qiáng)制轉(zhuǎn)換時應(yīng)注意以下問題:
1定页、類型說明符和表達(dá)式都必須加括號趟薄,如把(int)(x/2+y)寫成(int)x/2+y則成了把x/2轉(zhuǎn)換成int型之后再與y相加了。
2典徊、轉(zhuǎn)換后不會改變原數(shù)據(jù)的類型及變量值杭煎,只在本次運算中臨時轉(zhuǎn)換。
3卒落、強(qiáng)制轉(zhuǎn)換后的運算結(jié)果不遵循四舍五入原則羡铲。
?局部變量(local variable)和外部變量(即全局變量external variable)
函數(shù)中,一般是局部變量儡毕,static靜態(tài)存儲也切,只能賦值一次,程序執(zhí)行返回腰湾,不會丟失值雷恃。全局變量也有靜態(tài)存儲期限,且在文件中的作用域從變量聲明到閉合文件的末尾檐盟。
運算符(Operator)
優(yōu)先級最高的是()褂萧,最低的是賦值符號=(包括了*=、+=葵萎、-=导犹、/=唱凯、%=,但不包括自增++和自減--)谎痢。單目(正負(fù)號磕昼、自增自減、非)的優(yōu)先級大于雙目(四則運算节猿、大小比較票从、等于不等于、且或)大于三目(條件判斷?是:不是)滨嘱。
對于模運算峰鄙,即取余%,該運算只適合用兩個整數(shù)進(jìn)行取余運算太雨,且最后的結(jié)果取決于%前面的數(shù)吟榴,即取決于被模數(shù)的符號。
對于除法運算/囊扳,結(jié)果和參與運算的數(shù)類型相同吩翻,所以9/2會只得到整數(shù)部分4,float就可以得到結(jié)果锥咸。兩數(shù)中有一個為小數(shù)狭瞎,結(jié)果則為小數(shù),如:9.0/2 = 4.500000搏予。
比較運算的結(jié)果是邏輯值熊锭,結(jié)果為0或者1,邏輯運算符可以簡寫缔刹,如&&寫成&球涛,||寫成|纪吮,但寫兩個運算效率高些——因為在&&的情況下梢灭,有短路特性勺远,即如果已經(jīng)得知結(jié)果跨细,不會去繼續(xù)蚣录。
自增自減運算符仁卷,a++先參與運算后+1错邦,++a先+1后參與運算垂谢。(這里面包括輸出函數(shù)中的情況引谜,但有時候例如a+++a+++a++這種牍陌,結(jié)果取決于編譯器)
賦值運算的時候,左值不能是常數(shù)员咽、字面值(字符串等)和臨時值(如a+b)毒涧。