編譯器c99
A. c89與c99有什麼區別什麼編譯器支持c89
C99相對C89的區別:
1、增加restrict指針
C99中增加了公適用於指針的restrict類型修飾符,它是初始訪問指針所指對象的惟一途徑,因此只
有藉助restrict指針表達式才能訪問對象。restrict指針指針主要用做函數變元,或者指向由malloc()函
數所分配的內存變數。restrict數據類型不改變程序的語義。
如果某個函數定義了兩個restrict指針變元,編譯程序就假定它們指向兩個不同的對象,memcpy()
函數就是restrict指針的一個典型應用示例。C89中memcpy()函數原型如下:
代碼:
void *memcpy (void *s1, const void *s2, size_t size);如果s1和s2所指向的對象重疊,
其操作就是未定義的。memcpy()函數只能用於不重疊的對象。C99中memcpy()函數原型如下:
代碼:
void *memcpy(void *restrict s1, const void *restrict s2,size_t size);通過使用restrict
修飾s1和s2 變元,可確保它們在該原型中指向不同的對象。
2、inline(內聯)關鍵字
內聯函數除了保持結構化和函數式的定義方式外,還能使程序員寫出高效率的代碼.函數的每次調用與
返回都會消耗相當大的系統資源,尤其是當函數調用發生在重復次數很多的循環語句中時.一般情況下,當發
生一次函數調用時,變元需要進棧,各種寄存器內存需要保存.當函數返回時,寄存器的內容需要恢復。如果該
函數在代碼內進行聯機擴展,當代碼執行時,這些保存和恢復操作旅遊活動會再發生,而且函數調用的執
行速度也會大大加快。函數的聯機擴展會產生較長的代碼,所以只應該內聯對應用程序性能有顯著影響的
函數以及長度較短的函數。
3、新增數據類型
_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位。
4、對數組的增強
可變長數組
C99中,程序員聲明數組時,數組的維數可以由任一有效的整型表達式確定,包括只在運行時才能確定
其值的表達式,這類數組就叫做可變長數組,但是只有局部數組才可以是變長的.
可變長數組的維數在數組生存期內是不變的,也就是說,可變長數組不是動態的.可以變化的只是數組的大小.
可以使用*來定義不確定長的可變長數組。
數組聲明中的類型修飾符
在C99中,如果需要使用數組作為函數變元,可以在數組聲明的方括弧內使用static關鍵字,這相
當於告訴編譯程序,變元所指向的數組將至少包含指定的元素個數。也可以在數組聲明的方括弧內使用
restrict,volatile,const關鍵字,但只用於函數變元。如果使用restrict,指針是初始訪問該對象的惟一途
徑。如果使用const,指針始終指向同一個數組。使用volatile沒有任何意義。
5、單行注釋
引入了單行注釋標記 "//" , 可以象C++一樣使用這種注釋了。
6、分散代碼與聲明
7、預處理程序的修改
a、變元列表
宏可以帶變元,在宏定義中用省略號(...)表示。內部預處理標識符__VA_ARGS__決定變元將在何
處得到替換。例:#define MySum(...) sum(__VA_ARGS__) 語句MySum(k,m,n);
將被轉換成:sum(k, m, n);變元還可以包含變元。例: #define compare(compf, ...)
compf(__VA_ARGS__) 其中的compare(strcmp,"small", "large"); 將替換成:
strcmp("small","large");
b、_Pragma運算符
C99引入了在程序中定義編譯指令的另外一種方法:_Pragma運算符。格式如下:
_Pragma("directive")
其中directive是要滿打滿算的編譯指令。_Pragma運算符允許編譯指令參與宏替換。
c、內部編譯指令
STDCFP_CONTRACT ON/OFF/DEFAULT 若為ON,浮點表達式被當做基於硬體方式處理的獨立
單元。默認值是定義的工具。
STDCFEVN_ACCESS ON/OFF/DEFAULT 告訴編譯程序可以訪問浮點環境。默認值是定義的工具。
STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值為ON,相當於告訴編譯程序某程序某些含
有復數的公式是可靠的。默認是OFF。
d、新增的內部宏
__STDC_HOSTED__ 若操作系統存在,則為1
__STDC_VERSION__ 199991L或更高。代表C的版本
__STDC_IEC_599__ 若支持IEC 60559浮點運算,則為1
__STDC_IEC_599_COMPLEX__ 若支持IEC 60599復數運算,則為1
__STDC_ISO_10646__ 由編譯程序支持,用於說明ISO/IEC 10646標準的年和月格式:
yyymmmL
8、for語句內的變數聲明
C99中,程序員可以在for語句的初始化部分定義一個或多個變數,這些變數的作用域僅於本for語
句所控制的循環體內。比如:
代碼:
for(int i=0; i<10; i++){
// do someting ...
}
9、復合賦值
C99中,復合賦值中,可以指定對象類型的數組、結構或聯合表達式。當使用復合賦值時,應在括弧
內指定類型,後跟由花括弧圍起來的初始化列表;若類型為數組,則不能指定數組的大小。建成的對象是
未命名的。
例: double *fp = (double[]) {1.1, 2.2, 3.3};
該語句用於建立一個指向double的指針fp,且該指針指向這個3元素數組的第一個元素。 在文件
域內建立的復合賦值只在程序的整個生存期內有效。在模塊內建立的復合賦值是局部對象,在退出模塊後
不再存在。
10、柔性數組結構成員
C99中,結構中的最後一個元素允許是未知大小的數組,這就叫做柔性數組成員,但結構中的柔性數
組成員前面必須至少一個其他成員。柔性數組成員允許結構中包含一個大小可變的數組。sizeof返回的這
種結構大小不包括柔性數組的內存。包含柔性數組成員的結構用malloc()函數進行內存的動態分配,並且
分配的內存應該大於結構的大小,以適應柔性數組的預期大小。
11、指定的初始化符
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。對結構成員進行初始化的順序沒有限制。
12、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,但不起作用。
13、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年第一次修訂時引進,用於支持多位元組和寬位元組分類函數
14、__func__預定義標識符
用於指出__func__所存放的函數名,類似於字元串賦值。
15、其它特性的改動
放寬的轉換限制
限制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類型.
B. C語言里,編譯器不支持c99的IDE規定的數組只是定義長度時不能是變數,
在有的編譯器中數組在定義時用的必須是常量,不能是變數。在有的編譯器里其實也可以用變數的,只是不推薦使用,好像C99通過了數組定義時用變數,但是有的編譯器還不能這樣做,你大概是用到了這樣的編譯器了
C. 求C99的編譯器!!
GCC對C99支持較好,windows下使用gcc可以參考:
http://www.cnblogs.com/xusw/p/3617572.html
推薦使用TDM-GCC&Notepad++
相讓讓gcc識別C99語法,需要加編譯選項-std=c99
比如編譯如下代碼(c99test.c):
#include<stdio.h>
intmain()
{
intn;
scanf("%d",&n);
for(inti=0;i<10;i++)
printf("%d ");
return0;
}

直接編譯,可以看到error消息,同時提示你使用 -std=c99 選項來編譯;
使用-std=c99編譯成功
D. 哪些編譯器支持C99
尚沒有完全支持C99的編譯器 目前支持最好的是GCC
E. 什麼是C99
我用C51寫過單片,知道一點C99,C99有一部分是對於大字元集的優化(很多資料上寫的是ANSI標准化),還加入了一些資料庫函數,是C89之後的標准,我們用的C是C89標準的,C++是C89編寫的,目前的C99標准其實在以前的編譯器中就或多或少的支持了,目前完全支持的有這些:
MinGW、Borland C++、dev-C++
F. 請問什麼編譯器支持c99標准
告訴你一個壞消息
vc++
2005支持的是c89
而不是c99
這點可以在一次對vs2005的負責人的采訪中看出來
他解釋了為什麼vs2005支持c89
而不支持c99
目前完全支持c99標準的編譯器還不存在
支持部分c99標準的編譯器也不多
做的最好的是gcc
G. 請問什麼編譯器支持c99標准
告訴你一個壞消息
vc++
2005支持的是c89
而不是c99
這點可以在一次對vs2005的負責人的采訪中看出來
他解釋了為什麼vs2005支持c89
而不支持c99
目前完全支持c99標準的編譯器還不存在
支持部分c99標準的編譯器也不多
做的最好的是gcc
H. 如何知道當前編譯器是否是C99標準的有什麼指令可以查到
#include<stdio.h>
int main()
{
#if (!defined(__STDC__))
 printf("非標准C!");
#elif defined(__STDC_VERSION__)
 printf("標准C版本:%ld。", __STDC_VERSION__);
#else
 printf("舊的標准C。");
#endif
 getchar();
 return 0;
}
預定義宏__STDC__表示標准C。__STDC_VERSION__表示標准C版本。C99對應的是199901L。
(注意有些編譯器默認沒有定義__STDC_VERSION__,甚至沒定義__STDC__。所以查編譯器手冊更保險一點。)
====
[原創回答團]
I. 哪些編譯器支持C99標准
很多 大多數主流編譯器都支持的。
比如 VS的新版本。
gcc。 以及以gcc為基礎的,mingw, dev-C, code::block...
J. 支持C99編譯器
AMD x86 Open64 Compiler Suite    Mostly    Has C99 support equal to that of GCC.[1]    
Ch    Partial    Supports major C99 features.[2]    
Clang    Mostly    Does not support C99 floating-point pragmas.[3]    
GCC    Mostly    As of January 2011[update] and GCC 4.5, 12 features suffer library issues, 1 feature is broken and 6 are missing. 43 C99 features have been completely implemented, however many features still remain unimplemented.[4]    
Intel C++ compiler    Mostly    long double is not supported.    
Open Watcom    Partial    Implements the most-used parts of the standard. However, they are enabled only through an undocumented command-line switch.[5]    
Pelles C    Mostly    Supports most C99 features.    
Portable C compiler    Partial    Working towards becoming C99-compliant.    
Sun Studio    Full[6]    
Tiny C Compiler    Mostly    Does not support complex numbers or variable length arrays.[7] The developers state that "TCC is heading toward full ISOC99 compliance".[8]    
IBM C for AIX, V6 [9]and XL C/C++ V11.1 for AIX [10]    ?    
IBM Rational logiscope    Full    Until Logiscope 6.3, only basic constructs of C99 were supported. C99 is officially supported in Logiscope 6.4 and later versions.[11]    
Microsoft Visual Studio    No    As of Visual Studio 2010, there are no plans to support C99.[12][13]    
 
