C89和C99區別--簡單總結


    (1)對數組的增強

      可變長數組
  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年第一次修訂時引進,用於支持多字節和寬字節分類函數

      (10)__func__預定義標識符
  用於指出__func__所存放的函數名,類似於字符串賦值。

     (11)

       其它特性的改動
  放寬的轉換限制
 
    限制             C89標准  C99標准
    數據塊的嵌套層數       15     127
    條件語句的嵌套層數      8      63
    內部標識符中的有效字符個數  31     63
    外部標識符中的有效字符個數  6      31
    結構或聯合中的成員個數    127    1023
    函數調用中的參數個數     31     127

 

  不再支持隱含式的int規則
  刪除了隱含式函數聲明
  對返回值的約束
    C99中,非空類型函數必須使用帶返回值的return語句.
  擴展的整數類型
    擴展類型 含義
    int16_t 整數長度為精確16位
    int_least16_t 整數長度為至少16位
    int_fast32_t 最穩固的整數類型,其長度為至少32位
    intmax_t 最大整數類型
    uintmax_t 最大無符號整數類型
  對整數類型提升規則的改進
    C89中,表達式中類型為char,short int或int的值可以提升為int或unsigned int類型.
    C99中,每種整數類型都有一個級別.例如:long long int 的級別高於int, int的級別高於char
等.在表達式中,其級別低於int或unsigned int的任何整數類型均可被替換成int或unsigned int類型.

 

(12)新增數據類型 
  _Bool 
  值是0或1。C99中增加了用來定義bool、true以及false宏的頭文件夾<stdbool.h>,以便程序
員能夠編寫同時兼容於C與C++的應用程序。在編寫新的應用程序時,應該使用
<stdbool.h>頭文件中的bool宏。
  _Complex and _Imaginary
 C99標准中定義的復數類型如下:float_Complex; float_Imaginary; double_Complex; 
double_Imaginary; long double_Complex; long double_Imaginary.
<complex.h>頭文件中定義了complex和imaginary宏,並將它們擴展為_Complex和_Imaginary,
因此在編寫新的應用程序時,應該使用<stdbool.h>頭文件中的complex和imaginary宏。
  long long int
  C99標准中引進了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 
- 1)。long long int能夠支持的整數長度為64位。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM