《C陷阱與缺陷》讀書(shū)筆記

詞法分析中的“貪心法”
  • 每個(gè)符號(hào)應(yīng)該包含盡可能多的字符。
    a---b等同于(a--)-b
    a+++++b被編譯器視為((a++)++)+b,語(yǔ)法上是不正確的。
字符與字符串
  • 單引號(hào)引起的字符代表一個(gè)整數(shù)。

  • 雙引號(hào)引起的字符串代表一個(gè)指向無(wú)名數(shù)組起始字符的指針。

理解函數(shù)聲明
(* (void (*) () ) 0) ();

這是一個(gè)經(jīng)典的例子。分析如下:

  1. void (*) () 指向返回值為void類(lèi)型的函數(shù)指針

  2. ( void (*) () ) 0 將0進(jìn)行類(lèi)型轉(zhuǎn)換

  3. (* ( void (*) () ) 0) (); 調(diào)用地址為0的子例程

運(yùn)算符優(yōu)先級(jí)
  • 優(yōu)先級(jí)由高到低排列
  • 數(shù)組下標(biāo)** [ ]、函數(shù)調(diào)用操作符( )、各結(jié)構(gòu)成員選擇操作符 ->**和 **. **。自左與右結(jié)合。
  • 單目運(yùn)算操作符,包括類(lèi)型轉(zhuǎn)換。 自右至左結(jié)合。
  • 雙目運(yùn)算操作符,其中優(yōu)先級(jí)順序 算術(shù)運(yùn)算符>位移運(yùn)算符>關(guān)系運(yùn)算符>邏輯運(yùn)算符。 自左向右結(jié)合
  • 三目運(yùn)算符(條件運(yùn)算符)。 自右至左結(jié)合。
  • 賦值運(yùn)算符。 自右至左結(jié)合。
  • 逗號(hào)運(yùn)算符。 自左與右結(jié)合。

運(yùn)算符優(yōu)先級(jí)所引發(fā)的錯(cuò)誤很難發(fā)現(xiàn)。

 while ( c == '\t '|| c = ' '|| c == '\n' )

事實(shí)上,該語(yǔ)句的正確劃分如下。

while ( (c == '\t '|| c ) = ( ' '|| c == '\n' ))

該語(yǔ)句不僅是將==誤寫(xiě)為=,還導(dǎo)致了表達(dá)式左端為不可修改的左值。

switch函數(shù)的優(yōu)勢(shì)與劣勢(shì)
  • 程序在switch中順序執(zhí)行,不受case標(biāo)號(hào)影響。
switch (color) {
    case 1:printf("red");
    case 2:printf("yellow");
    case 3:printf("blue");
}

color=2執(zhí)行結(jié)果為 yellowblue

使用不對(duì)稱(chēng)邊界
  • 用第一個(gè)入節(jié)點(diǎn)和第一個(gè)出界點(diǎn)來(lái)表示一個(gè)數(shù)值的范圍
    一個(gè)字符串中由下標(biāo)為16到下標(biāo)為37的字符元素所組成的字串,它的長(zhǎng)度是多少呢?
    若將其表示為整數(shù)x滿(mǎn)足x** >= 16(入界點(diǎn))且x < **38(出界點(diǎn)),則很容易計(jì)算其結(jié)果。

該技巧可以用在for循環(huán)中,用來(lái)循環(huán)結(jié)束的標(biāo)志。

使用頭文件
  • 每個(gè)外部對(duì)象只在一個(gè)頭文件中聲明,需要用到該外部對(duì)象的所有模塊都包含這個(gè)頭文件(包括其定義該外部對(duì)象的模塊)
返回整數(shù)的getchar函數(shù)
  • 單引號(hào)引起的字符代表一個(gè)整數(shù)。
  • 若使用char接收,可能無(wú)法容下EOF
宏可能產(chǎn)生的問(wèn)題
  1. 宏定義中的空格
#define f (x) ((x)-1)

該宏定義為f代表(x) ((x)-1)

  1. 宏不是函數(shù)
#define abs(x) x>0?x:-x
abs(a-b)

展開(kāi)后為

a-b>0?a-b:-a-b //并不是我們期望的-(a-b)

因此,宏定義中應(yīng)該把每個(gè)參數(shù)都用括號(hào)括起來(lái),整個(gè)表達(dá)式也應(yīng)該用括號(hào)括起來(lái)。

  1. 存在副作用
#define max(a,b) ( (a) > (b) ? (a) : (b) )
biggest = max ( biggest , x[i++])

展開(kāi)后

biggest = ( (biggest)>(x[i++]) ? (biggest) : (x[i++])

i一次可能遞增2。

  1. 宏不是類(lèi)型定義
#define T1 struct foo *
T1 a,b

展開(kāi)為

struct foo * a , b 

兩者類(lèi)型不同。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 多字符記號(hào) 輸入流到給定字符串,識(shí)別成記號(hào)后,會(huì)盡可能包含之后字符構(gòu)成最長(zhǎng)字符串作為記號(hào) 組合賦值運(yùn)算符是兩個(gè)記號(hào)...
    Nemocdz閱讀 455評(píng)論 1 2
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,661評(píng)論 1 51
  • ?1 C語(yǔ)言程序的結(jié)構(gòu)認(rèn)識(shí) 用一個(gè)簡(jiǎn)單的c程序例子,介紹c語(yǔ)言的基本構(gòu)成、格式、以及良好的書(shū)寫(xiě)風(fēng)格,使讀者對(duì)c語(yǔ)...
    CONLYOUC閱讀 8,870評(píng)論 9 66
  • 2017年8月27日 易經(jīng)六十一至六十四卦、黃帝內(nèi)經(jīng)第十六、詩(shī)經(jīng)鄭風(fēng)二 137累積學(xué)習(xí)297天 今日養(yǎng)生:雜糧粥,...
    雅筑小易閱讀 347評(píng)論 0 0
  • 他以卑微的使命降臨世間,卻將要也偉大的信仰走過(guò)一生!我以光宗耀祖的使命來(lái)到世間,卻怕也卑微的命運(yùn)度過(guò)一生!
    赫拉拉閱讀 214評(píng)論 1 0

友情鏈接更多精彩內(nèi)容