为什么在编程中使用常量? [关闭]

2024-03-20

我刚刚使用 Ivor Horton 的 Beginning C 书回顾了一些 C 语言学习。我谈到了关于声明常量的问题,这些常量似乎与同一个句子中的变量混淆了。

只是为了澄清一下,在 C 中指定常量和变量有什​​么区别,实际上,什么时候需要使用常量而不是变量?我知道人们说当信息在程序执行过程中不改变时使用常量,但我真的想不出不能使用变量的时候。


正如您可以从名称中猜出的那样,变量会随时间而变化。如果没有变化,就“没有损失”。当您告诉编译器该值不会改变时,编译器可以进行一大堆优化,例如直接内联该值并且从不为堆栈上的常量分配任何空间。

但是,您不能总是指望编译器足够聪明,能够正确确定值一旦设置后是否会更改。在编译器无法以 100% 的置信度确定这一点的任何情况下,编译器都会在安全方面犯错误并假设它可能会更改。这可能会导致各种性能影响,例如避免内联、不优化某些循环、创建不那么并行友好的目标代码。

因此,由于可读性也很重要,因此您应该尽可能使用显式常量,并为实际可以更改的内容保留变量。

至于为什么使用常量而不是文字数字:

1)它使代码更具可读性。每个人都知道 3.14 是什么(希望如此),但不是每个人都知道 3.07 是宾夕法尼亚州的所得税税率。这是特定领域知识的示例,并不是将来维护代码的每个人(例如税务软件)都会知道它。

2) 进行更改时可以节省工作量。如果以后税率有变化,每3.07到3.18就去换一下,会很烦人。您总是希望尽量减少更改,最好只进行一次更改。您必须进行的并发更改越多,您忘记某些内容并导致错误的风险就越高。

3) 您可以避免危险的错误。想象一下,有两个州的所得税率为 3.05,然后其中一个州变为 3.18,而另一个州则保持 3.07。如果只是进行替换,您最终可能会犯下严重错误。当然,许多整数或字符串常量值比“3.07”更常见。例如,数字 7 可以代表一周中的天数或其他内容。在大型程序中,很难确定每个文字值的含义。

4)在字符串文本的情况下,通常对字符串使用符号名称,以允许字符串池在支持多种语言的情况下快速更改。

注意,除了变量和“常量变量”之外,还有一些语言带有枚举。枚举实际上允许您为一小组常量(例如返回值)定义类型,因此使用它们将提供类型安全性。

例如,如果我有一个星期几和几个月的枚举,如果我将一个月分配到一天中,我会收到警告。如果我只使用整数常量,则将第 3 天分配给第 3 个月时不会出现警告。您始终需要类型安全,并且它提高了可读性。枚举也更适合定义顺序。想象一下,您对一周中的几天有常数,现在您希望一周从星期一而不是星期日开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在编程中使用常量? [关闭] 的相关文章

