我刚刚回过头来学习使用Ivor Horton的Beginning C书。我谈到声明常量似乎与同一句子中的变量混淆了。
只是为了澄清,在C中指定常量和变量有什么区别,实际上,何时需要使用常量而不是变量?我知道当程序执行期间信息没有改变时,人们会说使用常量,但我真的不能想到不能使用变量的时候。
答案 0 :(得分:34)
您可以从名称中猜出变量随时间变化。如果它没有变化,则“没有损失”。当你告诉编译器值不会改变时,编译器可以进行一大堆优化,比如直接内联值,永远不会为堆栈上的常量分配任何空间。
但是,您不能始终指望您的编译器足够智能,以便能够正确确定一旦设置值是否会更改。在编译器无法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个月时就没有警告。您总是希望类型安全,并且它提高了可读性。枚举也更适合定义顺序。想象一下,你有一周中几天的常数,现在你希望你的星期在星期一而不是星期日开始。
答案 1 :(得分:15)
使用常量更像是一种防御性编程方式,可以保护自己免受自己的伤害,在凌晨2点或在喝完咖啡之前编码时,不会意外地改变代码中的值。
从技术上讲,是的,您可以使用变量。
答案 2 :(得分:10)
首先,性能优化。
更重要的是,这是针对人类读者的。请记住,您的目标受众不仅仅是编译器。它有助于在代码中表达自己,并避免评论。
const int spaceTimeDimensions = 4;
if(gpsSattelitesAvailable >= spaceTimeDimensions)
Good();
答案 3 :(得分:9)
常量比变量有几个优点。
常量提供某种程度的保证,即代码无法更改基础值。这对于一个较小的项目来说并不重要,但对于一个由多个作者编写的多个组件的大型项目来说很重要。
常量还为编译器提供了强有力的提示以进行优化。由于编译器知道值无法更改,因此不需要从内存加载值,并且可以优化代码仅适用于常量的精确值(例如,编译器可以使用移位进行乘法/除法如果const是2的幂。)
常量本身也是静态的 - 您可以在头文件中声明常量及其值,而不必担心将其定义在一个地方。
答案 4 :(得分:3)
对于像C这样的低级语言,常量允许进行多次编译优化。
对于一般的编程语言,您并不真正需要它们。诸如Ruby和JavaScript之类的高级动态语言没有它们(或者至少不是真正的常量)。相反,使用变量,就像你建议的那样。
答案 5 :(得分:2)
const
关键字通常用于函数参数,特别是指针,用于建议指针指向的内存不会被函数修改。例如,查看strcpy
的解除:
char *strcpy(char *dest, const char *src);
否则,例如,
等声明const int my_magic_no = 54321;
可能优先于:
#define MY_MAGIC_NO 54321
出于安全原因。
答案 6 :(得分:2)
常量是你只想共享内存,它不会改变。
答案 7 :(得分:1)
这是捕获某类错误的一种非常简单的方法。如果你声明一个变量const
,并且意外地尝试修改它,编译器会打电话给你。
答案 8 :(得分:1)
对于变量的声明和初始化,常量是非常必要的,例如在循环开始时,检查if -else语句中的条件等等。
如需更多参考,请随时阅读以下任一文章:
答案 9 :(得分:0)
不使用const可能意味着团队项目中的某个人可以声明int FORTY_TWO = 42
在哪里,并在另一个团队成员的其他地方使其等于FORTY_TWO = 41
。因此,世界的末日发生了,你也失去了对生活的回答。与const
虽然这一切都不会发生。与正常变量的存储相比,加号const
存储在内存中的其他位置,效率更高。