起源與概括
1973年,為了Unix系統(tǒng),貝爾實(shí)驗(yàn)室發(fā)明。標(biāo)準(zhǔn)化兩個(gè):C89(也就是ISO C90)和C99。C語(yǔ)系有:C++、Java、perl、C#等。特點(diǎn):底層(與硬件接觸)、小型(有限的語(yǔ)言特性;依賴標(biāo)準(zhǔn)函數(shù)庫(kù))、包容性等。
主函數(shù)main函數(shù)有且只能有一個(gè),c89默認(rèn)返回值是int,c99中規(guī)定必須寫(xiě)成int man()相對(duì)應(yīng)有了return 0。用/* */注釋的時(shí)候,系統(tǒng)會(huì)自動(dòng)從/*開(kāi)始,遇到下一個(gè)*/結(jié)束,所以中間出現(xiàn)*是沒(méi)有問(wèn)題的(引申各種格式的注釋?zhuān)ê凶右粯拥模?/p>
五大類(lèi)型:基本數(shù)據(jù)類(lèi)型、構(gòu)造數(shù)據(jù)類(lèi)型、指針類(lèi)型、空、自定義類(lèi)型。
三大結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。
位操作
&按位與,|或,~取反,^異或,<<左移,>>右移
位操作都是針對(duì)二進(jìn)制進(jìn)行,假設(shè)原來(lái)的數(shù)為a,取反相當(dāng)于-1-a,移動(dòng)如a<<n,左移n位。移動(dòng)時(shí),低位補(bǔ)0,高位移出。
應(yīng)用:數(shù)據(jù)交換、異或?qū)崿F(xiàn)文件加密(一次加密,二次解密)。
變量與字符
變量是內(nèi)存中的一片空間,有名字及類(lèi)型,類(lèi)型決定了變量在內(nèi)存中空間的大小,名稱(chēng)可以是字母、數(shù)字和下劃線的組合,開(kāi)頭第一個(gè)字符不能是數(shù)字。且不能是C中的關(guān)鍵詞,如int、if、struct之類(lèi),C中區(qū)分大小寫(xiě),如是INT等就可以。定義(類(lèi)型 名稱(chēng))→賦值(assign,賦值符=)。
基本類(lèi)型:
計(jì)算機(jī)基本的計(jì)算單位是字節(jié)(Bytes),每個(gè)字節(jié)是8個(gè)二進(jìn)制的位(bit)。

1. 整型與字符型
除了整型外,其余定義的時(shí)候,int可以省略,如 long long a。unsigned開(kāi)頭的,代表無(wú)符號(hào),即非負(fù),里面所有的d替換成u進(jìn)行輸入輸出。如果要顯示02這種格式,可以用%.2d,如果沒(méi)有小數(shù)點(diǎn),輸出的會(huì)有兩個(gè)字符,但其中一個(gè)是空格,%-表示左對(duì)齊。
整數(shù)在實(shí)際保存的時(shí)候,是按照二進(jìn)制保存。但賦值的時(shí)候有三種方式:十進(jìn)制(平時(shí)的寫(xiě)法)、八進(jìn)制(數(shù)字0開(kāi)頭)和十六進(jìn)制(0x開(kāi)頭)。在輸出時(shí):十進(jìn)制是d,八進(jìn)制是#o,十六進(jìn)制是#x(如果是X,表示輸入或者輸出的時(shí)候,里面的字母是大寫(xiě)的),#表示顯示前綴,沒(méi)有則不顯示。
char字符型,單個(gè)字符(1個(gè)字節(jié)),包括字母單個(gè)數(shù)字空格等字符。ASCII碼中,’A’的編碼是65,’a’是97。中文字符是字符串,10也已經(jīng)是字符串了(所以之前看到的一個(gè)定義紙牌上從A到K,用的是二維數(shù)組而不是一維)。
2. 浮點(diǎn)型
可以用科學(xué)計(jì)數(shù)法表示數(shù)據(jù)浮點(diǎn)數(shù),永遠(yuǎn)無(wú)法精確表示。float是四個(gè)字節(jié),double是八個(gè),long double是16個(gè)。
%g用來(lái)輸出實(shí)數(shù),它根據(jù)數(shù)值的大小,自動(dòng)選f格式或e格式(選擇輸出時(shí)占寬度較小的一種),且不輸出無(wú)意義的0。即%g是根據(jù)結(jié)果自動(dòng)選擇科學(xué)記數(shù)法還是一般的小數(shù)記數(shù)法。%f默認(rèn)保留6位小數(shù),要制定保留的小數(shù)位數(shù),用%.nf,n為要保留的位數(shù)。
注意,a=.123, b=5e6是有意義的賦值語(yǔ)句。另外,scanf函數(shù)會(huì)跳過(guò)空白字符(white-space,包括空格、橫向和縱向制表符、換頁(yè)符和換行符)根據(jù)格式來(lái)匹配讀數(shù)。
備注(C的32個(gè)關(guān)鍵詞,我按照自己的方式分了個(gè)類(lèi), 注意,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回車(chē)(本行的行首) \t制表符(若干空格) \b退格符 \轉(zhuǎn)義符 %占位符 &取地址符
\轉(zhuǎn)義符:特殊符號(hào)的打印如雙引號(hào)”、斜線,在前面加上\,百分號(hào)打印的時(shí)候是%%
%叫做占位符,在標(biāo)準(zhǔn)化輸入輸出的時(shí)候,會(huì)先預(yù)留空間,用后面的來(lái)替換。
scanf(“%*[^\n]”);從輸入緩沖區(qū)清空一行內(nèi)容(%*指跳過(guò),后面的是指非換行符,即一直跳過(guò)直到遇到換行符\n)
類(lèi)型強(qiáng)轉(zhuǎn)換
C語(yǔ)言是弱類(lèi)型的,類(lèi)型不同的運(yùn)算會(huì)先轉(zhuǎn)換成相同的類(lèi)型再進(jìn)行。在使用強(qiáng)制轉(zhuǎn)換時(shí)應(yīng)注意以下問(wèn)題:
1、類(lèi)型說(shuō)明符和表達(dá)式都必須加括號(hào),如把(int)(x/2+y)寫(xiě)成(int)x/2+y則成了把x/2轉(zhuǎn)換成int型之后再與y相加了。
2、轉(zhuǎn)換后不會(huì)改變?cè)瓟?shù)據(jù)的類(lèi)型及變量值,只在本次運(yùn)算中臨時(shí)轉(zhuǎn)換。
3、強(qiáng)制轉(zhuǎn)換后的運(yùn)算結(jié)果不遵循四舍五入原則。
?局部變量(local variable)和外部變量(即全局變量external variable)
函數(shù)中,一般是局部變量,static靜態(tài)存儲(chǔ),只能賦值一次,程序執(zhí)行返回,不會(huì)丟失值。全局變量也有靜態(tài)存儲(chǔ)期限,且在文件中的作用域從變量聲明到閉合文件的末尾。
運(yùn)算符(Operator)
優(yōu)先級(jí)最高的是(),最低的是賦值符號(hào)=(包括了*=、+=、-=、/=、%=,但不包括自增++和自減--)。單目(正負(fù)號(hào)、自增自減、非)的優(yōu)先級(jí)大于雙目(四則運(yùn)算、大小比較、等于不等于、且或)大于三目(條件判斷?是:不是)。
對(duì)于模運(yùn)算,即取余%,該運(yùn)算只適合用兩個(gè)整數(shù)進(jìn)行取余運(yùn)算,且最后的結(jié)果取決于%前面的數(shù),即取決于被模數(shù)的符號(hào)。
對(duì)于除法運(yùn)算/,結(jié)果和參與運(yùn)算的數(shù)類(lèi)型相同,所以9/2會(huì)只得到整數(shù)部分4,float就可以得到結(jié)果。兩數(shù)中有一個(gè)為小數(shù),結(jié)果則為小數(shù),如:9.0/2 = 4.500000。
比較運(yùn)算的結(jié)果是邏輯值,結(jié)果為0或者1,邏輯運(yùn)算符可以簡(jiǎn)寫(xiě),如&&寫(xiě)成&,||寫(xiě)成|,但寫(xiě)兩個(gè)運(yùn)算效率高些——因?yàn)樵?amp;&的情況下,有短路特性,即如果已經(jīng)得知結(jié)果,不會(huì)去繼續(xù)。
自增自減運(yùn)算符,a++先參與運(yùn)算后+1,++a先+1后參與運(yùn)算。(這里面包括輸出函數(shù)中的情況,但有時(shí)候例如a+++a+++a++這種,結(jié)果取決于編譯器)
賦值運(yùn)算的時(shí)候,左值不能是常數(shù)、字面值(字符串等)和臨時(shí)值(如a+b)。