回覆列表
  • 1 # 使用者4498167702267

    當一回大自然的搬運工 原文在此 --> K&R C和ANSI C兩種風格的函式宣告及定義在引數型別隱式轉換上的區別

    K&R C的函式宣告:

    function();

    這種方式宣告的函式,在向其傳遞引數時,較小型別的引數會被進行隱式型別轉換,如char、short被轉換為int,float被轉換為double。即堆疊中所儲存的引數其所佔位元組數大於實際應該佔用的位元組

    ANSI C的函式宣告:

    int function( char c, short si, float f );

    這種方式宣告的函式,在向其傳遞引數時,不會發生隱式型別轉換,堆疊中各個引數所佔位元組就是各個型別的實際應該佔用的位元組。

    K&R C的函式定義:

    function()

    char c;

    short si;

    float f;

    {

    ....

    }

    這種方式定義的函式,其引數在使用時,會先按被隱式型別轉換之後的大小,從堆疊中提取出來,然後再按函式定義中的實際型別進行擷取。如,char型別變數c實際訪問時,先在堆疊中變數c的儲存位置,提取出一個int大小的“臨時變數”,然後將該“臨時變數”擷取成一個char變數再進行運算。short及float變數同理。

    ANSI C的函式定義:

    int function( char c, short si, float f )

    {

    ....

    }

    這種方式定義的函式,其引數使用時,直接從堆疊中按實際定義的大小進行提取即可。

    故K&R C和ANSI C的函式宣告及定義,在引數型別轉換上的區別可分為兩個部分:

    1. 在引數傳遞給該函式時,是否發生了型別提升?K&R C有型別提升,ANSI C沒有

    2. 在函式實際使用其引數時,是否發生了位元組擷取?K&R C有,而ANSI C沒有

    因此,程式碼中對同一個函式的宣告和定義,必須使用一致的風格,不可混用K&R C和ANSI C風格。

  • 中秋節和大豐收的關聯?
  • 只有一兒一女,老了生病怎麼辦?怎麼養老?