0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C89和C99標(biāo)準(zhǔn)有什么不同?

strongerHuang ? 來(lái)源:嵌入式專(zhuān)欄 ? 2023-01-09 09:39 ? 次閱讀
C語(yǔ)言是一門(mén)經(jīng)典的編程語(yǔ)言,經(jīng)過(guò)這么多年,依然是一門(mén)很熱的編程語(yǔ)言。
TIOBE 編程語(yǔ)言排行榜中,這幾年C語(yǔ)言基本排名第一、第二,可以說(shuō)問(wèn)問(wèn)的坐在前排。

9fd0fff6-8fba-11ed-bfe3-dac502259ad0.png



今天給大家分享一下C89和C99的區(qū)別。

C標(biāo)準(zhǔn)歷史

C語(yǔ)言的發(fā)展至今超過(guò)了50年,之前為大家分享過(guò)C語(yǔ)言編譯器的來(lái)源其描述了C語(yǔ)言最初的發(fā)展情況。

然后,也分享過(guò)一篇《ANSI 的100年發(fā)展歷程》講述了ANSI(美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì))100年的發(fā)展歷史。
這里再次描述一下C89、C99、C11的歷史:
1983 年,美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)組成了一個(gè)委員會(huì)來(lái)創(chuàng)立 C 語(yǔ)言的標(biāo)準(zhǔn)。因?yàn)檫@個(gè)標(biāo)準(zhǔn)是 1989年發(fā)布的,所以一般簡(jiǎn)稱(chēng) C89 標(biāo)準(zhǔn)。有些人也把 C89 標(biāo)準(zhǔn)叫做 ANSI C。

在 1990 年, ANSI C89 標(biāo)準(zhǔn)被國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)采納為國(guó)際標(biāo)準(zhǔn),名叫ISO/IEC 9899:1990 - Programming languages C,有些人簡(jiǎn)稱(chēng) C90 標(biāo)準(zhǔn)。因此, C89 和 C90 通常指同一個(gè)標(biāo)準(zhǔn),一般更常用 C89 這種說(shuō)法。

在 2000 年3 月,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)采納了第二個(gè) C 語(yǔ)言標(biāo)準(zhǔn),名叫 ISO/IEC9899:1999 - Programming languages -- C,簡(jiǎn)稱(chēng) C99 標(biāo)準(zhǔn)。

在 2011 年 12 月,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)采納了第三個(gè) C 語(yǔ)言標(biāo)準(zhǔn),名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C,簡(jiǎn)稱(chēng) C11 標(biāo)準(zhǔn)。

對(duì)于我們常用的開(kāi)發(fā)環(huán)境 MDK 和 IAR 而已, C89, C99 和 C11 均支持。


9fdf917e-8fba-11ed-bfe3-dac502259ad0.png

C標(biāo)準(zhǔn)目前C99用的最多的,一般來(lái)說(shuō),C99兼容C89。

C89和C99主要區(qū)別

這里總結(jié)一下主要區(qū)別:
1.對(duì)數(shù)組的增強(qiáng)
可變長(zhǎng)數(shù)組

C99中,程序員聲明數(shù)組時(shí),數(shù)組的維數(shù)可以由任一有效的整型表達(dá)式確定,包括只在運(yùn)行時(shí)才能確定其值的表達(dá)式,這類(lèi)數(shù)組就叫做可變長(zhǎng)數(shù)組。

但是只有局部數(shù)組才可以是變長(zhǎng)的,可變長(zhǎng)數(shù)組的維數(shù)在數(shù)組生存期內(nèi)是不變的,也就是說(shuō),可變長(zhǎng)數(shù)組不是動(dòng)態(tài)的,可以變化的只是數(shù)組的大小,可以使用*來(lái)定義不確定長(zhǎng)的可變長(zhǎng)數(shù)組。
數(shù)組聲明中的類(lèi)型修飾符
在C99中,如果需要使用數(shù)組作為函數(shù)變?cè)?,可以在?shù)組聲明的方括號(hào)內(nèi)使用static關(guān)鍵字,這相當(dāng)于告訴編譯程序,變?cè)赶虻臄?shù)組將至少包含指定的元素個(gè)數(shù)。也可以在數(shù)組聲明的方括號(hào)內(nèi)使用restrict,volatile,const關(guān)鍵字,但只用于函數(shù)變?cè)H绻褂胷estrict,指針是初始訪問(wèn)該對(duì)象的惟一途徑。




如果使用const,指針始終指向同一個(gè)數(shù)組。使用volatile沒(méi)有任何意義。
2.單行注釋

引入了單行注釋標(biāo)記 "http://" , 可以象C++一樣使用這種注釋了。


3.分散代碼與聲明

預(yù)處理程序的修改
4.for語(yǔ)句內(nèi)的變量聲明

C99中,程序員可以在for語(yǔ)句的初始化部分定義一個(gè)或多個(gè)變量,這些變量的作用域僅于本for語(yǔ)句所控制的循環(huán)體內(nèi)。比如代碼:
for(int i=0; i<10; i++){




    // do someting ...




}

5.復(fù)合賦值

C99中,復(fù)合賦值中,可以指定對(duì)象類(lèi)型的數(shù)組、結(jié)構(gòu)或聯(lián)合表達(dá)式。當(dāng)使用復(fù)合賦值時(shí),應(yīng)在括弧內(nèi)指定類(lèi)型,后跟由花括號(hào)圍起來(lái)的初始化列表;若類(lèi)型為數(shù)組,則不能指定數(shù)組的大小。建成的對(duì)象是未命名的。
例:
double *fp = (double[]) {1.1, 2.2, 3.3};


該語(yǔ)句用于建立一個(gè)指向double的指針fp,且該指針指向這個(gè)3元素?cái)?shù)組的第一個(gè)元素。在文件域內(nèi)建立的復(fù)合賦值只在程序的整個(gè)生存期內(nèi)有效。在模塊內(nèi)建立的復(fù)合賦值是局部對(duì)象,在退出模塊后不再存在。

6.指定的初始化符

C99中,該特性對(duì)經(jīng)常使用稀疏數(shù)組的程序員十分有用。指定的初始化符通常有兩種用法:用于數(shù)組,以及用于結(jié)構(gòu)和聯(lián)合。用于數(shù)組的格式:[index] = vol; 其中,index表示數(shù)組的下標(biāo),vol表示本數(shù)組元素的初始化值。
例如:
int x[10] = {[0] = 10, [5] = 30};


其中只有x[0]和x[5]得到了初始化.用于結(jié)構(gòu)或聯(lián)合的格式如下:

member-name(成員名稱(chēng))
對(duì)結(jié)構(gòu)進(jìn)行指定的初始化時(shí),允許采用簡(jiǎn)單的方法對(duì)結(jié)構(gòu)中的指定成員進(jìn)行初始化。
例如:
struct example{ int k, m, n; } object = {m = 10,n = 200};


其中,沒(méi)有初始化k。對(duì)結(jié)構(gòu)成員進(jìn)行初始化的順序沒(méi)有限制。
7.printf()和scanf()函數(shù)系列的增強(qiáng)
C99中printf()和scanf()函數(shù)系列引進(jìn)了處理long long int和unsigned long long int數(shù)據(jù)類(lèi)型的特性。long long int 類(lèi)型的格式修飾符是ll。
在printf()和scanf()函數(shù)中,ll適用于d, i, o, u 和x格式說(shuō)明符。
另外,C99還引進(jìn)了hh修飾符。當(dāng)使用d, i, o, u和x格式說(shuō)明符時(shí),hh用于指定char型變?cè)?。ll和hh修飾符均可以用于n說(shuō)明符。
格式修飾符a和A用在printf()函數(shù)中時(shí),結(jié)果將會(huì)輸出十六進(jìn)制的浮點(diǎn)數(shù)。格式如下:[-]0xh, hhhhp + d 使用A格式修飾符時(shí),x和p必須是大寫(xiě)。A和a格式修飾符也可以用在scanf()函數(shù)中,用于讀取浮點(diǎn)數(shù)。調(diào)用printf()函數(shù)時(shí),允許在%f說(shuō)明符前加上l修飾符,即%lf,但不起作用。
8.C99新增的庫(kù)
C89中標(biāo)準(zhǔn)的頭文件:
  • 定義宏assert()


  • 字符處理


  • 錯(cuò)誤報(bào)告


  • 定義與實(shí)現(xiàn)相關(guān)的浮點(diǎn)值勤


  • 定義與實(shí)現(xiàn)相關(guān)的各種極限值


  • 支持函數(shù)setlocale()


  • 數(shù)學(xué)函數(shù)庫(kù)使用的各種定義


  • 支持非局部跳轉(zhuǎn)




  • 支持可變長(zhǎng)度的變?cè)斜?/span>


  • 定義常用常數(shù)


  • 支持文件輸入和輸出


  • 其他各種聲明


  • 支持串函數(shù)


  • 支持系統(tǒng)時(shí)間函數(shù)

