资源描述
C语言辅导:ANSI / ISO标准
一个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》〔OsborneMcGraw-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 运算符的优先级总能起作用吗?
有关运算符优先级的规章略微有点简单。在大多数状况下,这些规章
的确是你所需要的,然而,有人也指出其中的一些规章原来是可以设计得
更好的。
让我们快速地回忆一些有关内容:“运算符优先级〞是这样一些规章
的集合一一这些规章规定了 “运算符〞〔例如+,-,等等〕的优先性,即哪
一种运算符先参与运算。在数学中,表达式“2X3+4X5〞和“〔2X3〕 + 〔4
X5〕〞是等价的,由于乘法运算在加法运算之前进展,也就是说乘法的优
先级比加法高。
在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(
按位右移〕
7
xy
,x=y〔关系比拟〕
8
x==y
,x!=y〔相等比拟〕
9
x&y(
按位与〕
10
x\(
按位异或〕 .
11
x y(
按位或〕
12 x&&y〔 规律与〕
13 x||y〔 规律或〕
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中你会常常看到这样的代码,并且你会有很多时机去写这
样的代码。对于其它运算符,假如你记不住其优先级,可以查阅有关资料,
但是,一个好的c程序员应当连想都不用想就能明白*p++的含义。
最初的C编译程序是为这样一种计算机编写的一一它的某些指令对
象*p++和*?++=*4++这样的代码的处理效率高得令人难以置信,因此,许
多C代码就写成这种形式了。进一步地,由于象这样的C代码实在太多了,
所以新机型的设计者会保证供应能特别高效地处理这些C代码的指令。
再下一级的优先级是乘法、除法和求余〔也叫取模〕,再往后是加法和
减法。与数学中的表达式一样,“2*3+4*5〞和“〔2*3〕 + 〔4*5〕〞是等价的。
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关搜索