C語言是一門經典的編程語言,經過這么多年,依然是一門很熱的編程語言。
在TIOBE 編程語言排行榜中,這幾年C語言基本排名第一、第二,可以說問問的坐在前排。
然后,也分享過一篇《ANSI 的100年發展歷程》講述了ANSI(美國國家標準協會)100年的發展歷史。
這里再次描述一下C89、C99、C11的歷史:
1983 年,美國國家標準協會(ANSI)組成了一個委員會來創立 C 語言的標準。因為這個標準是 1989年發布的,所以一般簡稱 C89 標準。有些人也把 C89 標準叫做 ANSI C。
在 1990 年, ANSI C89 標準被國際標準化組織(ISO)和國際電工委員會(IEC)采納為國際標準,名叫ISO/IEC 9899:1990 - Programming languages C,有些人簡稱 C90 標準。因此, C89 和 C90 通常指同一個標準,一般更常用 C89 這種說法。
在 2000 年3 月,國際標準化組織(ISO)和國際電工委員會(IEC)采納了第二個 C 語言標準,名叫 ISO/IEC9899:1999 - Programming languages -- C,簡稱 C99 標準。
在 2011 年 12 月,國際標準化組織(ISO)和國際電工委員會(IEC)采納了第三個 C 語言標準,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C,簡稱 C11 標準。
對于我們常用的開發環境 MDK 和 IAR 而已, C89, C99 和 C11 均支持。
C標準目前C99用的最多的,一般來說,C99兼容C89。
1.對數組的增強
可變長數組
C99中,程序員聲明數組時,數組的維數可以由任一有效的整型表達式確定,包括只在運行時才能確定其值的表達式,這類數組就叫做可變長數組。
但是只有局部數組才可以是變長的,可變長數組的維數在數組生存期內是不變的,也就是說,可變長數組不是動態的,可以變化的只是數組的大小,可以使用*來定義不確定長的可變長數組。
數組聲明中的類型修飾符
在C99中,如果需要使用數組作為函數變元,可以在數組聲明的方括號內使用static關鍵字,這相當于告訴編譯程序,變元所指向的數組將至少包含指定的元素個數。也可以在數組聲明的方括號內使用restrict,volatile,const關鍵字,但只用于函數變元。如果使用restrict,指針是初始訪問該對象的惟一途徑。
如果使用const,指針始終指向同一個數組。使用volatile沒有任何意義。 2.單行注釋
引入了單行注釋標記 "http://" , 可以象C++一樣使用這種注釋了。
3.分散代碼與聲明
預處理程序的修改
4.for語句內的變量聲明
C99中,程序員可以在for語句的初始化部分定義一個或多個變量,這些變量的作用域僅于本for語句所控制的循環體內。比如代碼:
C99中,復合賦值中,可以指定對象類型的數組、結構或聯合表達式。當使用復合賦值時,應在括弧內指定類型,后跟由花括號圍起來的初始化列表;若類型為數組,則不能指定數組的大小。建成的對象是未命名的。
例:
6.指定的初始化符
C99中,該特性對經常使用稀疏數組的程序員十分有用。指定的初始化符通常有兩種用法:用于數組,以及用于結構和聯合。用于數組的格式:[index] = vol; 其中,index表示數組的下標,vol表示本數組元素的初始化值。
例如:
member-name(成員名稱)
對結構進行指定的初始化時,允許采用簡單的方法對結構中的指定成員進行初始化。
例如:
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中標準的頭文件:
C99新增的頭文件和庫
10.__func__預定義標識符
用于指出__func__所存放的函數名,類似于字符串賦值。
11.其它特性的改動
放寬的轉換限制
限制C89標準C99標準
數據塊的嵌套層數15127
條件語句的嵌套層數8 63
內部標識符中的有效字符個數3163
外部標識符中的有效字符個數631
結構或聯合中的成員個數1271023
函數調用中的參數個數31127
不再支持隱含式的int規則
刪除了隱含式函數聲明
對返回值的約束
C99中,非空類型函數必須使用帶返回值的return語句.
擴展的整數類型
擴展類型 含義
int16_t 整數長度為精確16位
int_least16_t 整數長度為至少16位
int_fast32_t 最穩固的整數類型,其長度為至少32位
intmax_t 最大整數類型
uintmax_t 最大無符號整數類型
對整數類型提升規則的改進:
12.新增數據類型
_Bool
值是0或1。C99中增加了用來定義bool、true以及false宏的頭文件夾,以便程序 員能夠編寫同時兼容于C與C++的應用程序。在編寫新的應用程序時,應該使用頭文件中的bool宏。
_Complex and _Imaginary
C99標準中定義的復數類型如下:float_Complex; float_Imaginary; double_Complex;double_Imaginary; long double_Complex; long double_Imaginary.
頭文件中定義了complex和imaginary宏,并將它們擴展為_Complex和_Imaginary, 因此在編寫新的應用程序時,應該使用頭文件中的complex和imaginary宏。
long long int
C99標準中引進了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能夠支持的整數長度為64位。
這些是主要區別,希望對大家有幫助。
審核編輯 :李倩
在TIOBE 編程語言排行榜中,這幾年C語言基本排名第一、第二,可以說問問的坐在前排。
C標準歷史
然后,也分享過一篇《ANSI 的100年發展歷程》講述了ANSI(美國國家標準協會)100年的發展歷史。
這里再次描述一下C89、C99、C11的歷史:
1983 年,美國國家標準協會(ANSI)組成了一個委員會來創立 C 語言的標準。因為這個標準是 1989年發布的,所以一般簡稱 C89 標準。有些人也把 C89 標準叫做 ANSI C。
在 1990 年, ANSI C89 標準被國際標準化組織(ISO)和國際電工委員會(IEC)采納為國際標準,名叫ISO/IEC 9899:1990 - Programming languages C,有些人簡稱 C90 標準。因此, C89 和 C90 通常指同一個標準,一般更常用 C89 這種說法。
在 2000 年3 月,國際標準化組織(ISO)和國際電工委員會(IEC)采納了第二個 C 語言標準,名叫 ISO/IEC9899:1999 - Programming languages -- C,簡稱 C99 標準。
在 2011 年 12 月,國際標準化組織(ISO)和國際電工委員會(IEC)采納了第三個 C 語言標準,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C,簡稱 C11 標準。
對于我們常用的開發環境 MDK 和 IAR 而已, C89, C99 和 C11 均支持。
C標準目前C99用的最多的,一般來說,C99兼容C89。
C89和C99主要區別
1.對數組的增強
可變長數組
C99中,程序員聲明數組時,數組的維數可以由任一有效的整型表達式確定,包括只在運行時才能確定其值的表達式,這類數組就叫做可變長數組。
但是只有局部數組才可以是變長的,可變長數組的維數在數組生存期內是不變的,也就是說,可變長數組不是動態的,可以變化的只是數組的大小,可以使用*來定義不確定長的可變長數組。
數組聲明中的類型修飾符
在C99中,如果需要使用數組作為函數變元,可以在數組聲明的方括號內使用static關鍵字,這相當于告訴編譯程序,變元所指向的數組將至少包含指定的元素個數。也可以在數組聲明的方括號內使用restrict,volatile,const關鍵字,但只用于函數變元。如果使用restrict,指針是初始訪問該對象的惟一途徑。
如果使用const,指針始終指向同一個數組。使用volatile沒有任何意義。 2.單行注釋
引入了單行注釋標記 "http://" , 可以象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()
-
字符處理
-
錯誤報告
-
定義與實現相關的浮點值勤
-
定義與實現相關的各種極限值
-
支持函數setlocale()
-
數學函數庫使用的各種定義
-
支持非局部跳轉
-
定義信號值
-
支持可變長度的變元列表
-
定義常用常數
-
支持文件輸入和輸出
-
其他各種聲明
-
支持串函數
-
支持系統時間函數
C99新增的頭文件和庫
-
支持復數算法
-
給出對浮點狀態標記和浮點環境的其他方面的訪問
-
定義標準的、可移植的整型類型集合。也支持處理最大寬度整數的函數
-
首先在此1995年第一次修訂時引進,用于定義對應各種運算符的宏
-
支持布爾數據類型類型。定義宏bool,以便兼容于C++
-
定義標準的、可移植的整型類型集合。該文件包含在 中
-
定義一般類型的浮點宏
-
首先在1995年第一次修訂時引進,用于支持多字節和寬字節函數
-
首先在1995年第一次修訂時引進,用于支持多字節和寬字節分類函數
用于指出__func__所存放的函數名,類似于字符串賦值。
11.其它特性的改動
放寬的轉換限制
限制C89標準C99標準
數據塊的嵌套層數15127
條件語句的嵌套層數8 63
內部標識符中的有效字符個數3163
外部標識符中的有效字符個數631
結構或聯合中的成員個數1271023
函數調用中的參數個數31127
不再支持隱含式的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宏的頭文件夾
_Complex and _Imaginary
C99標準中定義的復數類型如下:float_Complex; float_Imaginary; double_Complex;double_Imaginary; long double_Complex; long double_Imaginary.
long long int
C99標準中引進了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能夠支持的整數長度為64位。
這些是主要區別,希望對大家有幫助。
審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
C語言
+關注
關注
180文章
7608瀏覽量
137111 -
編程語言
+關注
關注
10文章
1947瀏覽量
34809
原文標題:C89和C99標準有什么不同?
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
USB-C有哪些變化
USB-C這個小小的標準曾被譽為未來所有線纜需求的解決方案,將電源和數據傳輸與顯示和音頻連接統一起來,如今它已經實現了開創通用端口時代的目標。然而,USB-C 也變成了約翰·卡朋特 (John
指定初始器的使用方法及優點
隨著C語言的發展,C99標準引入了一些新的特性,極大地方便了程序員的編碼工作。其中一個非常實用且強大的功能便是“指定初始器”(Designated Initializers)。在這篇文章中,我們將深入探討指定初始器的使用方法及其
LoRa模塊 WT99C262-SG 開發板使用教程
WT99C262-SG模塊是全新一代的Wi-Fi+BLE+LoRa無線擴頻模塊,基于啟明云端WTLRC262-SG系列模組設計開發的新一代LoRa擴頻芯片方案設計的無線串口模塊。具有多種傳輸方式
keil用c++編譯含有rtos模塊時的錯誤問題怎么解決?
和 rtos,設置使用cpp編譯,c99通過的程序編譯錯誤一大堆,主要在usb和cmsis_os里,這里隨便粘貼其中一條錯誤C:/Users/ME/STM32Cube/Repository
發表于 05-09 08:29
通用FAT文件系統模塊
FatFs 是用于小型嵌入式系統的通用 FAT/exFAT 文件系統模塊。FatFs模塊按照ANSI C(C89)編寫,與磁盤I/O層完全分離。因此它獨立于平臺。它可以集成到資源有限的小型微控制器中,例如 8051、PIC、AVR、ARM、Z80、RX 等。
發表于 05-03 10:28
?225次閱讀
USB-C和TYPE-C有哪些區別
一下USB-C和TYPE-C的定義。USB-C是一種由USB Implementers Forum(USB-IF)制定的通用串行總線(USB)接口標準,也被稱為USB Type-
C語言結構體史上最詳細的講解【軟件干貨】
struct結構體數據類型 前言 我們知道,在C語言中有一些基本的數據類型,如?char?int?float?long?double?string(c99) 等等數據類型,他們可以表示一些事物
USB–C和type–C一樣嗎 type-c和usb-c有什么區別
USB-C和Type-C是同一個東西,它們是互相指代的兩個名稱,用來描述一種新型的連接器標準。USB-C連接器是由USB Implementers Forum(USB-IF)開發的全新
USB-C和Type-C的區別是什么
(Universal Serial Bus Implementers Forum,即通用串行總線執行者論壇)發布,并在接下來幾年內迅速流行起來。USB-C與之前的USB連接標準相比有很多優勢和改進。 首先
評論