【问题标题】:'const int' vs. 'int const' as function parameters in C++ and C'const int' 与 'int const' 作为 C++ 和 C 中的函数参数
【发布时间】:2010-09-14 19:37:36
【问题描述】:

考虑:

int testfunc1 (const int a)
{
  return a;
}

int testfunc2 (int const a)
{
  return a;
}

这两个功能是各方面都一样还是有区别?

我对 C 语言的答案很感兴趣,但如果 C++ 语言有什么有趣的东西,我也想知道。

【问题讨论】:

  • C 中现在有 const 关键字吗?以前没有,但我对 C 99 标准不太熟悉。
  • 你不需要。 C90就够了。但它不在最初的 K&R C 中。
  • 是 C89 和 ANSI 中的关键字。我不知道这是否是 Kerningham 和 Richie 时代的关键字。
  • 本站将“C gibberish”翻译成英文cdecl.org
  • 我会说“C 胡言乱语到英语胡言乱语”,但还是不错 :)

标签: c++ c constants


【解决方案1】:

诀窍是向后阅读声明(从右到左):

const int a = 1; // read as "a is an integer which is constant"
int const a = 1; // read as "a is a constant integer"

两者都是一样的。因此:

a = 2; // Can't do because a is constant

当您处理更复杂的声明时,例如:

const char *s;      // read as "s is a pointer to a char that is constant"
char c;
char *const t = &c; // read as "t is a constant pointer to a char"

*s = 'A'; // Can't do because the char is constant
s++;      // Can do because the pointer isn't constant
*t = 'A'; // Can do because the char isn't constant
t++;      // Can't do because the pointer is constant

【讨论】:

  • “char const *u”怎么样?这读作“指向常量字符的指针”还是“指向字符的常量指针”?似乎模棱两可。标准说的是前者,但要找出这一点,您必须考虑优先级和关联性规则。
  • @PanayiotisKarabassis 所有都应该被视为一个形容词链,不能交换任何位置。 char const *,从左到右读取为:“pointer, const, char”。它是一个指向 const char 的指针。当您说“恒定的指针”时,“恒定”形容词就在指针上。所以,在这种情况下,你的形容词列表应该是:“const, pointer, char”。但你是对的,这个技巧有歧义。这真的是一个“技巧”,而不是一个明确的“规则”。
  • 当您声明数组、函数、指针和函数指针的狂野组合时,向后读取不再起作用(很遗憾)。但是,您可以在spiral pattern 中阅读这些杂乱无章的声明。其他人对此感到非常沮丧,他们发明了围棋。
  • @Martin J.H:难道不能通过 typedef 来分解它们吗?和/或使用引用来消除间接性?
【解决方案2】:

const TT const 是相同的。使用指针类型变得更加复杂:

  1. const char* 是指向常量 char 的指针
  2. char const* 是指向常量 char 的指针
  3. char* const 是指向(可变)char 的常量指针

换句话说,(1)和(2)是相同的。制作指针(而不是指针)const 的唯一方法是使用后缀-const

这就是为什么许多人喜欢总是将const 放在类型的右侧(“East const”样式):它使其相对于类型的位置一致且易于记忆(有趣的是,它似乎也使更容易教给初学者)。

【讨论】:

  • C 确实有 const,给定: static const char foo[] = "foo";你最好不要改变 foo。
  • K&R C 没有 const; C90(和 C99)可以。与 C++ 相比,它有点局限,但它很有用。
  • 引用也是如此吗?
  • @Ken 是的,是一样的。
  • @étale-cohomology 好点,补充。应该一直在那里。
【解决方案3】:

没有区别。他们都声明“a”是一个不能改变的整数。

差异开始出现的地方是你使用指针的时候。

这两个:

const int *a
int const *a

将“a”声明为指向不变的整数的指针。 "a" 可以赋值,但"*a" 不能。

int * const a

将“a”声明为指向整数的常量指针。 "*a" 可以赋值,但"a" 不能。

const int * const a

将“a”声明为指向常量整数的常量指针。 "a" 和 "*a" 都不能赋值。

static int one = 1;

int testfunc3 (const int *a)
{
  *a = 1; /* Error */
  a = &one;
  return *a;
}

int testfunc4 (int * const a)
{
  *a = 1;
  a = &one; /* Error */
  return *a;
}

int testfunc5 (const int * const a)
{
  *a = 1;   /* Error */
  a = &one; /* Error */
  return *a;
}

【讨论】:

    【解决方案4】:

    Prakash 是正确的,声明是相同的,尽管可能需要对指针大小写进行更多解释。

    "const int* p" 是一个指向 int 的指针,它不允许通过该指针更改 int。 "int* const p" 是一个指向 int 的指针,不能更改为指向另一个 int。

    https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const

    【讨论】:

      【解决方案5】:

      const intint const 相同,对于 C 中的所有标量类型都是如此。通常,不需要将标量函数参数声明为 const,因为 C 的按值调用语义意味着任何对变量的更改对其封闭函数是局部的。

      【讨论】:

        【解决方案6】:

        它们是相同的,但在 C++ 中,始终在右侧使用 const 是有充分理由的。您将在任何地方保持一致,因为 const 成员函数必须以这种方式声明:

        int getInt() const;
        

        它将函数中的this 指针从Foo * const 更改为Foo const * constSee here.

        【讨论】:

        • 这是一种完全不同的 const。
        • 为什么这完全不同?差异足以赢得一票否决。
        • 是的,问题是关于“const int”和“int const”之间的区别,你的答案与它无关。
        【解决方案7】:

        是的,它们对于 int 是一样的

        int*不同

        【讨论】:

        • (const int *) 和 (int const *) 是一样的,只是和 (int *const) 不同。
        【解决方案8】:

        这不是一个直接的答案,而是一个相关的提示。为了保持直截了当,我总是使用对流“将const 放在外面”,其中“外面”是指最左边或最右边。这样就不会有混淆—— const 适用于最接近的事物(类型或*)。例如,

        
        
        int * const foo = ...; // Pointer cannot change, pointed to value can change
        const int * bar = ...; // Pointer can change, pointed to value cannot change
        int * baz = ...; // Pointer can change, pointed to value can change
        const int * const qux = ...; // Pointer cannot change, pointed to value cannot change
        

        【讨论】:

        • 您最好使用规则“const 使 const 剩下的任何东西”。例如。 "int * const foo" 使指针为 "const",因为指针是留给它的。但是,您将编写第二行“int const * bar”,使 int const,因为它是留给它的。 "int const * const * qux",使 int 和指针 const 都成为常量,因为其中任何一个都留给它。
        【解决方案9】:

        我认为在这种情况下它们是相同的,但这里有一个顺序很重要的示例:

        const int* cantChangeTheData;
        int* const cantChangeTheAddress;
        

        【讨论】:

        • 确实,但是 int const * 和第一个一样,所以 int 和 const 的顺序无关紧要,只是 * 和 const 的顺序而已。
        猜你喜欢
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2010-11-11
        相关资源
        最近更新 更多