“int* p;”和“int *p;”,到底哪个正确?

C++作者对这个有过解释,链接为http://www.stroustrup.com/bs_faq2.html#whitespace

对应内容翻译如下(来自http://www.stroustrup.com/bstechfaq.htm
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——“面向类型编程”!这有点矫枉过正了,但类型确是编程语言之核心部分。]
当声明单个变量时,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++》 。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值