C陷阱與缺陷 第七章 可移植性缺陷

2021-09-21 01:21:04 字數 1921 閱讀 7233

注意不同的c 語言的實現,把乙個識別符號**現的所有字元都作為有效字元處理,還是自動階段乙個長的識別符號的名稱的尾部;同時注意不同的c 語言的實現,對大小寫字母的區分;

c 語言中提供了 3 種不同長度的整數:short ,int,long,c 語言中的字元行為方式與小整數相似。

c語言對各種不同型別的整數的相對長度做了如下規定:

(1)3種型別的整數其長度是非遞減的。

(2)乙個普通(int 型別)整數足夠大,以容納任何陣列的下標。

(3)字元長度由硬體的特性決定。

現代大多數的c 編譯器都把字元實現為 8 位整數。

將乙個字元值轉化為乙個較大的整數時,要注意字元是有符號數,還是無符號數。若是有符號數,編譯器只需將 char 型別的數擴充套件到 int 型別時,同時複製符號位;如果是後一種情況,編譯器秩序在多餘的位上直接填充 0 即可。

乙個 8 位的字元,如果是有符號數,則其範圍為-128——127,如果是無符號數,則取值範圍為 0——255.

將有符號的字元轉化為無符號數,是使用(unsigned char)進行強制轉化。

對於移位,在向右進行移位時,空出來的位的填充方式,與具體的c 語言的實現有關。如果被移位的物件是無符號數,那麼空出來的位將被 0 填充。如果被移位的物件是有符號數,那麼c 語言的實現即可以用 0 進行填充,也可以使用符號位的副本填充空出來的位(一般如此);

如果被移位的物件長度是 n 位,那麼移位計數必須大於等於0,而且嚴格小於 n。因此,不能做到在單次操作中將某個數值的所有位都移出,該限制是為了能夠在硬體上高效的實現移位運算。

需要注意,對於有符號數,即使將符號位複製到空出來的位中,有符號的整數向右移位運算也並不等同於除以 2 的某次冪,比如(-1)>>1 的結果一般不為0,但是(-1)/2的結果一般為 0.

移位運算比正常的算數運算快。

null指標並不指向任何物件,因此,除非是用於賦值或者比較運算,出於其他任何目的使用null 指標都是非法的。

不同的c 語言實現對 null 指標指向的 0 位址記憶體位置的使用,有不同的規定:有的對記憶體位置 0 強加了硬體級的保護,如果錯誤的使用了null 指標,將會立即終止執行;有的對記憶體位置 0 只允許讀,不允許寫,這種情況可能讀出null指標指向的無意義的資訊;有的實現,允許對記憶體位置0 進行讀寫操作,這樣可能造成修作業系統功能的災難性後果;

在所有的c 語言實現中,誤用 null 指標的效果都是未定義的。

假定 a除以 b,商為 q,餘數為 r:

q=a/b;

r=a%b;

假定b 大於 0,則希望 a,b,q,r之間維持的關係:

(1)最終要的一點,滿足q*b+r=a;

(2)如果改變 a 的正負號,則希望同時改變 q 的正負號,但不會改變 q 的絕對值;

(3)當 b>0時,希望能夠保證 r>=0,且rc 標準中定義了常數 rand_max,它的值等於隨機數的最大值。

將大小寫進行轉換,可以呼叫庫函式 toupper 和 tolower,這樣的函式呼叫健壯,但是代價是每次使用這些函式時,引入了函式呼叫的開銷。

也可以使用對應的巨集:#define _toupper(c) ((c)-『a』-『a』)和#define _tolower(c) ((c)+『a』-『a』),只是這種方式健壯性不足:依賴於特定的實現中字符集的性質,即需要所有的答謝字母與相應的小寫字母之間相差乙個常量;輸入的字元是正確的大小寫字母;

在大多數的c 語言實現中,都為使用者提供了 3 個記憶體分配的函式:malloc,realloc和 free。

呼叫malloc(n) 函式,將返回乙個指標,指向乙個新分配的可以容納 n 個字元的記憶體,程式設計者可以使用這塊記憶體。

把malloc函式返回的指標作為引數傳入給 free 函式,就釋放了這塊記憶體,以便重新利用。

呼叫realloc函式時,需要把指向一塊已經分配記憶體的區域指標以及這塊記憶體新的大小作為引數傳入,就可以調整(擴大或縮小)這塊記憶體區域的新的大小,這個過程中,可能涉及到記憶體的拷貝。

C語言的缺陷與陷阱 札記 七 可移植性缺陷

how to write protable software in c 有些c實現將所有字元作為有效字元 有些c自動擷取長字元的尾部 ansi標準規定,識別符號可以為任意長度,但外部名必須至少能由前6個字元唯一地區分,並且不 區分大小寫 例如 print float print fileds 可能帶...

c陷阱和缺陷 鏈結 預處理 庫函式 可移植性缺陷

1.命名衝突和static修飾符 如果若干個函式需要共享一組外部物件,可以將這些函式放到乙個原始檔中,把它們需要用到的物件都在同乙個原始檔中以static修飾。static同時也適合函式,如果函式g被函式h呼叫,則將函式g和h放到同乙個檔案中,並且申明g是static。1.乙個看似正確的程式 inc...

《C陷阱與缺陷》第五章

c陷阱與缺陷 第五章 庫函式 5.1,返回整數的getchar函式 在c語言的庫函式中,將getchar函式的返回值定義為int 防止char溢位,例如char表示不了eof 5.2 更新順序檔案 根據c語言庫函式中的fread fwrite fseek 函式的用法,在fread和fwrite函式交...