荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (黄昏·落霞·萤火·街灯), 信区: SoftDev
标  题: 【C++】[FAQ]“int* p;”和“int *p;”,到底哪个正?
发信站: 荔园晨风BBS站 (Tue Jun 15 13:52:11 2004), 站内信件


Q: “int* p;”和“int *p;”,到底哪个正确?
A: 如果让计算机来读,两者完全等同,都是正确的。我们还可以声明成“int *
p”或“int*p”。编译器不会理会你是不是在哪里多放了几个空格。
不过如果让人来读,两者的含义就有所不同了。代码的书写风格是很重要的。C风
格的表达式和声明式常被看作比“necessary evil”[译注:“必要之恶”,意指
为了达到某种目的而不得不付出的代价。例如有人认为环境的破坏是经济发展带来
的“necessary evil”]更糟的东西,而C++则很强调类型。所以,“int *p”和“
int* p”之间并无对错之分,只有风格之争。

一个典型的C程序员会写“int *p”,而且振振有词地告诉你“这表示‘*p是一个
int’”——听上去挺有道理的。这里,*和p绑在了一起——这就是C的风格。这种
风格强调的是语法。

而一个典型的C++程序员会写“int* p”,并告诉你“p是一个指向int的指针,p的
类型是int*”。这种风格强调的是类型。当然,我喜欢这种风格 :O) 而且,我认
为,类型是非常重要的概念,我们应该注重类型。它的重要性丝毫不亚于C++语言
中的其它“较为高级的部分”。[译注:诸如RTTI,各种cast,template机制等,
可称为“较高级的部分”了吧,但它们其实也是类型概念的扩展和运用。我曾写过
两篇谈到C++和OOP的文章发表在本刊上,文中都强调了理解“类型”之重要性。我
还曾译过Object Unencapsulated (这本书由作者先前所著在网上广为流传的
C++?? A Critique修订而来)中讲类型的章节,这本书的作者甚至称Object
Oriented Programming应该正名为Type Oriented Programming——“面向类型编
程”!这有点矫枉过正了,但类型确是编程语言之核心部分。事实上,OOP和GP不
全是“Type Oriented Programming”吗? :O) ]

当声明单个变量时,int *和int*的差别并不是特别突出,但当我们要一次声明多
个变量时,易混淆之处就全暴露出来了:

int* p, p1; // probable error: p1 is not an int*


这里,p1的类型到底是int还是int *呢?把*放得离p近一点也同样不能澄清问题:

int *p, p1; // probable error?


看来为了保险起见,只好一次声明一个变量了——特别是当声明伴随着初始化之时
。[译注:本FAQ中凡原文为declare/declaration的均译为声明;
define/definition均译为定义。通常认为,两者涵义之基本差别是:“声明”只
是为编译器提供信息,让编译器在符号表中为被声明的符号(比如类型名,变量名
,函数名等)保留位置,而不用指明该符号所对应的具体语义——即:没有任何内
存空间的分配或者实际二进制代码的生成。而“定义”则须指明语义——如果把“
声明”比作在辞典中为一个新词保留条目;那么“定义”就好比在条目中对这个词
的意思、用法给出详细解释。当我们说一个C++语句是“定义”,那么编译器必定
会为该语句产生对应的机器指令或者分配内存,而被称为“声明”的语句则不会被
编译出任何实际代码。从这个角度而言,原文中有些地方虽作者写的是“对象、类
、类型的声明(declaration)”,但或许改译为“定义”较符合我们的理解。不
过本译文还是采用忠于原文的译法,并不按照我的理解而加以更改。特此说明。另
外,译文中凡涉及我个人对原文的理解、补充之部分均以译注形式给出,供读者参
考。]人们一般不太可能写出像这样的代码:
int* p = &i;
int p1 = p; // error: int initialized by int*


如果真的有人这样写,编译器也不会同意——它会报错的。
每当达到某种目的有两条以上途径,就会有些人被搞糊涂;每当一些选择是出于个
人喜好,争论就会无休无止。坚持一次只声明一个指针并在声明时顺便初始化,困
扰我们已久的混淆之源就会随风逝去。如果你想了解有关C的声明语法的更多讨论
,参见《The Design and Evolution of C++》 。




--

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店