关于符号常量 , 恳请解答一下

2014-04-11 11:17:09 +08:00
 GPU
看 K&R 时 , 说到了符号常量 , 文中提到

[ 在程序中使用 300、20等类似的"幻数"并不是一个好习惯,它们几乎无法向以后阅读该程序的人提供什么信息,而且使程序的修改变得更加困难. ]

从而尽可能小地使用"幻数"而是使用符号常量 .

在百度百科看到这么一段话
[在c语言中,把直接使用的常数叫做幻数。在编程时,应尽量避免使用幻数,因为当常数需要改变时,要修改所有使用它的代码,工作量巨大,还可能有遗漏。因此通常把幻数定义为宏或枚举。建议使用枚举,因为它是编译阶段存在的符号,编译器的提示会更清晰、更准确。]


那么幻数我search了一下,说是一个不确定的数 , 我理解貌似就是一个广义的意思,每个领域理解都不一样 .

然后有说到 ,如果只使用幻数 会令源码作者以为的人很难知道这个幻数是做什么用的 ,
我的问题就来了 , 在定义一个数的时候也会有一个变量名啊, 怎么会很难理解呢?

然后如果是用符号变量 "#define" 也是有一个名字 , 在代码中也是和使用变量名一样的.

以上所有的 , 能否有人给一些列子让我了解一下呢 ??




==========================================================


然后 我有看到一个符号变量解释说 .
[符号常量 pi 和常变量 PI 都代表3.1415926,在程序中都能使用,只是二者的性质有所差别,定义符号常量使用#define 指令,是预编译指令,只是使用一个符号常量代表一个字符串,在预编译是仅仅进行字符替换,在预编译之后符号常量不存在了(全部换成了3.1415926),对符号常量的名字是不分配内存的。常变量要占据内存空间,有变量值,只是这个值不改变。]

这个解释说到了程序的效率 或者是性能方面的. 这个又是如何呢?




文章有点长 . 希望能有一个好点的解答啊.
3821 次点击
所在节点    程序员
28 条回复
GPU
2014-04-11 12:52:52 +08:00
@xia0ta0 啊, 我终于明白原因了. !!! . 你这个解释终于能令我这个初学者明白啦 .

书本上要提到这个东西是因为 , 他上一个题目是说 for语句的. 但是他是直接用了"幻数"直接放在for语句里面的条件 . 然后他下一篇就立马提到 "符号常量" 意思就是把这些"幻数"定义一下 , 这样当程序被作者以外的人看,也可以明白这个"幻数"是做什么用的.


再然后 , 劈开你说的"宏定义" 这些强大的功能 ,那么这个符号常量是没有用途的 ,只是让人看代码时更容易明白代码的意思 , 而书上要提到这个东西 , 意义就是让程序员们能良好的编写代码的习惯.! .

就想到这么多了.
GPU
2014-04-11 12:58:48 +08:00
@slixurd 那你14楼所说的常量是什么意思?
lukic
2014-04-11 13:17:39 +08:00
既然楼主是初学者就没必要纠结这么多,多实践就慢慢明白了。
xia0ta0
2014-04-11 13:24:38 +08:00
@GPU 选本好的入门教材很重要,推荐《c程序语言设计》,组织的很有条理,不会让读者自动脑补。。。。
GPU
2014-04-11 13:36:46 +08:00
@xia0ta0 《c程序语言设计》 是不是那本K&R? . 徐宝文 先生 译著的. 我现在就是看这个本 .发的现在这个问题 . 只是就像#16 说的那样我自己纠结而已. 总是把问题想得太复杂,非要弄懂他不可 这样子.
xia0ta0
2014-04-11 13:41:31 +08:00
好吧,且读且珍惜。。。。
levie
2014-04-11 16:08:52 +08:00
我理解啊,lz不是要弄清楚常量和变量,而是什么样的数是幻数,以及我们为什么要避免使用幻数。
比如

int height = (2 + 100 + 5) * 2;

这里面2、100、5、2都是幻数,一般人读到这行代码都会困惑这些数怎么来的,所以也有称它们是神仙数的,只有神仙才能猜到那些数是什么意思。
如果改成这样写:

int topMargin = 2, contentHeight = 100, bottomMargin = 5, scale = 2;
int height = (topMargin + contentHeight + bottomMargin) * scale;

这样的代码就好读了,当然写起来也累_(:з」∠)_

另外一个好处是改参数的时候容易,比如你要把改缩放比例从2为3,那么你只要改scale = 3就好了,而不用查找所有2,然后费劲地把其中一部分2改成3.

所以,幻数与否于不是看常量变量。
GPU
2014-04-11 16:48:17 +08:00
@levie 嗯. .我当初就是不明白书上面为什么要特意提及这个. 现在已经明白了. 不过这个 变量 常量这些深入的东西还是不会的. 我只是刚刚初学 .看的K&R .哈哈.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/108097

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX