为什么在编程中使用常量?
我刚刚回过头来学习使用Ivor Horton的Beginning C书。 我对于声明常量似乎与同一句子中的变量混淆了一点。
只是为了澄清一下,在C中指定常量和变量有什么区别,实际上,何时需要使用常量而不是变量? 我知道人们说在程序执行期间信息没有改变时使用常量,但我真的不能想到不能使用变量的时候。
从名称中可以猜出,变量随时间而变化。 如果它没有变化,则“没有损失”。 当你告诉编译器值不会改变时,编译器可以进行一大堆优化,比如直接内联值,永远不会为堆栈上的常量分配任何空间。
但是,您不能始终指望您的编译器足够智能,以便能够正确确定一旦设置值是否会更改。 在编译器无法100%置信地确定此情况的任何情况下,编译器都会在安全方面犯错并假设它可能会发生变化。 这可能会导致各种性能影响,如避免内联,不优化某些循环,创建不兼容并行性的目标代码。
因此,并且由于可读性也很重要,因此您应该尽可能地使用显式常量,并为可能实际更改的内容保留变量。
至于为什么使用常量而不是文字数字:
1)它使代码更具可读性。 每个人都知道3.14是什么(希望如此),并不是每个人都知道3.07是PA的所得税税率。 这是特定领域知识的一个例子,并不是每个人在未来维护你的代码(例如,税务软件)都会知道它。
2)进行更改时可以节省工作量。 如果将来税率发生变化,每隔3.07变为3.18将会很烦人。 您总是希望尽可能减少更改,并且理想情况下进行一次更改。 您必须进行的并发更改越多,您忘记某些内容的风险就越高,从而导致错误。
3)您可以避免风险错误。 想象一下,有两个州的所得税税率为3.05,然后其中一个州变为3.18,而另一个州则为3.07。 只需进行更换,您就可能遇到严重错误。 当然,许多整数或字符串常量值比“3.07”更常见。 例如,数字7可以表示一周中的天数,以及其他内容。 在大型程序中,很难确定每个字面值的含义。
4)对于字符串文本,通常使用字符串的符号名称以允许字符串池在支持多种语言的情况下快速更改。
请注意,除了变量和“常量变量”之外,还有一些带有枚举的语言。 枚举实际上允许您为一小组常量(例如,返回值)定义类型,因此使用它们将提供类型安全性。
例如,如果我列出了几周和几个月的日期,如果我指定一个月的一天,我会收到警告。 如果我只使用整数常量,那么当第3天分配给第3个月时就没有警告。您总是希望类型安全,并且它提高了可读性。 枚举也更适合定义顺序。 想象一下,你有一周中几天的常数,现在你希望你的星期在星期一而不是星期日开始。
使用常量更多的是一种防御性编程方式,以保护自己免受自己的伤害,在凌晨2点或在喝咖啡之前编码时,不会意外地改变代码中的某个值。
从技术上讲,是的,您可以使用变量。
一,性能优化。
更重要的是,这是针对人类读者的。 请记住,您的目标受众不仅仅是编译器。 它有助于在代码中表达自己,并避免评论。
const int spaceTimeDimensions = 4; if(gpsSattelitesAvailable >= spaceTimeDimensions) Good();
常数与变量相比有几个优点。
常量提供某种程度的保证,即代码不能改变基础值。 这对于较小的项目来说并不重要,但对于由多位作者编写的多个组件的大型项目而言则很重要。
常量还为编译器提供了强大的优化提示。 由于编译器知道值不能更改,因此不需要从内存加载值,并且可以优化代码以仅对常量的精确值起作用(例如,编译器可以使用移位进行乘法/除法如果const是2的幂。)
常量本身也是静态的 – 您可以在头文件中声明常量及其值,而不必担心将其定义为一个位置。
对于像C这样的低级语言,常量允许进行多次编译优化。
对于一般的编程语言,您并不真正需要它们。 诸如Ruby和JavaScript之类的高级动态语言没有它们(或者至少不是真正的常量)。 使用变量代替,就像你建议的那样。
const
关键字通常用于函数参数,特别是指针,用于建议指针指向的内存不会被函数修改。 例如,查看strcpy
的decleration:
char *strcpy(char *dest, const char *src);
否则,例如,声明如
const int my_magic_no = 54321;
可能更喜欢:
#define MY_MAGIC_NO 54321
出于安全原因。
常量是你只想分享内存,它不会改变。
这是捕获某类错误的一种非常简单的方法。 如果你声明一个变量const
,并且不小心尝试修改它,编译器会打电话给你。
对于任何目的的声明和初始化,例如在循环的开始,检查if -else语句中的条件等,常量是非常必要的。
如需更多参考,请随时阅读以下任一文章:
- C程序设计语言中的常量
- C语言中的变量
不使用const可能意味着团队项目中的某个人可以声明其中int FORTY_TWO = 42
并使其在另一个团队成员的其他地方等于FORTY_TWO = 41
。 因此,世界的末日发生了,你也失去了对生活的回答。 虽然没有这种情况会发生。 与常规变量的存储相比, const
存储在内存中的其他地方,并且效率更高。