1. 程式人生 > >【C】C99與C89區別以及轉換方法

【C】C99與C89區別以及轉換方法

DATE: 2018.11.14

1、 C99與C89區別:

可變長陣列
  C99中,程式設計師宣告陣列時,陣列的維數可以由任一有效的整型表示式確定,包括只在執行時才能確定其值的表示式,這類陣列就叫做可變長陣列,但是隻有區域性陣列才可以是變長的.
可變長陣列的維數在陣列生存期內是不變的,也就是說,可變長陣列不是動態的.可以變化的只是陣列的大小.
可以使用*來定義不確定長的可變長陣列。

陣列宣告中的型別修飾符
  在C99中,如果需要使用陣列作為函式變元,可以在陣列宣告的方括號內使用static關鍵字,這相
當於告訴編譯程式,變元所指向的陣列將至少包含指定的元素個數。也可以在陣列宣告的方括號內使用
restrict,volatile,const關鍵字,但只用於函式變元。如果使用restrict,指標是初始訪問該物件的惟一途
徑。如果使用const,指標始終指向同一個陣列。使用volatile沒有任何意義。

(2)單行註釋

引入了單行註釋標記 “//” , 可以象C++一樣使用這種註釋了。

(3)分散程式碼與宣告
預處理程式的修改

(4)for語句內的變數宣告  
  C99中,程式設計師可以在for語句的初始化部分定義一個或多個變數,這些變數的作用域僅於本for語
句所控制的迴圈體內。比如:
程式碼:
for(int i=0; i<10; i++){
// do someting …
}

(5)複合賦值

C99中,複合賦值中,可以指定物件型別的陣列、結構或聯合表示式。當使用複合賦值時,應在括弧內指定型別,後跟由花括號圍起來的初始化列表;若型別為陣列,則不能指定陣列的大小。建成的物件是未命名的。
  例: double *fp = (double[]) {1.1, 2.2, 3.3};
  該語句用於建立一個指向double的指標fp,且該指標指向這個3元素陣列的第一個元素。 在檔案域內建立的複合賦值只在程式的整個生存期內有效。在模組內建立的複合賦值是區域性物件,在退出模組後不再存在。

(6)指定的初始化符

C99中,該特性對經常使用稀疏陣列的程式設計師十分有用。指定的初始化符通常有兩種用法:用於陣列,以及用於結構和聯合。用於陣列的格式:[index] = vol; 其中,index表示陣列的下標,vol表示本陣列元素的初始化值。
  例如: int x[10] = {[0] = 10, [5] = 30}; 其中只有x[0]和x[5]得到了初始化.用於結構或聯合的格式如下:
  member-name(成員名稱)
  對結構進行指定的初始化時,允許採用簡單的方法對結構中的指定成員進行初始化。
  例如: struct example{ int k, m, n; } object = {m = 10,n = 200};
  其中,沒有初始化k。對結構成員進行初始化的順序沒有限制。

(7) printf()和scanf()函式系列的增強

C99中printf()和scanf()函式系列引進了處理long long int和unsigned long long int資料型別的特性。long long int 型別的格式修飾符是ll。在printf()和scanf()函式中,ll適用於d, i, o, u 和x格式說明符。另外,C99還引進了hh修飾符。當使用d, i, o, u和x格式說明符時,hh用於指定char型變元。ll和hh修飾符均可以用於n說明符。
  格式修飾符a和A用在printf()函式中時,結果將會輸出十六進位制的浮點數。格式如下:[-]0xh, hhhhp + d 使用A格式修飾符時,x和p必須是大寫。A和a格式修飾符也可以用在scanf()函式中,用於讀取浮點數。呼叫printf()函式時,允許在%f說明符前加上l修飾符,即%lf,但不起作用。

(8) C99新增的庫

C89中標準的標頭檔案
  <assert.h> 定義巨集assert()
  <ctype.h> 字元處理
  <errno.h> 錯誤報告
  <float.h> 定義與實現相關的浮點值勤
  <limits.h> 定義與實現相關的各種極限值
  <locale.h> 支援函式setlocale()
  <math.h> 數學函式庫使用的各種定義
  <setjmp.h> 支援非區域性跳轉
  <signal.h> 定義訊號值
  <stdarg.h> 支援可變長度的變元列表
  <stddef.h> 定義常用常數
  <stdio.h> 支援檔案輸入和輸出
  <stdlib.h> 其他各種宣告
  <string.h> 支援串函式
  <time.h> 支援系統時間函式
  C99新增的標頭檔案和庫
  <complex.h> 支援複數演算法
  <fenv.h> 給出對浮點狀態標記和浮點環境的其他方面的訪問
  <inttypes.h> 定義標準的、可移植的整型型別集合。也支援處理最大寬度整數的函式
  <iso646.h> 首先在此1995年第一次修訂時引進,用於定義對應各種運算子的巨集
  <stdbool.h> 支援布林資料型別型別。定義巨集bool,以便兼容於C++
  <stdint.h> 定義標準的、可移植的整型型別集合。該檔案包含在<inttypes.h>中
  <tgmath.h> 定義一般型別的浮點巨集
  <wchar.h> 首先在1995年第一次修訂時引進,用於支援多位元組和寬位元組函式
  <wctype.h> 首先在1995年第一次修訂時引進,用於支援多位元組和寬位元組分類函式

(9) __func__預定義識別符號
  用於指出__func__所存放的函式名,類似於字串賦值

2、轉換方法:

THE END!