lcc讀書筆記之C語言語義檢測2

2021-04-15 07:48:04 字數 1050 閱讀 9621

c語言的函式呼叫要解決以傳值方式傳遞和返回結果,有時還會出現引數中巢狀函式呼叫的問題。所以必須建立乙個正確的樹結構,要求巢狀函式的呼叫在使用引數前計算。函式原型的語義檢測由下列片段組成

if (proto && *proto && *proto != voidtype)//表明原型還沒比較完全,在此情況下進入迴圈比較,直到讀到')'

if (proto && *proto && *proto != voidtype) //退出迴圈後,如果此條件還為真,表明引數不夠

實參跟形參的比較如下aty = assign(*proto, q);如果返回型別不為空,就表明相容。

q=cast(q,aty)進行引數轉換,將實參轉換為正確的形參

建立正確的引數樹

r = r ? tree(right, voidtype, r, q) : q; //有巢狀呼叫的話就生成右操作樹

args = tree(arg + widen(q->type), q->type, q, args);  //引數樹,右節點為前乙個引數。

t3 = temporary(auto, unqual(rty), level);  //為結構型別建立臨時變數,儲存返回值

return calltree(f,rty,args,t3)語義檢測結束,生成函式呼叫樹。操作碼是call+b

下面再看看c語言對於關係操作符的語義檢測,如果運算元都是算術型別的話比較就很簡單,返回型別為inttype.

指標型別的話就要判斷指標是否滿足條件,然後將指標型別轉換為無符號數進行比較

if (isarith(l->type) && isarith(r->type)) else if (compatible(l->type, r->type)) else

return simplify(op + ttob(ty), inttype, l, r);

在lcc中null指標的定義如下

static int isnullptr(e) tree e;   //null指標式為0的整型常量表示式或者將它們轉換為void*後得到的結果。

不同的編譯器對指標操作的要求常常不同,但一般都是轉換為無符號數進行比較。

《C 語義和效能分析》讀書筆記

頁數 203 字數 287千字 版次 2017年11月第一版 今天看完了這本書 c 語義和效能分析 這本書挺薄的,只有200面,花費了我1天半的時間把書完整的看了一遍。書裡第一章介紹c 背景的內容感覺是最值得看的一章,講到了c 的一些設計思路,還是對我有些幫助。書裡主要講的內容是c 的繼承,多型。講...

C語言讀書筆記

1.c語言中一共有32個關鍵字 分別是 auto int double long char short float unsigned signed sizeof extern static goto if else struct typedef union enum switch case brea...

C語言技巧(讀書筆記)

基礎 1 編寫能清晰表達設計思想和意圖的 2 利用注釋闡述和解釋 並進行總結。3 使用有意義且無歧義的命名方法。4 不要自己編寫庫函式已包括的函式,盡可能的使用標準庫c函式。5 讓程式自己檢查執行中的錯誤 編寫除錯 6 謹慎使用goto語句 7 不要修改那些風格差的 重寫他們!8 不要比較浮點數是否...