C語言是一種計算機程式設計語言。它既有進階語言的特點,又具有彙編語言的特點。它可以作為系統設計語言,編寫工作系統應用程式,也可以作為應用程式設計語言,編寫不依賴計算機硬體的應用程式。是以,它的應用範圍廣泛。 在初學C語言時,可能會遇到有些問題了解不透,或者表達方式與以往數學學習中不同(如運算符等),這就要求不氣餒,不明白的地方多問多想,鼓足勇氣進行學習,待學完後面的章節知識,前面的問題也就迎刃而解了,這一方面我感覺是我們同學最欠缺,大多學不好的就是因為一開始遇到困難就放棄,曾經和好多同學談他的問題,回答是聽不懂、不想聽、放棄這樣三個過程,我反問,這節課你聽過課嗎?回答又是沒有,根本就沒聽過課,怎麼說自己聽不懂呢?相應的根本就沒學習,又談何學的好?
學習C語言始終要記住“曙光在前頭”和“千金難買回頭看”,“千金難買回頭看”是學習知識的重要方法,就是說,學習後面的知識,不要忘了回頭弄清遺留下的問題和加深了解前面的知識,這是我們學生最不易做到的,然而卻又是最重要的。學習C語言就是要經過幾個反複,才能前後貫穿,積累應該掌握的C知識。
那麼,我們如何學好《C程式設計》呢?
一.學好C語言的運算符和運算順序
這是學好《C程式設計》的基礎,C語言的運算非常靈活,功能十分豐富,運算種類遠多于其它程式設計語言。在表達式方面較其它程式語言更為簡潔,如自加、自減、逗号運算和三目運算使表達式更為簡單,但初學者往往會覺的這種表達式難讀,關鍵原因就是對運算符和運算順序了解不透不全。當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則顯得十分重要。在學習中,隻要我們對此合理進行分類,找出它們與我們在數學中所學到運算之間的不同點之後,記住這些運算也就不困難了,有些運算符在了解後更會牢記心中,将來用起來得心應手,而有些可暫時放棄不記,等用到時再記不遲。
先要明确運算符按優先級不同分類,《C程式設計》運算符可分為15種優先級,從高到低,優先級為1 ~ 15,除第2、3級和第14級為從右至左結合外,其它都是從左至右結合,它決定同級運算符的運算順序.
二.學好C語言的四種程式結構
(1)順序結構
順序結構的程式設計是最簡單的,隻要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。
例如;a = 3,b = 5,現交換a,b的值,這個問題就好像交換兩個杯子水,這當然要用到第三個杯子,假如第三個杯子是c,那麼正确的程式為: c = a; a = b; b = c; 執行結果是a = 5,b = c = 3如果改變其順序,寫成:a = b; c = a; b = c; 則執行結果就變成a = b = c = 5,不能達到預期的目的,初學者最容易犯這種錯誤。 順序結構可以獨立使用構成一個簡單的完整程式,常見的輸入、計算,輸出三步曲的程式就是順序結構,例如計算圓的面積,其程式的語句順序就是輸入圓的半徑r,計算s = 3.14159*r*r,輸出圓的面積s。不過大多數情況下順序結構都是作為程式的一部分,與其它結構一起構成一個複雜的程式,例如分支結構中的複合語句、循環結構中的循環體等。
(2) 分支結構
順序結構的程式雖然能解決計算、輸出等問題,但不能做判斷再選擇。對于要先做判斷再選擇的問題就要使用分支結構。分支結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的實體順序。分支結構的程式設計方法的關鍵在于構造合适的分支條件和分析程式流程,根據不同的程式流程選擇适當的分支語句。分支結構适合于帶有邏輯或關系比較等條件判斷的計算,設計這類程式時往往都要先繪制其程式流程圖,然後根據程式流程寫出源程式,這樣做把程式設計分析與語言分開,使得問題簡單化,易于了解。程式流程圖是根據解題分析所繪制的程式執行流程圖。
學習分支結構不要被分支嵌套所迷惑,隻要正确繪制出流程圖,弄清各分支所要執行的功能,嵌套結構也就不難了。嵌套隻不過是分支中又包括分支語句而已,不是新知識,隻要對雙分支的了解清楚,分支嵌套是不難的。下面我介紹幾種基本的分支結構。
①if(條件)
{分支體}
這種分支結構中的分支體可以是一條語句,此時“{ }”可以省略,也可以是多條語句即複合語句。它有兩條分支路徑可選,一是當條件為真,執行分支體,否則跳過分支體,這時分支體就不會執行。如:要計算x的絕對值,根據絕對值定義,我們知道,當x>=0時,其絕對值不變,而x<0時其絕對值是為x的反号,是以程式段為:if(x<0) x=-x;
②if(條件)
{分支1}
else
{分支2}
這是典型的分支結構,如果條件成立,執行分支1,否則執行分支2,分支1和分支2都可以是1條或若幹條語句構成。如:求ax^2+bx+c=0的根
分析:因為當b^2-4ac>=0時,方程有兩個實根,否則(b^2-4ac<0)有兩個共轭複根。其程式段如下:
d=b*b-4*a*c;
if(d>=0)
{x1=(-b+sqrt(d))/2a;
x2=(-b-sqrt(d))/2a;
printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(“x1=%8.4f+%8.4fi\n”r, i);
printf(“x2=%8.4f-%8.4fi\n”r,i)
}
③嵌套分支語句:其語句格式為:
if(條件1) {分支1};
else if(條件2) {分支2}
else if(條件3) {分支3}
……
else if(條件n) {分支n}
else {分支n+1}
嵌套分支語句雖可解決多個入口和出口的問題,但超過3重嵌套後,語句結構變得非常複雜,對于程式的閱讀和了解都極為不便,建議嵌套在3重以内,超過3重可以用下面的語句。
④switch開關語句:該語句也是多分支選擇語句,到底執行哪一塊,取決于開關設定,也就是表達式的值與常量表達式相比對的那一路,它不同if…else 語句,它的所有分支都是并列的,程式執行時,由第一分支開始查找,如果相比對,執行其後的塊,接着執行第2分支,第3分支……的塊,直到遇到break語句;如果不比對,查找下一個分支是否比對。這個語句在應用時要特别注意開關條件的合理設定以及break語句的合理應用。
(3)循環結構:
循環結構可以減少源程式重複書寫的工作量,用來描述重複執行某段算法的問題,這是程式設計中最能發揮計算機特長的程式結構,C語言中提供四種循環,即goto循環、while循環、do �Cwhile循環和for循環。四種循環可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環,因為強制改變程式的順序經常會給程式的運作帶來不可預料的錯誤,在學習中我們主要學習while、do…while、for三種循環。常用的三種循環結構學習的重點在于弄清它們相同與不同之處,以便在不同場合下使用,這就要清楚三種循環的格式和執行順序,将每種循環的流程圖了解透徹後就會明白如何替換使用,如把while循環的例題,用for語句重新編寫一個程式,這樣能更好地了解它們的作用。特别要注意在循環體内應包含趨于結束的語句(即循環變量值的改變),否則就可能成了一個死循環,這是初學者的一個常見錯誤。
在學完這三個循環後,應明确它們的異同點:用while和do…while循環時,循環變量的初始化的操作應在循環體之前,而for循環一般在語句1中進行的;while 循環和for循環都是先判斷表達式,後執行循環體,而do…while循環是先執行循環體後判斷表達式,也就是說do…while的循環體最少被執行一次,而while 循環和for就可能一次都不執行。另外還要注意的是這三種循環都可以用break語句跳出循環,用continue語句結束本次循環,而goto語句與if構成的循環,是不能用break和 continue語句進行控制的。
順序結構、分支結構和循環結構并不彼此孤立的,在循環中可以有分支、順序結構,分支中也可以有循環、順序結構,其實不管哪種結構,我們均可廣義的把它們看成一個語句。在實際程式設計過程中常将這三種結構互相結合以實作各種算法,設計出相應程式,但是要程式設計的問題較大,編寫出的程式就往往很長、結構重複多,造成可讀性差,難以了解,解決這個問題的方法是将C程式設計成子產品化結構。
(4)子產品化程式結構
C語言的子產品化程式結構用函數來實作,即将複雜的C程式分為若幹子產品,每個子產品都編寫成一個C函數,然後通過主函數調用函數及函數調用函數來實作一大型問題的C程式編寫,是以常說:C程式=主函數+子函數。 是以,對函數的定義、調用、值的傳回等中要尤其注重了解和應用,并通過上機調試加以鞏固。
三.掌握一些簡單的算法
程式設計其實一大部分工作就是分析問題,找到解決問題的方法,再以相應的程式設計語言寫出代碼。這就要求掌握算法,根據我們的《C程式設計》教學大綱中,隻要求我們掌握一些簡單的算法,在掌握這些基本算法後,要完成對問題的分析就容易了。如兩個數的交換、三個數的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些算法的内在含義
結語:當我們把握好上述幾方面後,隻要同學們能克服畏難、厭學、上課能專心聽講,做好練習與上機調試,其實C語言并不難學
C源程式的關鍵字---------------------------------------------------------------------------------------
所謂關鍵字就是已被C語言本身使用, 不能作其它用途使用的字。例如關鍵字不能用作變量名、函數名等
由ANSI标準定義的C語言關鍵字共32個 :
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static
根據關鍵字的作用,可以将關鍵字分為資料類型關鍵字和流程控制關鍵字兩大類。
1 資料類型關鍵字
A基本資料類型(5個)
void :聲明函數無傳回值或無參數,聲明無類型指針,顯式丢棄運算結果
char :字元型類型資料,屬于整型資料的一種
int :整型資料,通常為編譯器指定的機器字長
float :單精度浮點型資料,屬于浮點資料的一種
double :雙精度浮點型資料,屬于浮點資料的一種
B 類型修飾關鍵字(4個)
short :修飾int,短整型資料,可省略被修飾的int。
long :修飾int,長整形資料,可省略被修飾的int。
signed :修飾整型資料,有符号資料類型
unsigned :修飾整型資料,無符号資料類型
C 複雜類型關鍵字(5個)
struct :結構體聲明
union :共用體聲明
enum :枚舉聲明
typedef :聲明類型别名
sizeof :得到特定類型或特定類型變量的大小
D 存儲級别關鍵字(6個)
auto :指定為自動變量,由編譯器自動配置設定及釋放。通常在棧上配置設定
static :指定為靜态變量,配置設定在靜态變量區,修飾函數時,指定函數作用域為檔案内部
register :指定為寄存器變量,建議編譯器将變量存儲到寄存器中使用,也可以修飾函數形參,建議編譯器通過寄存器而不是堆棧傳遞參數
extern :指定對應變量為外部變量,即在另外的目标檔案中定義,可以認為是約定由另外檔案聲明的對象的一個“引用”
const :與volatile合稱“cv特性”,指定變量不可被目前線程/程序改變(但有可能被系統或其他線程/程序改變)
volatile :與const合稱“cv特性”,指定變量的值有可能會被系統或其他程序/線程改變,強制編譯器每次從記憶體中取得該變量的值
2 流程控制關鍵字
A 跳轉結構(4個)
return :用在函數體中,傳回特定值(或者是void值,即不傳回值)
continue :結束目前循環,開始下一輪循環
break :跳出目前循環或switch結構
goto :無條件跳轉語句
B 分支結構(5個)
if :條件語句
else :條件語句否定分支(與if連用)
switch :開關語句(多重分支語句)
case :開關語句中的分支标記
default :開關語句中的“其他”分治,可選。
C 循環結構(3個)
for :for循環結構,for(1;2;3)4;的執行順序為1->2->4->3->2...循環,其中2為循環條件
do :do循環結構,do 1 while(2); 的執行順序是 1->2->1...循環,2為循環條件
while :while循環結構,while(1) 2; 的執行順序是1->2->1...循環,1為循環條件
以上循環語句,當循環條件表達式為真則繼續循環,為假則跳出循環。
新标準
[編輯本段]
在ANSI标準化後,C語言的标準在一段相當的時間内都保持不變,盡管C++繼續在改進。(實際上,Normative Amendment1在1995年已經開發了一個新的C語言版本。但是這個版本很少為人所知。)标準在90年代才經曆了改進,這就是ISO9899:1999(1999年出版)。這個版本就是通常提及的C99。它被ANSI于2000年三月采用。
在C99中包括的特性有:
對編譯器限制增加了,比如源程式每行要求至少支援到 4095 位元組,變量名函數名的要求支援到 63 位元組 (extern 要求支援到 31)
預處理增強了。例如:
宏支援取參數 #define Macro(...) __VA_ARGS__
使用宏的時候,參數如果不寫,宏裡用 #,## 這樣的東西會擴充成空串。(以前會出錯的)
支援 // 行注釋(這個特性實際上在C89的很多編譯器上已經被支援了)
增加了新關鍵字 restrict, inline, _Complex, _Imaginary, _Bool
支援 long long, long double _Complex, float _Complex 這樣的類型
支援 <: :> <% %> %: %:%: ,等等奇怪的符号替代
支援了不定長的數組。數組的長度就可以用變量了。聲明類型的時候呢,就用 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].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_copy 可以複制 ... 的參數。<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類型.
很難得
◆◆
評論讀取中....
請登入後再發表評論!
◆◆
修改失敗,請稍後嘗試