【问题标题】:char *foo vs char* foo [closed]char *foo vs char* foo [关闭]
【发布时间】:2012-03-04 20:58:50
【问题描述】:

简单的问题是:你为什么要写作

char *foo;

而不是

char* foo;

让我解释一下:对我(来自 Java)来说,声明类似于

<variable-type> <variable-name>;

在上述情况下,我声明了一个名为 foo 的变量,类型为 char*(因为它是一个指向 char 的指针)。但是无论我在哪里阅读 c/c++/c#-Code,它看起来都像是一个名为 *foo 的变量,类型为 char。编译器不关心空格,但我作为开发人员关心。

tl;dr我要求的是写char *foo而不是char* foo的一个很好的解释(正如解释的那样,对我来说似乎更方便)。

【问题讨论】:

  • 请具体说明您所询问的语言。 C# 通常不使用指针,所以不知道为什么要包含它。
  • 您遗漏了最常见的形式char * foo
  • 请看Stroustrup's FAQ
  • dtb 已经编辑了 c#,主要是为了表明我没有(真正的)特定于语言的问题。 (c#确实允许指针,但你通常不使用它们,你是对的)

标签: c++ c coding-style


【解决方案1】:

想想下面的声明:

char *p, c;

这声明了一个名为p 的char 指针和一个名为c 的字符变量。这表明将变量声明视为具有您描述的简单明了的格式并不完全正确。

【讨论】:

  • 因此,对于在同一行中声明两个变量的惰性情况,您可以在任何地方使用它(即使它似乎不是最好的方式 - 对我来说 - 这样做)?
  • 不,因为这是语言的工作方式。该语言不会将* 视为类型的逻辑部分,而更多地视为绑定到声明的特定变量而不是声明的类型修饰符。在答案的行中,只有 p 被“修改”为指针。这就是语言的工作原理。
  • @DavidSchwartz 更准确地说, * 是声明符 (8.0.0) 的一部分,并将基本类型扩展为复合类型。
【解决方案2】:

需要明确的是,在 C 和 C++ 中,两者都是完全合法的,并且没有统一的“最佳方式”。

char *foo的原因是这样的代码:

char* foo, bar;

这并不像您在随意阅读代码时所期望的那样声明两个 char 指针。 它声明了一个 char 指针 (foo) 和一个 char (bar)。

如果你想声明两个 char 指针,你需要这个:

char* foo, * bar;

这看起来很奇怪,所以更一致的版本是这样的:

const *foo, *bar;

这是明确* 确实是该特定变量的限定符,而不是绑定到类型的唯一方法。

但是很多人,包括我自己,都喜欢和你一样,总是写char* foo 然后我只需要避免像上面那样在单个语句中声明两个变量。 总的来说,这并不难。 ;)

【讨论】:

    【解决方案3】:

    我总是选择char* var 方式。正是因为你的理性。 我想这是一个习惯问题。

    【讨论】:

      【解决方案4】:

      变量的声明分为三部分:基本类型、声明符和名称。如果你用逗号分隔它,你会得到:

      char *a, b, c[5], *d[5];
      

      a 的类型是“指向 char 的指针”,b 的类型是“char”,c 的类型是“5 个 char 的数组”和 d 的“5 个指向 char 的指针的数组”。这就是为什么在 C 和 C++ 中将星号写入名称会更合乎逻辑的原因,因为它不属于基本类型。

      但是,它属于类型和 (type) (name) 对于人们来说更容易理解,这就是为什么你经常看到 char* 的原因。在我看来,这两种方式都很好,只要在使用 char* 时在每一行中只声明一个变量。 (无论如何,这是许多编码标准所要求的。)

      【讨论】:

        猜你喜欢
        • 2018-06-27
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        • 2014-03-20
        • 1970-01-01
        • 2020-08-27
        相关资源
        最近更新 更多