C99標準的新特性

2022-06-25 19:42:10 字數 4252 閱讀 8903

c語言的發展歷史大致上分為4個階段:old style c、c89、c99和c11.

c89是最早的c語言規範,於2023年提出,2023年先由ansi(美國國家標準委員會,american national standards institute)推出ansi版本,後來被接納為iso國際標準(iso/iec9899:1990),因而有時也稱為c90,最經典的c語言教材[k&r]就是基於這個版本的,c89是目前最廣泛採用的c語言標準,大多數編譯器都完全支援c89,c99(iso/iec9899:1999)是在2023年推出的,加入了許多新的特性,但目前仍沒有得到廣泛支援,在c99推出之後相當長的一段時間裡,連gcc也沒有完全實現c99的所有特性。2023年12月8號,iso 發布了新的 c 語言的新標準——c11,之前被稱為c1x,官方名稱 iso/iec 9899:2011。

現在介紹一下c99相對於c89或者ansi c的新特性:

complex.h是c標準函式庫中的標頭檔案,提供了複數算術所需要的巨集定義與函式宣告。

#define complex  _complex

#define _complex_i ((const float _complex)__i__)

#define i _complex_i

c99規定了關鍵字_complex。因而有3種複數型別:

次序不是必須遵守的,比如float _complex也可以寫成_complex float。_complex_i擴充套件為型別為const float _complex的常量值,其值為虛數單位。c99規定complex作為巨集擴充套件為_complex。但c++未定義complex巨集。gcc僅支援complex type,不支援imaginary type。因此巨集i擴充套件為_complex_i

裡面還包含了不少支援複數的數學函式(c打頭的就是):

1、ccos,csin,ctan,cacos,casin,catan:複數域內的三角函式,有對應的f和l版本。

2、ccosh,csinh,ctanh,cacosh,casinh,catanh:複數域內的雙曲函式,有對應的f和l版本。

3、cexp,clog,cabs,cpow,csqrt:複數域內的指數、對數、絕對值、冪函式,有對應的f和l版本。

4、carg,cimag,creal,conj,cproj:獲取象限角、虛數部分、實數部分、a=x及b=-y、riemann球上的投影,有對應的f和l版本。

**:

#include#includeint main()  

在初始化結構體和陣列時,可以通過指定具體成員名或陣列下標來賦初值

要指定陣列的索引對應的值,可以在相應的元素值前使用『[index] =』,index必須是常量表示式例如:

int a[6] = ;
等價於:

int a[6] = ;
還可以向下面這樣初始化:

int a[10] = ;
這樣可以只初始化a[1], a[8], a[9]三個元素,其他元素的值為0,等價於:

int a[10] = ;
對於結構體,指定成員名初始化可以使用『.fieldname=』,例如:

struct point ;
接下來初始化:

struct point p = ;  // 等價於 struct point p = ;
還可以使用冒號:

struct point p = ;
當然也可以用在union中:

union foo ;

union foo f = ;

c99允許可以定義乙個長度為變數的陣列(這個陣列的長度可以到執行時才決定)

file *

concat_fopen (char *s1, char *s2, char *mode)

也可以在結構體或是聯合中使用vla:

void foo (int n)

; }

你可以使用alloca函式實現類似的功能,但是alloca函式並不是都實現,從另一角度而言,vla更加的優秀

也可以使用vla作函式引數:

struct entry

tester (int len, char data[len][len])

當然也可以後傳len

struct entry

tester (int len; char data[len][len], int len) //注意分號

示例**:

#includevoid func(int n)

int main()

gcc支援像c++風格的注釋,以『//』開頭直到一行的結束,很多其他支援c99的c編譯器都支援,但是c99之前的版本有可能不支援

參見《c語言柔性陣列》一文

c99支援64位整型,使用long long int 或使用unsigned long long int,將整型常量宣告為long long int,在整數的後面加上『ll』,若為unsigned long long int,則加上『ull』

c/c++中的inline,使用在函式宣告處,表示程式設計師請求編譯器在此函式的被呼叫處將此函式實現插入,而不是像普通函式那樣生成呼叫**(申請是否有效取決於編譯器)。一般地說,這樣作的優點是省掉了呼叫函式的開銷;缺點則是可能會增加代所生成目標**的尺寸

實際上,即使沒有手工指定inline函式,編譯器一般還會選擇一些**量較小但使用頻繁的函式作為inline函式,以此作為效能優化的途徑之一。

和帶參巨集定義(parameterized macro)相比,具備以下優點:

示例**:

static inline int

inc (int *a)

記得以前都是自己寫#define true 1, #define false  0 或者 enum boolean之類的巨集,現在可以使用的bool型別啦

簡單來說復合常量就是允許你定義乙個匿名的結構體或陣列變數。如:

struct foo  structure;

structure = ((struct foo) );

等價於:

;

structure = temp;

}

也可以建立乙個陣列:

char **foo = (char *) ;

static struct foo x = (struct foo) ;

static int y = (int ) ;

static int z = (int [3]) ;

//等價於下面的**:

static struct foo x = ;

static int y = ;

static int z = ;

c99引入了c++中的for迴圈變數初始化方式:

for(int i = 0; i < 10; ++i)
除了寫起來方便以外,迴圈變數的生存週期也被最小化了。這也順便杜絕了那種把迴圈變數帶到迴圈外頭繼續用的惡習

c89中標準的標頭檔案:

定義巨集assert()

字元處理

錯誤報告

定義與實現相關的浮點值勤

定義與實現相關的各種極限值

支援函式setlocale()

數學函式庫使用的各種定義

支援非區域性跳轉

定義訊號值

支援可變長度的引數列表

定義常用常數

支援檔案輸入和輸出

其他各種宣告

字串函式

支援系統時間函式

c99新增的標頭檔案

支援複雜演算法

給出對浮點狀態標記和浮點環境的其他方面的訪問

定義標準的、可移植的整型型別集合,也支援處理最大寬度整數的函式

首先在此2023年第一次修訂時引進,用於定義對應各種運算子的巨集

支援布林資料型別型別,定義巨集bool,以便相容於c++

定義標準的、可移植的整型型別集合,該檔案包含在中

定義一般型別的浮點巨集

首先在2023年第一次修訂時引進,用於支援多位元組和寬位元組函式

首先在2023年第一次修訂時引進,用於支援多位元組和寬位元組分類函式

注意:還有一些新特性未總結進來,待充分理解實踐之後將陸續補充

C99標準之前沒有bool型別(C99提供)

我們知道在c 裡有專門的bool型別,用來表示真或假。但是在c語言裡沒有這樣的型別。表示式的值0為假,非0為真。所以條件判斷語句 if while 非常靈活,甚至乙個指標型別都可以是條件表示式。為了使程式更清晰,我們常常會給出如下的巨集定義 typedef int bool define true ...

C99標準轉義符大全

轉義字元是c語言中表示字元的一種特殊形式。通常使用轉義字元表示ascii碼字符集中不可列印的控制字元和特定功能的字元,如用於表示字元常量的單撇號 用於表示字串常量的雙撇號 和反斜槓 等。轉義字元用反斜槓 後面跟乙個字元或乙個八進位制或十六進製制數表示。轉義字元 意義 ascii碼值 十進位制 a 響...

C99標準中的 main 函式

一 main 函式的形式 在最新的 c99 標準中,只有以下兩種定義方式是正確的 int main void 無引數形式 int main int argc,char argv 帶引數形式 int指明了main 函式的返回型別,函式名後面的圓括號一般包含傳遞給函式的資訊。void表示沒有給函式傳遞引...