C99新增的頭文件和庫(kù)
  • 支持復(fù)數(shù)算法
  • 給出對(duì)浮點(diǎn)狀態(tài)標(biāo)記和浮點(diǎn)環(huán)境的其他方面的訪問(wèn)
  • 定義標(biāo)準(zhǔn)的、可移植的整型類(lèi)型集合。也支持處理最大寬度整數(shù)的函數(shù)
  • 首先在此1995年第一次修訂時(shí)引進(jìn),用于定義對(duì)應(yīng)各種運(yùn)算符的宏
  • 支持布爾數(shù)據(jù)類(lèi)型類(lèi)型。定義宏bool,以便兼容于C++
  • 定義標(biāo)準(zhǔn)的、可移植的整型類(lèi)型集合。該文件包含在
  • 定義一般類(lèi)型的浮點(diǎn)宏
  • 首先在1995年第一次修訂時(shí)引進(jìn),用于支持多字節(jié)和寬字節(jié)函數(shù)
  • 首先在1995年第一次修訂時(shí)引進(jìn),用于支持多字節(jié)和寬字節(jié)分類(lèi)函數(shù)
10.__func__預(yù)定義標(biāo)識(shí)符
用于指出__func__所存放的函數(shù)名,類(lèi)似于字符串賦值。
11.其它特性的改動(dòng)

放寬的轉(zhuǎn)換限制

限制C89標(biāo)準(zhǔn)C99標(biāo)準(zhǔn)

數(shù)據(jù)塊的嵌套層數(shù)15127
條件語(yǔ)句的嵌套層數(shù)8 63
內(nèi)部標(biāo)識(shí)符中的有效字符個(gè)數(shù)3163
外部標(biāo)識(shí)符中的有效字符個(gè)數(shù)631
結(jié)構(gòu)或聯(lián)合中的成員個(gè)數(shù)1271023
函數(shù)調(diào)用中的參數(shù)個(gè)數(shù)31127
不再支持隱含式的int規(guī)則
刪除了隱含式函數(shù)聲明
對(duì)返回值的約束
C99中,非空類(lèi)型函數(shù)必須使用帶返回值的return語(yǔ)句.
擴(kuò)展的整數(shù)類(lèi)型
擴(kuò)展類(lèi)型 含義
int16_t 整數(shù)長(zhǎng)度為精確16位
int_least16_t 整數(shù)長(zhǎng)度為至少16位
int_fast32_t 最穩(wěn)固的整數(shù)類(lèi)型,其長(zhǎng)度為至少32位
intmax_t 最大整數(shù)類(lèi)型
uintmax_t 最大無(wú)符號(hào)整數(shù)類(lèi)型
對(duì)整數(shù)類(lèi)型提升規(guī)則的改進(jìn):
  • C89中,表達(dá)式中類(lèi)型為char,short int或int的值可以提升為int或unsigned int類(lèi)型.


  • C99中,每種整數(shù)類(lèi)型都有一個(gè)級(jí)別.例如:long long int 的級(jí)別高于int, int的級(jí)別高于char


  • 等.在表達(dá)式中,其級(jí)別低于int或unsigned int的任何整數(shù)類(lèi)型均可被替換成int或unsigned int類(lèi)型.

12.新增數(shù)據(jù)類(lèi)型
_Bool
值是0或1。C99中增加了用來(lái)定義bool、true以及false宏的頭文件夾,以便程序員能夠編寫(xiě)同時(shí)兼容于C與C++的應(yīng)用程序。在編寫(xiě)新的應(yīng)用程序時(shí),應(yīng)該使用頭文件中的bool宏。

_Complex and _Imaginary
C99標(biāo)準(zhǔn)中定義的復(fù)數(shù)類(lèi)型如下:float_Complex; float_Imaginary; double_Complex;double_Imaginary; long double_Complex; long double_Imaginary.
頭文件中定義了complex和imaginary宏,并將它們擴(kuò)展為_(kāi)Complex和_Imaginary,因此在編寫(xiě)新的應(yīng)用程序時(shí),應(yīng)該使用頭文件中的complex和imaginary宏。
long long int
C99標(biāo)準(zhǔn)中引進(jìn)了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能夠支持的整數(shù)長(zhǎng)度為64位。
這些是主要區(qū)別,希望對(duì)大家有幫助。
審核編輯 :李倩



聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7595

    瀏覽量

    135924
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1931

    瀏覽量

    34553

原文標(biāo)題:C89和C99標(biāo)準(zhǔn)有什么不同?

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    USB-C哪些變化

    USB-C這個(gè)小小的標(biāo)準(zhǔn)曾被譽(yù)為未來(lái)所有線纜需求的解決方案,將電源和數(shù)據(jù)傳輸與顯示和音頻連接統(tǒng)一起來(lái),如今它已經(jīng)實(shí)現(xiàn)了開(kāi)創(chuàng)通用端口時(shí)代的目標(biāo)。然而,USB-C 也變成了約翰·卡朋特 (John
    的頭像 發(fā)表于 11-13 11:26 ?87次閱讀
    USB-<b class='flag-5'>C</b><b class='flag-5'>有</b>哪些變化

    指定初始器的使用方法及優(yōu)點(diǎn)

    隨著C語(yǔ)言的發(fā)展,C99標(biāo)準(zhǔn)引入了一些新的特性,極大地方便了程序員的編碼工作。其中一個(gè)非常實(shí)用且強(qiáng)大的功能便是“指定初始器”(Designated Initializers)。在這篇文章中,我們將深入探討指定初始器的使用方法及其
    的頭像 發(fā)表于 08-29 09:51 ?248次閱讀

    DS89C21差分CMOS線路驅(qū)動(dòng)器和接收器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《DS89C21差分CMOS線路驅(qū)動(dòng)器和接收器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-05 09:57 ?0次下載
    DS<b class='flag-5'>89C</b>21差分CMOS線路驅(qū)動(dòng)器和接收器數(shù)據(jù)表

    STVD是不是不支持C99?

    內(nèi)容如標(biāo)題所示,麻煩懂的朋友告訴下我,這個(gè)問(wèn)題花費(fèi)我很多時(shí)間了。 不知道STVD是不是不支持C99??
    發(fā)表于 05-16 08:04

    LoRa模塊 WT99C262-SG 開(kāi)發(fā)板使用教程

    WT99C262-SG模塊是全新一代的Wi-Fi+BLE+LoRa無(wú)線擴(kuò)頻模塊,基于啟明云端WTLRC262-SG系列模組設(shè)計(jì)開(kāi)發(fā)的新一代LoRa擴(kuò)頻芯片方案設(shè)計(jì)的無(wú)線串口模塊。具有多種傳輸方式
    的頭像 發(fā)表于 05-16 08:03 ?691次閱讀
    LoRa模塊 WT<b class='flag-5'>99C</b>262-SG 開(kāi)發(fā)板使用教程

    keil用c++編譯含有rtos模塊時(shí)的錯(cuò)誤問(wèn)題怎么解決?

    和 rtos,設(shè)置使用cpp編譯,c99通過(guò)的程序編譯錯(cuò)誤一大堆,主要在usb和cmsis_os里,這里隨便粘貼其中一條錯(cuò)誤C:/Users/ME/STM32Cube/Repository
    發(fā)表于 05-09 08:29

    USB-C和TYPE-C哪些區(qū)別

    一下USB-C和TYPE-C的定義。USB-C是一種由USB Implementers Forum(USB-IF)制定的通用串行總線(USB)接口標(biāo)準(zhǔn),也被稱(chēng)為USB Type-
    的頭像 發(fā)表于 04-03 15:33 ?4829次閱讀
    USB-<b class='flag-5'>C</b>和TYPE-<b class='flag-5'>C</b><b class='flag-5'>有</b>哪些區(qū)別

    C語(yǔ)言結(jié)構(gòu)體史上最詳細(xì)的講解【軟件干貨】

    struct結(jié)構(gòu)體數(shù)據(jù)類(lèi)型 前言 我們知道,在C語(yǔ)言中有一些基本的數(shù)據(jù)類(lèi)型,如?char?int?float?long?double?string(c99) 等等數(shù)據(jù)類(lèi)型,他們可以表示一些事物
    的頭像 發(fā)表于 03-28 17:52 ?682次閱讀

    內(nèi)聯(lián)函數(shù)定義 為什么需要內(nèi)聯(lián)函數(shù)

    inline關(guān)鍵字是C99標(biāo)準(zhǔn)的型關(guān)鍵字,其作用是將函數(shù)展開(kāi),把函數(shù)的代碼復(fù)制到每一個(gè)調(diào)用處。
    的頭像 發(fā)表于 02-19 12:20 ?507次閱讀

    type-c和usb-c什么區(qū)別

    type-c和usb-c什么區(qū)別? Type-C 和 USB-C 都是指同一個(gè)連接標(biāo)準(zhǔn),它使用
    的頭像 發(fā)表于 02-19 10:00 ?2480次閱讀

    USB–C和type–C一樣嗎 type-c和usb-c什么區(qū)別

    USB-C和Type-C是同一個(gè)東西,它們是互相指代的兩個(gè)名稱(chēng),用來(lái)描述一種新型的連接器標(biāo)準(zhǔn)。USB-C連接器是由USB Implementers Forum(USB-IF)開(kāi)發(fā)的全新
    的頭像 發(fā)表于 01-18 09:52 ?8327次閱讀

    汽車(chē)電子行業(yè)的MISRA C標(biāo)準(zhǔn)解讀

    之前分享了一些編程規(guī)范相關(guān)的文章,位讀者提到了汽車(chē)電子行業(yè)的MISRA C標(biāo)準(zhǔn),說(shuō)這個(gè)很不錯(cuò)。
    的頭像 發(fā)表于 01-17 11:03 ?1106次閱讀

    USB-C和Type-C的區(qū)別是什么

    (Universal Serial Bus Implementers Forum,即通用串行總線執(zhí)行者論壇)發(fā)布,并在接下來(lái)幾年內(nèi)迅速流行起來(lái)。USB-C與之前的USB連接標(biāo)準(zhǔn)相比很多優(yōu)勢(shì)和改進(jìn)。 首先
    的頭像 發(fā)表于 01-11 09:35 ?3359次閱讀

    C語(yǔ)言和C++中那些不同的地方

    C語(yǔ)言雖說(shuō)經(jīng)常和C++在一起被大家提起,但可千萬(wàn)不要以為它們是一個(gè)東西?,F(xiàn)在我們常用的C語(yǔ)言是C89標(biāo)準(zhǔn),
    的頭像 發(fā)表于 12-07 14:29 ?894次閱讀
    <b class='flag-5'>C</b>語(yǔ)言和<b class='flag-5'>C</b>++中那些不同的地方

    USB-C為何還不能統(tǒng)一所接口?

    USB-C為何還不能統(tǒng)一所接口? USB-C(全稱(chēng)為USB Type-C)是一種通用連接標(biāo)準(zhǔn),被廣泛運(yùn)用于各類(lèi)設(shè)備中,包括電腦、平板、手機(jī)
    的頭像 發(fā)表于 11-28 15:10 ?618次閱讀