溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

神奇的C語(yǔ)言,這才是C語(yǔ)言大牛操作,作為面試題,怕是秒殺眾人

發(fā)布時(shí)間:2020-06-23 18:50:10 來(lái)源:網(wǎng)絡(luò) 閱讀:2766 作者:C語(yǔ)言豆子 欄目:編程語(yǔ)言

神奇的C語(yǔ)言,這才是C語(yǔ)言大牛操作,作為面試題,怕是秒殺眾人

當(dāng)然下面列出來(lái)的幾點(diǎn)都是C的基礎(chǔ)用法,只不過(guò)是這些用法可能平時(shí)不會(huì)被注意。所以很多東西第一次看到的時(shí)候,可能會(huì)覺(jué)得很怪異,但是細(xì)細(xì)想想就能很好的理解,也就能更好的清楚C語(yǔ)言的一些特性。但是在具體的編碼過(guò)程當(dāng)中,我還是希望都能老老實(shí)實(shí)規(guī)規(guī)矩矩的。因?yàn)槌绦騿T不需要太多棱角,把代碼寫(xiě)得規(guī)范整潔比耍小聰明要重要得多。下面我列舉了5個(gè)例子說(shuō)明一些問(wèn)題,如果你是老手看到這些就一笑而過(guò)吧,如果是新手,我相信還是會(huì)得到一些啟發(fā)的。

1. #和##在宏中的作用,以及帶參宏,參數(shù)的傳遞問(wèn)題。

2. 結(jié)構(gòu)體中域的偏移位置的計(jì)算問(wèn)題。

3. 結(jié)構(gòu)體的定義以及初始化的用法。

4. 數(shù)組和指針在運(yùn)算中的等價(jià)關(guān)系。

5. 數(shù)組在棧中的“變異”。

1. 例子:

神奇的C語(yǔ)言,這才是C語(yǔ)言大牛操作,作為面試題,怕是秒殺眾人

說(shuō)明:

A) 預(yù)編譯中#是將右邊的參數(shù)轉(zhuǎn)成一個(gè)字符串,##是將左右兩邊的參數(shù)連接成一個(gè)字符串。例子是#的用法。

B) 宏當(dāng)中的參數(shù)其實(shí)是以逗號(hào)(,)分隔的,其他的字符其實(shí)都被看成同一個(gè)參數(shù),但是換行和空白其實(shí)被處理過(guò)了,使參數(shù)在同一個(gè)行中。有興趣的自己多做些測(cè)試吧,這個(gè)用法可以用于要寫(xiě)包含特殊字符的字符串,免得要寫(xiě)很多的轉(zhuǎn)義字符(),但是中間不能有逗號(hào),呵呵~

2. 例子:

神奇的C語(yǔ)言,這才是C語(yǔ)言大牛操作,作為面試題,怕是秒殺眾人

說(shuō)明:

A) &((struct _st*)0)->b 的作用是輸出_st結(jié)構(gòu)體中b的偏移。為什么用0當(dāng)成指針呢,其實(shí)很好理解:如果一個(gè)_st結(jié)構(gòu)體的地址是0,那么b的地址其實(shí)就是b在結(jié)構(gòu)體中的偏移。

B) 其實(shí)按理,如果先做((struct _st*)0)->b運(yùn)算,那么程序肯定異常,所以編譯器還是做了優(yōu)化的,具體編譯器怎么做的,我也沒(méi)深究。

3. 例子:

神奇的C語(yǔ)言,這才是C語(yǔ)言大牛操作,作為面試題,怕是秒殺眾人

說(shuō)明:

A) 在結(jié)構(gòu)體的初始化時(shí),可以指定域進(jìn)行初始化,如例子中的.c = 1,順序可以顛倒,這樣做的好處就是可讀性較強(qiáng),對(duì)于大結(jié)構(gòu)的初始化,在閱讀時(shí)很方便。缺點(diǎn)就是低版本的編譯器可能不支持。

B) 在結(jié)構(gòu)體的聲明中,可以指定域的大小,如例子中的int a : 1; 說(shuō)明a只暫用一個(gè)bit,充分展示了C對(duì)二進(jìn)制處理反面的親和力。

C) 為什么s.c輸出是-1,而不是1,其實(shí)很簡(jiǎn)單,因?yàn)?xFFFFFFFF表示的是-1,那么一個(gè)1bit大小的變量,所有位上面都是1,那么它也表示-1。所以編碼的過(guò)程中,有符號(hào)和無(wú)符號(hào)混用其實(shí)是很危險(xiǎn)的一件事情。

神奇的C語(yǔ)言,這才是C語(yǔ)言大牛操作,作為面試題,怕是秒殺眾人

4. 例子:

神奇的C語(yǔ)言,這才是C語(yǔ)言大牛操作,作為面試題,怕是秒殺眾人

說(shuō)明:

A) 0[a] = 'x';是什么玩意兒?如果寫(xiě)成a[0]='x';其實(shí)你就明白是什么意思了,但是說(shuō)白了,a[0]和0[a]在編譯器看來(lái)是一樣的。因?yàn)閿?shù)組在做[]運(yùn)行時(shí),其實(shí)是做指針的加法運(yùn)行:a[0]等價(jià)于*(a+0)。所以0[a]也就等價(jià)于*(0+a)是完全正確的。

5. 例子:

神奇的C語(yǔ)言,這才是C語(yǔ)言大牛操作,作為面試題,怕是秒殺眾人

說(shuō)明:

A) 為什么兩行的結(jié)果會(huì)不一樣?在一般情況下,按我的理解,一個(gè)數(shù)組a,&a和&a[0]的值是一樣的。但是當(dāng)a在形參當(dāng)中時(shí)就不一樣了。例子中,func函數(shù)中的a,其實(shí)a變量是在func函數(shù)的棧當(dāng)中,在func內(nèi)部,a其實(shí)已經(jīng)被轉(zhuǎn)化成char *a,所以&a是表示指針變量a在棧中的地址,而&a[0]表示的是指針指向的內(nèi)存空間的第一個(gè)元素的地址,其實(shí)也就是調(diào)用者傳入的數(shù)組的第一個(gè)元素的地址。不知道我說(shuō)明白了沒(méi)有??!

B) 這個(gè)可能比較難理解,關(guān)鍵是明白一點(diǎn),在數(shù)組作為形參時(shí),是被轉(zhuǎn)換成指針看待的。



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI