依賴編程內部知識的C語言習慣用法

來源:互聯網
上載者:User

1.關於位元影像的自描述能力

表徵圖或者圖形是一種小型的位元模式映射於螢幕產生的映像,

實際上,其實就是用原本十六進位表示的位元影像數組,表示為二進位方式分解方式。例如:

0x07c6,二進位就是0000011111000110,即oxo7c6 = (((((((((((((((((0) * 2 + 0) * 2 + 0) * 2 + 0) * 2 + 0) * 2 + 0) * 2 + 1)* 2 + 1)* 2 + 1)* 2 + 1)* 2 + 1)* 2 + 0)* 2 + 0)* 2 + 0)* 2 + 1)* 2 + 1)* 2 + 0)

我們進行如下宏定義:

#define X )*2+1
#define _ )*2
#define s ((((((((((((((((0

則0x07c6實際表示為:s _ _ _ _ _ X X X X X _ _ _ X X _

通過這種方式,可以讓位元影像有自我描述能力。

2.關於原型

實際上,C語言除了尋常算數轉換(即不同類型的運算元做型別提升),它的類型轉換比一般人想象的要廣泛的多,在設計小於int,double的運算式中,都可能發生類型轉換。

在運算式中,小於int類型的資料類型,都會被提升為int,這個特性被稱為型別提升。ANSIC對兩個小於int的類型進行加法時,都會對兩個類似進行型別提升,然後對兩個int進行加法,再對結果進行裁剪,如果兩個運算元相加不會發生溢出異常,那麼實際執行時只需要產生小於int類型的運算結果,可以省略型別提升。類似的,float和double。

常見的型別提升有,char,位段,枚舉,unsigned char,short,unsigned short,float,任何數組。前提是int能夠容納原先的資料,否則,提升為unsigned int。

注意:參數也會被提升。

因此,在隱式轉化方面,要注意三點:

1.隱式轉換是語言中的一種臨機手段,方便編譯器簡化。把所有資料轉換為同一的長度,極大的簡化了代碼的產生,這樣,壓棧的參數都是同一長度,運行時系統只需要知道參數的數目。

2.預設的隱式轉換,不影響正常編程。

3.隱式轉換在設計原型的上下文中,非常重要。

 K & R C的函式宣告和定義:

聲明:

int fun();

定義:

int fun(a, b)

int a;

int b;

{

}

ANSI C:

原型:

int fun(int a, int b);

int fun(int, int);

定義

int fun(int a , int b)

{

}

由於有上億行的C代碼採用K&R C方式編程,ANSI C並沒有明確規定在函式宣告中使用空括弧是被正式廢棄的,也沒有說明繼續使用這種版本的形式會導致與未來版本不相容。因此,這兩種風格都會大量存在。

在K&R C風格的函數中傳遞一個短於int類型的整數,函數實際收到的是int類型,這叫整形提升,這樣做的目的,早期是為了簡化編譯器的工作。同樣,傳遞float類型的參數自動提升為double類型。但在被調用的函數體內,這些類型又被裁剪為相應的類型。這樣所有的東西都是相同的長度,大大簡化傳參過程。注意:早起的編譯器,只允許三種類型做參數,int,double,指標,因此,在傳遞參數時會發生型別提升,但在函數體內,根據函數定義時申明的形參類型,自動裁剪。

相反,如果使用ANSI C 的函數原型。則不進行這樣的提升和裁剪,因為假定參數是準確聲明的。那麼,在K&C和ANSI C的函數使用中,如果使用混合方式,則可能會出現錯誤。

1.ANSI C的函數原型,K&R C的函數定義

2.K &R C的函數原型,ANSI C的函數定義

這兩種情況,在使用較窄的類型時,都會失敗。

因為實際傳遞的參數類型(函數調用時)和期望接收(函數體內)的類型不一致,出現傳參失敗。

3.在實際編程中,我們把函數原型放置在標頭檔中,把函數定義放置在包含該標頭檔的檔案中,編譯器能同時發現他們。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.