今天在CSDN上真的看見了孔乙己式的問題:用C語言,不用四則運(yùn)算,對(duì)一個(gè)變量進(jìn)行加1操作。答案是(i在某處定義了):
i = (int)&(((char*)i)[1]);
想出這個(gè)問題的兄臺(tái)真是夠孔乙己的——除了用+、-、*、/和++,還有別的方法對(duì)一個(gè)變量加1——茴香豆的“茴”字有六種寫法……據(jù)說這是一道筆試題。sigh……有鉆研精神,可是沒有實(shí)用主義。
在這里解釋一下為什么能夠?qū)崿F(xiàn)對(duì)i加1,以免有些初學(xué)者不懂,另一個(gè)目的也是希望大家引以為戒,不要這么孔乙己(關(guān)于指針的問題,可以參考我的文章“
指針是通往地獄的捷徑”):
首先,看最里面兩層括號(hào):
((char*)i)
這里將i從整型轉(zhuǎn)換成一個(gè)ulong,并使之成為一個(gè)指向字符(字符串)的指針,記為ptr。然后是:
i = (int)&(ptr[1]);
這就是說,將ptr作為一個(gè)指向字符串的指針,這里ptr[1]就相當(dāng)于*(ptr +
1),因?yàn)閿?shù)組名其實(shí)就是地址,所以ptr[1]與*(ptr + 1)等價(jià)(有疑問的請(qǐng)參考“The C Programming
Language, by Kernigham & Ritchie”)。比如:
/* C代碼 */
char a[] = "hello, world";
char * ptr = a;
printf("%c, %c, %c, %c\n", *(ptr+4), ptr[4], a[4], *(a+4));
輸出的結(jié)果將是:o, o, o, o
好了,既然ptr[1]等價(jià)于ptr + 1,那么整個(gè)表達(dá)式可以寫成:
int i = (int)(ptr + 1);
由于char *所指向的是字符,只占用一個(gè)字節(jié),那么指針?biāo)阈g(shù)ptr+1將導(dǎo)致ptr的ulong值加1,這樣就相當(dāng)于:
int i = int((ulong)i + 1);
這里有這些知識(shí)點(diǎn):指針、數(shù)組、指針?biāo)阈g(shù)、強(qiáng)制類型轉(zhuǎn)換??雌饋沓鲱}人對(duì)這些知識(shí)點(diǎn)的了解還是比較深刻??晌冶仨氄f:真是孔乙己式的問題!這點(diǎn)
稍微有點(diǎn)深刻的理解只不過為了炫耀而已!這種人能出面試題,且被該公司采用,簡直就是中國IT人的恥辱,希望以后這位老兄不要說他是干IT的,咱丟不起那
人!自作聰明的家伙!這就跟為了放屁就脫了褲子坐在馬桶上,拿本書,然后放個(gè)屁走人是一個(gè)道理。只可惜,他還崩了一屁股水。
這種解答很有技巧性,也說明該老兄腦子里的筋很多,很多彎——去忽悠趙本山都綽綽有余,可是他不像搞IT的,更像是本山大叔,出的題也像“茴字
有六種寫法你知道嗎?”和“1加1在什么情況下等于3?”,三者如出一轍。建議這位老兄搞點(diǎn)好本子,上春晚忽悠去,那里還有人捧場,還能逗樂子。
為什么說他崩了自己一屁股水:
1、這條語句的效率問題。要實(shí)現(xiàn)對(duì)一個(gè)變量加1,寫成:
i + 1;
或者++i;
翻譯成匯編代碼基本就是:
ADD i, 1
而且這是單條指令的運(yùn)算,用ALU就能完成,效率多高!再看看答案,兩次強(qiáng)制類型轉(zhuǎn)換,一個(gè)指針?biāo)阈g(shù),最后一個(gè)賦值,翻譯成匯編代碼,不知道要多少條(與編譯器有關(guān))!效率當(dāng)然低下!
2、溢出問題導(dǎo)致的錯(cuò)誤。假如i的值正好是最大的有符號(hào)整數(shù)(假設(shè)int只有16位,那就是65535),將其轉(zhuǎn)換成ulong,值不會(huì)變。然后加1,再轉(zhuǎn)換成int,然后,你的答案就是絕對(duì)錯(cuò)誤的,溢出了!
3、安全問題。i的初始值為0,轉(zhuǎn)換成指針后指向了內(nèi)存0,沒關(guān)系,相當(dāng)于NULL,加1后指向了1,不巧有個(gè)黑客發(fā)現(xiàn)了這段代碼,并得到了這個(gè)指針,然后……你就等著哭吧,老兄!
出這道題的老兄,省省勁吧。要是我筆試or面試碰上這樣的題,我絕對(duì)會(huì)鄙視他一番,然后問他:“茴香豆的茴字有六種寫法,你會(huì)么?”問完之后,揚(yáng)長而去——為出這種題的公司干活,不丟人么?
說實(shí)在的我也挺無聊,閑著沒事跟孔乙己叫什么真?看來真得約上這位出題的老兄去后海邊的孔乙己酒吧喝點(diǎn)酒,看他排出九文大錢,用手指蘸著酒在桌上畫著,再聽他拽一遍:“茴香豆的茴字有六種寫法,你會(huì)么?”