贝壳电子书 > 期刊杂志电子书 > c语言深度剖析 >

第8章

c语言深度剖析-第8章

小说: c语言深度剖析 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




D);前面说过注释会被空格替换,那这条注释不正确就很好理解了。

现在你可以回答前面的问题了吧?





但注意:/*…*/这种形式的注释不能嵌套,如:

/*这是/*非法的*/*/

因为/*总是与离它最近的*/匹配。

2。1。2,y=x/*p

y=x/*p,这是表示x除以p指向的内存里的值,把结果赋值为y?我们可以在编译器

上测试一下,编译器提示出错。

实际上,编译器把/*当作是一段注释的开始,把/*后面的内容都当作注释内容,直到出

现*/为止。这个表达式其实只是表示把x的值赋给y,/*后面的内容都当作注释。但是,由

于没有找到*/,所以提示出错。

我们可以把上面的表达式修改一下:

y=x/*p

或者

y=x/(*p)

这样的话,表达式的意思就是x除以p指向的内存里的值,把结果赋值为y了。

也就是说只要斜杠(/)和星号(*)之间没有空格,都会被当作注释的开始。这一点一

定要注意。

2。1。3,怎样才能写出出色的注释

注释写得出色非常不容易,但是写得糟糕却是人人可为之。糟糕的注释只会帮倒忙。

2。1。3。1,安息吧,路德维希。凡。贝多芬

在《Codeplete》这本书中,作者记录了这样一个故事:

有位负责维护的程序员半夜被叫起来,去修复一个出了问题的程序。但是程序的原作

者已经离职,没有办法联系上他。这个程序员从未接触过这个程序。在仔细检查所有的说明

后,他只发现了一条注释,如下:

MOVAX723h;R。I。P。L。V。B。

这个维护程序员通宵研究这个程序,还是对注释百思不得其解。虽然最后他还是把程

序的问题成功排除了,但这个神秘的注释让他耿耿于怀。说明一点:汇编程序的注释是以分

号开头。

几个月后,这名程序员在一个会议上遇到了注释的原作者。经过请教后,才明白这条

注释的意思:安息吧,路德维希。凡。贝多芬(Restinpeace;LudwigVanNeethoven)。贝多芬于

1827年逝世,而1827的十六进制正是723。这真是让人哭笑不得!

2。1。3。2,windows大师们用注释讨论天气问题

还有个例子:前些日子windows的源代码曾经泄漏过一部分。人们在看这部分大师的





经典作品时,却发现很多与代码毫无关系的注释!有的注释在讨论天气,有的在讨论明天吃

什么,还有的在骂公司和老板。这些注释虽然与代码无关,但总比上面那个让贝多芬安息的

注释要强些的。至少不会让你抓狂。不过这种事情只有大师们才可以做,你可千万别用注释

讨论天气。

2。1。3。3,出色注释的基本要求

【规则2…1】注释应当准确、易懂,防止有二义性。错误的注释不但无益反而有害。

【规则2…2】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。

不再有用的注释要及时删除。

【规则2…3】注释是对代码的“提示”,而不是文档。程序中的注释应当简单明了,注释太

多了会让人眼花缭乱。

【规则2…4】一目了然的语句不加注释。

例如:i++;/*i加1*/

多余的注释

【规则2…5】对于全局数据(全局变量、常量定义等)必须要加注释。

【规则2…6】注释采用英文,尽量避免在注释中使用缩写,特别是不常用缩写。

因为不一定所有的编译器都能显示中文,别人打开你的代码,你的注释也许是一团乱

码。还有,你的代码不一定是懂中文的人阅读。

【规则2…7】注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上行,但

不可放在下方。同一结构中不同域的注释要对齐。

【规则2…8】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于

阅读。

【规则2…9】注释的缩进要与代码的缩进一致。

【规则2…10】注释代码段时应注重“为何做(why)”,而不是“怎么做(how)”。

