回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C++之父的FAQ >> C++ 风格与技术 FAQ >> [转] “int* p;”和“int *p;”,到底哪个正确?
最 近 更 新
[转] 我该把const写在类..
[翻译] 我应该使用按值..
[翻译] 你如何命名变量..
[转] 何种代码布局风格..
[转] “int* p;”和“in..
[翻译] “cout”怎么念?
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
[翻译]为何C++里有些东..推荐
[翻译] i++ + i++ 的值..推荐
最 新 推 荐
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
[翻译]为何C++里有些东..推荐
[翻译] i++ + i++ 的值..推荐
[翻译] 数组有何不好之..推荐
[转] 为何delete操作不..推荐
[转] 有placement delet..推荐
[翻译] “new”和“mall..推荐
[转] C和C++风格的内存..推荐
[翻译] 为何标准容器效..推荐
热 门 排 行
[转] 我可以写“void ma..
[翻译] 什么是纯虚函数?
[转] 这个简单的程序…..推荐
[转] 我如何从标准输入..
[翻译] i++ + i++ 的值..推荐
[转] 我该把const写在类..
[转] 我怎样才能把整数..
[转] 我应该怎样处理内..推荐
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

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


来源:C++ Style and Technique 作者:Bjarne Stroustrup 翻译:紫云英 等级:一般
发布于2007-09-21 22:23 被读795次 【字体:

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

A: 如果让计算机来读,两者完全等同,都是正确的。我们还可以声明成“int * p”或“int*p”。编译器不会理会你是不是在哪里多放了几个空格。

这两者的选择并无对错之分,不过是风格和侧重点不同而已。C 强调表达式;其声明方式常被看作比“necessary evil”[译注:“必要之恶”,意指为了达到某种目的而不得不付出的代价。例如有人认为环境的破坏是经济发展带来的“necessary evil”]更糟的东西。而C++则很强调类型。

一个典型的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++》 。

原文地址:http://www.research.att.com/~bs/bs_faq2.html#whitespace

本文乃网上搜集得来,其版权归原作者和原出处所有。如有侵犯版权之处请与我联系,我将马上进行处理。



相关专题:C++ 之父的言论
[转] 我该把const写在类型前面还是后面?
[翻译] 我应该使用按值传递还是按引用传递?

上一篇:[翻译] “cout”怎么念?
下一篇:[转] 何种代码布局风格为佳?

共有评论 1 条 网友评分 0分 查看全部评论

游客:blueintimate
评分:0
对于这个问题,主要还是看喜好!
不过,对c++文法比较熟悉的朋友,对更热衷于
int *p;这样的写法。因为*和p都属于declarator部分。

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss