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

    不过如果让人来读,两者的含义就有所不同了。代码的书写风格是很重要的。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++》 。