随机推荐

  • 为什么查询sqlite数据库时需要创建游标?

    我完全陌生Python sqlite3模块 https docs python org 3 6 library sqlite3 html 以及一般的 SQL 这完全难倒了我 大量缺乏描述cursor objects https docs p
  • 将 JaCoCo 与 SONAR 集成以实现单元和集成测试覆盖

    有没有人尝试使用 ANT 构建配置 JaCoCo 将单元测试和集成测试的覆盖范围转储到 2 个不同的文件中 以便 SONAR 使用它们 这是一个可行的解决方案 为单元测试和集成测试生成报告 该解决方案使用的是append战略 请注意 为了在
  • 具有不同输入的全卷积网络

    我有一个完全卷积神经网络 U Net 可以在下面阅读 https arxiv org pdf 1505 04597 pdf https arxiv org pdf 1505 04597 pdf 我想用它来对图像进行像素分类 我的训练图像有两
  • 无法导入 Materialise CSS JS 反应

    大家 早安 我一直在努力让具体化CSS在我的react app上工作 特别是Javascript文件 我尝试了多种方法 但这是我认为我已经走得更远的一种 在我的 landingpage js 文件中 import React Compone
  • 仅隐藏供应商提供的类的弃用警告

    我们有一个应用程序 其中包含一个非常非常古老的类来连接到专有数据库的 API 此代码会生成大量弃用错误 然后将其记录下来 从而污染我们的日志文件 我们只想基本上忽略此供应商提供的类的弃用错误 但我无法找到执行此操作的最佳方法 我见过的选项
  • Bootstrap:两列居中

    我正在尝试使用 Bootstrap 3 1 实现两列居中布局 我读过这个 如何将 Bootstrap div 与 spanX 类居中 https stackoverflow com questions 9554724 how do i ce
  • 使用 Java 从 Keystore 中导入的证书获取公钥

    我已经创建并下载了证书销售队伍 https ap1 salesforce com 按照中的说明PicketLink 文档 https docs jboss org author display PLINK Picketlink as SP
  • 多租户:每个租户都有单独的数据库

    我们正在开发一个多租户应用程序 在架构方面 我们设计了共享中间层用于业务逻辑 每个租户一个数据库用于数据持久化 也就是说 业务层将为每个租户与数据库服务器建立一组连接 连接池 这意味着应用程序为每个租户维护单独的连接池 如果我们预计大约有
  • Android 画图 PorterDuff.Mode.CLEAR

    我正在开发在 Canvas 上绘图的应用程序 类似于 Android SDK 中的 Finger Paint 演示 我的问题是当我使用时PorterDuff Mode CLEAR 当绘图和画布时 如果我尝试擦除某些内容 它工作正常 但如果我
  • 声明参数化类型同义词的实例

    我有很多适用于向量的函数 即具有类型强制长度的列表 我试图让我的类型更容易编写 即而不是编写 foo Fold Integer v Map Integer Integer v v gt 我正在宣布一个新班级NList所以我可以写foo NL
  • Hibernate JPA 与 JTA 和 Glassfish 应用程序服务器似乎没有提交

    我是 hibernate 的新手 我希望它通过 JNDI 使用来自应用程序服务器的数据库连接 奇怪的是 它在数据库中创建我的表 但不保存实体 看来 它并没有承诺 有人在使用 hibernate 时遇到过类似的问题吗 这是一个小测试 serv
  • 如何将参数传递给graphql查询?

    我正在尝试在 Meteor blaze 项目中使用 Apollo graphql 我正在使用来自swydo blaze apollo 使用graphql查询从mongoDB获取数据就可以了 Using this one can get da
  • 使用 React Router V4 以编程方式导航

    我刚刚更换了react router从 v3 到 v4 但我不确定如何以编程方式在成员函数中导航Component 即在handleClick 我想要导航到的功能 path some where处理一些数据后 我曾经这样做过 import
  • 将 android studio 更新为花栗鼠后,导航组件方向生成的类中的构建时间错误

    在导航组件生成的所有 方向 类中将 android studio 更新为花栗鼠版本后 我收到 未解析的参考 R 构建时间错误 R 类未在该类中导入 尽管我可以手动导入它 但类将重新生成 而无需在下一个构建中导入 android gradle
  • Pytorch 分析器显示两个不同网络的卷积平均执行时间不同

    我有两个网络 我正在对它们进行分析以查看哪些操作占用了大部分时间 我注意到CUDA time avg为了aten conv2d不同网络的操作有所不同 这也增加了一个数量级 在我的第一个网络中 它是22us 而对于第二个网络则是3ms 我的第
  • 内蒂不写

    当尝试使用 netty 写入时 写入的数据永远不会在远程端结束 这已通过 Wireshark 确认 我努力了 Directly using writeAndFlush channel writeAndFlush new Packet Man
  • iOS,无法识别的选择器发送到实例?

    我有一个带有导入的自定义操作栏的主屏幕 我在单独的 xib 文件中创建了这个 actionBar 其中包含 m 和 h 文件 我在我的actionBar m中做了一些图形设置viewDidLoad like backgroundColor和
  • Swift 中可选的动态属性

    我正在尝试编译以下 Swift 类 class Waypoint NSObject dynamic var coordinate CLLocationCoordinate2D 但我收到以下编译器错误 属性无法标记为动态 因为其类型无法在 O
  • Excel VBA - 如何仅插入值?

    我正在寻找一种从其他工作簿复制范围 复制范围存在于 11 列和各种行 的方法 并仅在我的主工作簿中现有数据的下方插入 粘贴值 只是粘贴没有问题 但因为我不希望它覆盖最后一个 SUM 行 所以我想插入这些值 据我所知 没有像 InsertSp
  • 为什么在编程中使用常量? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi