C語言編程常見問題解答之ANSI/ISO標準
2019-11-17 05:40:26
供稿:網友
假如你不理解C語言標準的價值,你就不會知道你是怎樣地幸運。
一個C程序員會期望一個C程序無論是在哪里開發的,在另一個編譯程序中都能通過編譯。實際上不能完全做到這一點,因為許多頭文件和函數庫都是針對某些特定的編譯程序或平臺的。有些(很少!)語言擴充性能,例如基于Intel的編譯程序所使用的near和far要害字以及寄存器偽變量,也只不過是某種平臺的開發商們所認可的一種標準。
假如你認為靠一種標準走遍天下是理所當然的,就象左腳踩加速器,右腳踩剎車一樣,那么你的視野未免有些狹窄。有兩種不同的BASIC標準,但都沒有得到廣泛的支持;世界上最流行的Pascal編譯程序并不符合正式的標準;現在正在發展的C++標準,由于變化太快,也沒有得到廣泛的支持;有些實現遵循一種嚴格的Ada標準,但Ada標準也沒能大規模地占領世界市場。
從技術上講有兩種C語言標準,一種來自ANSI(American National Standard Institute,美國國家標準協會)X3J11委員會,另一種來自ISO(International Standard Organization,國際標準協會)9899—1990。由于ISO標準中的某些改進優于ANSI標準,而ANSI標準也接受了這個國際版本,因此"ANSI/ISO標準”是一種正確的說法。
那么,這種標準對你有什么幫助呢?你可以買到一份該標準的副本,即Herbert Schildt所著的((The Annotated ANSI C Standard》(Osborne McGraw-Hill出版,ISBN O-07-881952-O)一書,該書對語言和庫都作了介紹,并帶有注釋。這本書比大多數正式標準要便宜多了,后者由ANSI和ISO出售,以解決建立標準所需的部分費用。并不是每一個C程序員都需要這樣一本書,但它是最權威的。
最重要的一點是,ANSI/ISO標準是對“什么是c?”這一問題的權威解答。假如編譯程序開發商所做的某些實現不符合這一標準,你可以把它作為錯誤指出來,這不會引起爭論。
ANSI/ISO標準也不是包羅萬象的。具體地說,它沒有涉及c程序可能會做的許多有趣的事情,例如圖形或多任務。許多兼容性不強的標準包含了這些內容,其中的一些將來可能會成為權威的標準,因此你不必完全拘泥于ANSI/ISO標準。
順便提一句,除編程語言之外,還有許多東西也有ANSI標準,其中的一種就是ANSI為全屏幕文本操作的退出序列集合而寫的標準,在第17章中所介紹的MS—DOS的"ANSI驅動程序”指的就是這種標準(有趣的是,MS-DOS的ANSI.SYS只實現了ANSI標準序列中的一小部分)。
16.1 運算符的優先級總能起作用嗎?
有關運算符優先級的規則稍微有點復雜。在大多數情況下,這些規則確實是你所需要的,然而,有人也指出其中的一些規則本來是可以設計得更好的。
讓我們快速地回顧一些有關內容:“運算符優先級”是這樣一些規則的集合——這些規則規定了“運算符”(例如+,-,等等)的優先性,即哪一種運算符先參加運算。在數學中,表達式“2×3+4×5”和“(2×3)+(4×5)”是等價的,因為乘法運算在加法運算之前進行,也就是說乘法的優先級比加法高。
在c中,有16級以上的運算符優先級。盡管這么多的規則有時使c程序不易閱讀,但也使C程序寫起來輕易多了。雖然這不是唯一的一種折衷方法,但這就是C所采用的方法。表16.1總結了運算符的優先級。 表16.1 運算符優先級總結(從高到低)
----------------------------------------------------------------------------------
優先級 運算符
----------------------------------------------------------------------------------
1 x[y](下標)
x(y)(函數調用)
x.y(訪問成員)
x->y(訪問成員指針)
x++(后綴自增)
x--(后綴自減)--
2 ++x(自增)
--x(自減)
&x(取地址)
*x(指針引用)
+x(同x,和數學中相同)
-x(數學求負)
!x(邏輯非)
~x(按位求反)
sizeof x和sizeof(x_t)(字節數大小)
3 (x_t)y(強制類型轉換)
4 x*y(乘法)
x/y(除法)
x%y(求余)
5 x+y(加法)
x-y(減法)
6 x<<y(按位左移)
x>>y(按位右移)
7 x<y,x>y,x<=y,x>=y(關系比較)
8 x==y,x!=y(相等比較)
9 x&y(按位與)
10 x^y(按位異或) .
11 x y(按位或)
12 x&&y(邏輯與)
13 xy(邏輯或)
14 x?y:z(條件)
x=y,x*=y,x/=y,x+=y,x-=y,<<=,>>=,&=,^=,=(賦值,右結合性)
16 x,y(逗號)
--------------------------------------------------------------------------------------
優先級最高的是后綴表達式,即運算符跟在一個表達式后面;其次是前綴或單目表達式,即運算符位于一個表達式的前面;再次是強制類型轉換表達式。
注重:關于運算符優先級,最重要的是知道*p++和*(p++)是等價的。也就是說,在*p++中,++運算符作用在指針上,而不是作用在指針所指向的對象上。象“*p++=*q++;這樣的代碼在C中是隨處可見的,其中的優先級和“(*(p++))=(*(q++))”中的是相同的。這個表達式的含義是“q+1,但仍用q原來的值找到q所指向的對象;p加1,但仍用p原來的值;把q所指向的對象賦給p所指向的對象”,整個表達式的值就是原來q所指向的對象。在C中你會經??吹竭@樣的代碼,并且你會有許多機會去寫這樣的代碼。對于其它運算符,假如你記不住其優先級,