说明怎么做的注释一般停留在编程语言的层次,而不是为了说明问题。尽力阐述“怎么做”

的注释一般没有告诉我们操作的意图,而指明“怎么做”的注释通常是冗余的。

【规则2…11】数值的单位一定要注释。

注释应该说明某数值的单位到底是什么意思。比如:关于长度的必须说明单位是毫米,

米,还是千米等;关于时间的必须说明单位是时,分,秒,还是毫秒等。

【规则2…12】对变量的范围给出注释。

【规则2…13】对一系列的数字编号给出注释,尤其在编写底层驱动程序的时候(比如管脚

编号)。

【规则2…13】对于函数的入口出口数据给出注释。

关于函数的注释在函数那章有更详细的讨论。





2。2,接续符和转义符

C语言里以反斜杠()表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符

自动接续到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空

格。当然你可以测试一下加了空格之后的效果。我们看看下面的例子:

//这是一条合法的

单行注释

/

/这是一条合法的单行注释

#def

ineMAC

RO这是一条合法的

宏定义

cha

r*s=〃这是一个合法的

n字符串〃;

反斜杠除了可以被用作接续符,还能被用作转义字符的开始标识。

常用的转义字符及其含义:

转义字符转义字符的意义

n回车换行

t横向跳到下一制表位置

v竖向跳格

b退格

r回车

f走纸换页

反斜扛符〃”

'单引号符

a鸣铃

ddd1~3位八进制数所代表的字符

xhh1~2位十六进制数所代表的字符

广义地讲,C语言字符集中的任何一个字符均可用转义字符来表示。表中的ddd和xhh

正是为此而提出的。ddd和hh分别为八进制和十六进制的ASCII代码。如102表示字母〃B〃,

134表示反斜线,X0A表示换行等。





2。3,单引号、双引号

我们知道双引号引起来的都是字符串常量,单引号引起来的都是字符常量。但初学者

还是容易弄错这两点。比如:‘a’和“a”完全不一样,在内存里前者占1个byte,后者占2

个byte。关于字符串常量在指针与数组那章将有更多的讨论。

这两个列子还好理解,再看看这三个:

1,‘1‘,“1”。

第一个是整形常数,32位系统下占4个byte;

第二个是字符常量,占1个byte;

第三个是字符串常量,占2个byte。

三者表示的意义完全不一样,所占的内存大小也不一样,初学者往往弄错。

字符在内存里是以ASCAII码存储的,所以字符常量可以与整形常量或变量进行运算。

如:‘A‘+1。

2。4,逻辑运算符

||和&&是我们经常用到的逻辑运算符,与按位运算符|和&是两码事。下一节会介绍按位

运算符。虽然简单,但毕竟容易犯错。看例子:

inti=0;

intj=0;

if((++i》0)||(++j》0))



//打印出i和j的值。



结果:i=1;j=0。

不要惊讶。逻辑运算符||两边的条件只要有一个为真,其结果就为真;只要有一个结果

为假,其结果就为假。if((++i》0)||(++j》0))语句中,先计算(++i》0),发现其结果为真,后面

的(++j》0)便不再计算。同样&&运算符也要注意这种情况。这是很容易出错的地方,希望读

者注意。





2。5,位运算符

C语言中位运算包括下面几种:

&按位与

|按位或

^按位异或

~取反

右移

前4种操作很简单,一般不会出错。但要注意按位运算符|和&与逻辑运算符||和&&完全

是两码事,别混淆了。其中按位异或操作可以实现不用第三个临时变量交换两个变量的值:

a^=b;b^=a;a^=b;但并不推荐这么做,因为这样的代码读起来很费劲。

2。5。1,左移和右移

下面讨论一下左移和右移:

左移运算符“”右边的数指定移动的位数。但注意:对于有符号数,在右移时,符号位将随同

移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0或是补1取决

于编译系统的规定。TurboC和很多系统规定为补1。

2。5。2,0x01

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的