【问题标题】:What does const in void foo(const int a) do? [duplicate]void foo(const int a) 中的 const 有什么作用? [复制]
【发布时间】:2016-08-03 05:24:20
【问题描述】:

我确实理解 const 对于必须通过引用传递给函数的指针或结构的含义。但是在示例中:

void foo(const int a);

变量a 在堆栈上传递。修改堆栈内容对调用者没有害处,因此const 在这种情况下看起来毫无用处。

此外,如果我无法修改a,我仍然可以复制a并更改此副本:

void foo(const int a)
{
   int b = a;
   b++;
}

const 关键字在应用于标量函数参数(不是指针)时会在什么情况下有用?

【问题讨论】:

  • 某事可以做并不意味着它应该做或有用。在这种情况下,正如其他人所说,它可能有用。

标签: c constants


【解决方案1】:

void foo(const int a) 这样的代码并没有真正的意义,也不是“const 正确性”。

有时过于迂腐的程序员会产生奇怪的想法,即他们需要将公共参数声明为const,只是因为函数不会修改实际参数。但大多数情况下,函数不会。

关键是,变量是原始变量的副本,所以你的函数用它做什么并不重要!

所以这甚至不是一种编写自记录代码的方式,因为它所做的只是告诉调用者你的函数内部发生了什么。调用者不关心也不应该关心。

【讨论】:

  • 我个人对函数参数使用const限定词很多——基本上每次我都不需要修改函数体中的参数。它曾经帮助一些 C 编译器生成更好的代码,但这不是我这样做的原因。我这样做是因为它有助于人类阅读代码。 const 让我们安全地假设它保持为调用者指定的值,而不是仔细阅读函数以查看值是否被更改。这就是为什么我将它集成到我的编码风格中。如果那是过于迂腐,好吧,就这样吧。
  • @NominalAnimal 如果代码在函数原型中,它并不能帮助人类阅读代码。那里绝对没有任何意义。
  • @NominalAnimal 我非常怀疑它是否曾帮助任何编译器生成更好的代码(不像restrict 等)。此外,如果您必须缓慢而仔细地阅读一个函数来判断一个变量是否被修改,那么很可能该函数需要分成几个。
【解决方案2】:

值参数没有必要使用 const,但如果您想要保证代码执行您的意图,它就有它的价值。

Here 有一些用例示例的答案

【讨论】:

    【解决方案3】:

    这与声明任何常量变量是一样的

    const int size = some_other_variable + 5;
    

    如果您知道变量的值不会改变,那么将变量声明为const 是一种很好的编程习惯。这样,从声明开始,您就可以避免有人在函数的下方意外更改其值。

    【讨论】:

      【解决方案4】:

      表示函数的实现者不能改变函数接收到的入参a的值。

      它可以提高程序的稳定性。

      (我个人不喜欢这种风格,因为我觉得它太冗长了)。

      如果你采用这种风格,那么请注意,你只需要将const放在函数定义的参数列表中,你声明中不需要

      【讨论】:

      • 值在栈上传递。根据定义,实现者不能更改a 的值。
      • 某种意义上可以,但是a的值不能被函数改变。
      • “它可以提高程序的稳定性”如何?
      • 我至少见过几次像a /= 100 这样的顽皮代码。这位年轻的宽客说“但我需要它作为百分比”。 “不,你不知道”我说。为了强制执行,这是原型中的const。请从表面上看优化参数。”顺便说一句,至少有一家投资银行坚持const风格。
      • 可能值得一提的是,函数声明中是否包含const 无关紧要。重要的是定义。
      【解决方案5】:

      它主要用于为您的代码自我记录。

      对于将来查看您的源代码的人,const 用于强调您的意图(foo() 中的任何代码都不应尝试修改a)。

      【讨论】:

      • 为什么“人”(调用者)会关心你的函数是如何在内部实现的?这不关他们的事,他们不在乎。
      • "people" 也可以是代码的管理员。
      • 它只能用于记录实现。它在函数声明中被忽略。
      • @atturri 所以,如果代码的维护者不知道他们自己的代码是做什么的,那么是否可以从他们自己手中拯救他们?编程不是这样工作的:当你不再知道自己的代码做了什么时,就没有保存程序的希望了。
      • @Lundin 不必是您自己的代码。它可以是 10 年前离开公司而没有留下设计文档的程序员的代码。正如答案所说,const 可以为以后的读者强调你的意图。
      猜你喜欢
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多