看上面的支持列表,完全支持C99的只有Sun Studio和IBM Rational logiscope,
VC直到2010都沒有計劃支持C99。
補充:
在C99中包括的特性有:  
對編譯器限制增加了,比如源程序每行要求至少支持到   4095   位元組,變數名函數名的要求支持到   63   位元組   (extern   要求支持到   31)   
預處理增強了。例如:   
宏支持取參數   #define   Macro(...)   __VA_ARGS__   
使用宏的時候,參數如果不寫,宏里用   #,##   這樣的東西會擴展成空串。(以前會出錯的)   
支持   //   行注釋(這個特性實際上在C89的很多編譯器上已經被支持了)   
增加了新關鍵字   restrict,   inline,   _Complex,   _Imaginary,   _Bool   
支持   long   long,   long   double   _Complex,   float   _Complex   這樣的類型   
支持   <:   :>   <%   %>   %:   %:%:   ,等等奇怪的符號替代,D&E   里提過這個   
支持了不定長的數組。數組的長度就可以用變數了。聲明類型的時候呢,就用   int   a[*]   這樣的寫法。不過考慮到效率和實現,這玩意並不是一個新類型。所以就不能用在全局裡,或者   struct   union   裡面,如果你用了這樣的東西,goto   語句就受限制了。   
變數聲明不必放在語句塊的開頭,for   語句提倡這么寫   for(int   i=0;i <100;++i)   就是說,int   i   的聲明放在裡面,i   只在   for   裡面有效。(VC沒有遵守這條標准,i   在   for   外也有效)   
當一個類似結構的東西需要臨時構造的時候,可以用   (type_name){xx,xx,xx}   這有點像   C++   的構造函數   
初始化結構的時候現在可以這樣寫:   
struct   {int   a[3],   b;}   hehe[]   =   {   [0].a   =   {1},   [1].a   =   2   };   
struct   {int   a,   b,   c,   d;}   hehe   =   {   .a   =   1,   .c   =   3,   4,   .b   =   5}   //   3,4   是對   .c,.d   賦值的  
字元串裡面,\u   支持   unicode   的字元   
支持   16   進制的浮點數的描述   
所以   printf   scanf   的格式化串多支持了   ll   /   LL   (VC6   里用的   I64)   對應新的   long   long   類型。   
浮點數的內部數據描述支持了新標准,這個可以用   #pragma   編譯器指定   
除了已經有的   __line__   __file__   以外,又支持了一個   __func__   可以得到當前的函數名   
對於非常數的表達式,也允許編譯器做化簡   
修改了對於   /   %   處理負數上的定義,比如老的標准里   -22   /   7   =   -3,   -22   %   7   =   -1   而現在   -22   /   7   =   -4,   -22   %   7   =   6   
取消了不寫函數返回類型默認就是   int   的規定   
允許   struct   定義的最後一個數組寫做   []   不指定其長度描述   
const   const   int   i;   將被當作   const   int   i;   處理   
增加和修改了一些標准頭文件,   比如定義   bool   的   <stdbool.h>   定義一些標准長度的   int   的   <inttypes.h>   定義復數的   <complex.h>   定義寬字元的   <wctype.h>   有點泛型味道的數學函數   <tgmath.h>   跟浮點數有關的   <fenv.h> 。 <stdarg.h>   里多了一個   va_   可以復制   ...   的參數。 <time.h>   里多了個   struct   tmx   對   struct   tm   做了擴展   
輸入輸出對寬字元還有長整數等做了相應的支持   
相對於c89的變化還有  
1、增加restrict指針   
C99中增加了公適用於指針的restrict類型修飾符,它是初始訪問指針所指對象的惟一途徑,因此只有藉助restrict指針表達式才能訪問對象。restrict指針指針主要用做函數變元,或者指向由malloc()函數所分配的內存變數。restrict數據類型不改變程序的語義。   
如果某個函數定義了兩個restrict指針變元,編譯程序就假定它們指向兩個不同的對象,memcpy()函數就是restrict指針的一個典型應用示例。C89中memcpy()函數原型如下:  
代碼:   void   *memcpy   (void   *s1,   const   void   *s2,   size_t   size);   
如果s1和s2所指向的對象重疊,其操作就是未定義的。memcpy()函數只能用於不重疊的對象。C99中memcpy()函數原型如下:代碼:   void   *memcpy(void   *restrict   s1,   const   void   *restrict   s2,size_t   size);  
通過使用restrict修飾s1和s2   變元,可確保它們在該原型中指向不同的對象。  
2、inline(內聯)關鍵字   
內聯函數除了保持結構化和函數式的定義方式外,還能使程序員寫出高效率的代碼.函數的每次調用與返回都會消耗相當大的系統資源,尤其是當函數調用發生在重復次數很多的循環語句中時.一般情況下,當發生一次函數調用時,變元需要進棧,各種寄存器內存需要保存.當函數返回時,寄存器的內容需要恢復。如果該函數在代碼內進行聯機擴展,當代碼執行時,這些保存和恢復操作旅遊活動會再發生,而且函數調用的執行速度也會大大加快。函數的聯機擴展會產生較長的代碼,所以只應該內聯對應用程序性能有顯著影響的函數以及長度較短的函數  
3、新增數據類型   
_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位。  
4、對數組的增強   
可變長數組   
C99中,程序員聲明數組時,數組的維數可以由任一有效的整型表達式確定,包括只在運行時才能確定其值的表達式,這類數組就叫做可變長數組,但是只有局部數組才可以是變長的.   
可變長數組的維數在數組生存期內是不變的,也就是說,可變長數組不是動態的.可以變化的只是數組的大小.可以使用*來定義不確定長的可變長數組。  
數組聲明中的類型修飾符   
在C99中,如果需要使用數組作為函數變元,可以在數組聲明的方括弧內使用static關鍵字,這相當於告訴編譯程序,變元所指向的數組將至少包含指定的元素個數。也可以在數組聲明的方括弧內使用restrict,volatile,const關鍵字,但只用於函數變元。如果使用restrict,指針是初始訪問該對象的惟一途徑。如果使用const,指針始終指向同一個數組。使用volatile沒有任何意義。   
5、單行注釋   
引入了單行注釋標記   "// "   ,   可以象C++一樣使用這種注釋了。  
6、分散代碼與聲明  
7、預處理程序的修改   
a、變元列表   
宏可以帶變元,在宏定義中用省略號(...)表示。內部預處理標識符__VA_ARGS__決定變元將在何處得到替換。例:#define   MySum(...)   sum(__VA_ARGS__)   語句MySum(k,m,n);   
將被轉換成:sum(k,   m,   n);   變元還可以包含變元。例:   #define   compare(compf,   ...)   compf(__VA_ARGS__)   其中的compare(strcmp, "small ",   "large ");   將替換成:strcmp( "small ", "large ");   
b、_Pragma運算符   
C99引入了在程序中定義編譯指令的另外一種方法:_Pragma運算符。格式如下:   
_Pragma( "directive ")   
其中directive是要滿打滿算的編譯指令。_Pragma運算符允許編譯指令參與宏替換。   
c、內部編譯指令   
STDCFP_CONTRACT   ON/OFF/DEFAULT   若為ON,浮點表達式被當做基於硬體方式處理的獨立單元。默認值是定義的工具。   
STDCFEVN_ACCESS   ON/OFF/DEFAULT   告訴編譯程序可以訪問浮點環境。默認值是定義的工具。   
STDC   CX_LIMITED_RANGE   ON/OFF/DEFAULT   若值為ON,相當於告訴編譯程序某程序某些含有復數的公式是可靠的。默認是OFF。   
d、新增的內部宏   
__STDC_HOSTED__   若操作系統存在,則為1   
__STDC_VERSION__   199991L或更高。代表C的版本   
__STDC_IEC_599__   若支持IEC   60559浮點運算,則為1   
__STDC_IEC_599_COMPLEX__   若支持IEC   60599復數運算,則為1   
__STDC_ISO_10646__   由編譯程序支持,用於說明ISO/IEC   10646標準的年和月格式:yyymmmL  
9、復合賦值   
C99中,復合賦值中,可以指定對象類型的數組、結構或聯合表達式。當使用復合賦值時,應在括弧內指定類型,後跟由花括弧圍起來的初始化列表;若類型為數組,則不能指定數組的大小。建成的對象是未命名的。   
例:   double   *fp   =   (double[])   {1.1,   2.2,   3.3};   
該語句用於建立一個指向double的指針fp,且該指針指向這個3元素數組的第一個元素。   在文件域內建立的復合賦值只在程序的整個生存期內有效。在模塊內建立的復合賦值是局部對象,在退出模塊後不再存在。  
10、柔性數組結構成員   
C99中,結構中的最後一個元素允許是未知大小的數組,這就叫做柔性數組成員,但結構中的柔性數組成員前面必須至少一個其他成員。柔性數組成員允許結構中包含一個大小可變的數組。sizeof返回的這種結構大小不包括柔性數組的內存。包含柔性數組成員的結構用malloc()函數進行內存的動態分配,並且分配的內存應該大於結構的大小,以適應柔性數組的預期大小。  
11、指定的初始化符   
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。對結構成員進行初始化的順序沒有限制。  
12、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,但不起作用。  
13、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年第一次修訂時引進,用於支持多位元組和寬位元組分類函數  
14、__func__預定義標識符   
用於指出__func__所存放的函數名,類似於字元串賦值。  
15、其它特性的改動  
放寬的轉換限制  
限制   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類型.  
但是各個公司對C99的支持所表現出來的興趣不同。當GCC和其它一些商業編譯器支持C99的大部分特性的時候,微軟和Borland卻似乎對此不感興趣。
