我刚刚使用 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(使用前将#替换为@)