|
既然,你對這個(gè)有興趣,我又正好現(xiàn)在沒事,就跟你好好聊聊,希望你有耐心看完。
#define alland(x,y,z) (x) = (x) & (y) & (z)
#define allor(x,y,z) (x) = (x) | (y) | (z)
#define andthenor(x,y,z) (x) = (x) & (y) | (z)
#define andafteror(x,y,z) (x) = (x) & ((y) | (z))
#define orthenand(x,y,z) (x) = (x) | (y) & (z)
#define orafterand(x,y,z) (x) = (x) | ((y) & (z))
由此,可以看出,只要你定義的足夠的多,就能有“第二種寫法” 應(yīng)對各種情況。 但是,如果你都用這種方法寫代碼,自己寫是沒有問題,如果這代碼轉(zhuǎn)給第三人看,或者發(fā)帖求助,別人是劈死你的心都有。
那么,既然換一種寫法有那么多人會不爽,為什么 會有 a &=b; 和 a = a & b; 編譯器自帶的這兩種寫法呢?這個(gè)牽涉到歷史遺留問題,別急,會跟你講清楚的。
最開始,最正統(tǒng)的C語言,是只有 a = a & b; 這一種寫法的, 等號左邊是賦值目的地,等號右邊是表達(dá)式,或者說計(jì)算方式。這個(gè)表達(dá)方式用現(xiàn)在的話來講, 很"C語言"。
那么為什么后來會引入(或者說創(chuàng)造出) a &= b; 這種不正統(tǒng)的書寫方式呢? 受環(huán)境所迫。就和現(xiàn)在新產(chǎn)品面世,必須要推廣建立用戶基礎(chǔ)一樣,C語言推出之初,是沒有用戶基礎(chǔ)的,那時(shí)候大多數(shù)人都在用A語言,即匯編。C語言門檻低,適合初學(xué)者,這是沒錯(cuò),但是,每人愿意學(xué)啊,就好像屠龍絕技學(xué)了,之后你沒有龍可以屠,有什么用呢? 初學(xué)者學(xué)了C, 開發(fā)團(tuán)隊(duì)的前輩們還在用A, 這怎么搞?(當(dāng)時(shí)并沒有匯編和C混合編程這個(gè)功能的)。于是,讓已經(jīng)編程多年的老手,轉(zhuǎn)移到C ,成了關(guān)鍵。其中商業(yè)當(dāng)中的運(yùn)作,彎彎繞繞就不講了,直接跳到關(guān)鍵點(diǎn)。 C語言的語法,對用了一輩子匯編的人來說,是非常不友好的。為了讓這些人更快的掌握C, 于是C語言非常“貼心”的增加了,符合匯編人的書寫習(xí)慣的“第二種寫法”。
比如說: a = a & b; 他的意思是,把 a 和 b 相與 并且,把結(jié)果保存到 a
匯編中,沒有這種寫法的,匯編中只有類似這樣的: ANL A,B 即把 B 的值 與到 A, 匯編中不需要考慮結(jié)果保存去哪里,也不能考慮結(jié)果保存在哪里,
所以,針對匯編用戶的習(xí)慣, C語言 “很貼心” 的 增加了 a &= b; 這種 “很匯編” 的寫法。 同類的還有很多,
比如: a |= b; 對應(yīng): ORL A,B
比如: a +=b; 對應(yīng): ADD A,B
比如: a++ 對應(yīng): INC A
比如: a-- 對應(yīng): DEC A又比如: while(!TI); 對應(yīng): JNB TI,$ 正統(tǒng)的寫法應(yīng)該是用表達(dá)式: while(TI == 0) 等等,很多很多。
總之,為了拉攏這批 老編程員 投入C的懷抱,提供了大量的“很匯編”的“第二種寫法”。
所以,剛開始的時(shí)候,這一類的 “不怎么C” 的C語言,反而是使用頻率最高的。而新人們,雖然可能沒有學(xué)過匯編,看到前輩們這樣寫,為了不給前輩們增加閱讀成本,也盡量的這么寫。(現(xiàn)在看來,以前的新人們真的很貼心)。 所以,這些新人們,也習(xí)慣了使用這種“非標(biāo)”的C代碼,久而久之本來作為權(quán)益之計(jì)的“第二種書寫法”就根深蒂固的成為了一種標(biāo)準(zhǔn)書寫規(guī)范。哪怕進(jìn)化到了 TC , C++, 都一直延續(xù)保留了下來。
扯遠(yuǎn)了,我們扯回來。重點(diǎn)來了:
你會經(jīng)常在看別人的代碼里看到 a &= b; a +=b; 這些“非標(biāo)”的書寫方式, 但是,你很好奇 a = a & b & c 有沒有類似的寫法,因?yàn)槟阍趧e人的代碼里沒有機(jī)會看到。 那么,為什么你會看不到呢? 不是因?yàn)闆]有,不是因?yàn)閷懖怀鰜恚?因?yàn)?nbsp; a = a & b & c 完全不符合 匯編邏輯。 所以不會有人使用 “很匯編” 的寫法,去寫這樣的表達(dá)式,所以,你看不到實(shí)例。 硬寫是可以的, 根據(jù)實(shí)際應(yīng)用情況, 可以寫成 a &= b & c; 也可以由第三種寫法,但是,這樣做就刻意了。 老匯編程序員, 把 a = a & b; 寫成 a &= b; 可以提高閱讀效率,降低閱讀成本, 但是 a &= b & c 這種寫法,對于習(xí)慣匯編邏輯的老程序員一樣是要繞腦子的。 所以,他本人不會這樣寫, 新人們也不會這樣寫,因此,你基本不會在他人程序里面看到,假如有看到,那么這個(gè)人一定是 刻意裝X的,決不是習(xí)慣問題,或者編程邏輯問題。
洋洋灑灑寫了一大堆,主要是讓你了解一下,有多種寫法的歷史背景,以及為什么很多人會習(xí)慣用一些 “很不C” 的 “第二種寫法”。 算是“科普”吧。
|
評分
-
查看全部評分
|