- 论坛徽章:
- 8
|
变量、变量名、变量值、变量地址是截然不同的几个概念。弄明白了,严格区分开了,在学习由此拓展的其他知识时就会事半功倍;否则——写到书上就误人子弟,教给别人就会误导人家走很多弯路。
当然,这方面稍微有些不严谨并不会影响你去当一个coder;但绝对会影响你学习更高深的知识。
这是wikipedia关于变量的解释:
http://en.wikipedia.org/wiki/Variable_(programming)
摘录开头部分:
In computer programming, a variable is a facility for storing data. The current value of the variable is the data actually stored in the variable. Depending on the programming language in question, the data stored in the variable can be intentionally altered during the program run, thus causing its value to change, or vary, hence the name. The variable can be referenced by identifiers. In contemporary programming languages, even non-identical identifiers can refer to the same variable.
Variables in programming do not directly correspond to the notion of variables in mathematics. The closest mathematical notions are substitution and evaluation.
可见:在计算机科学上,变量是一种存储数据的东西。变量存储的东西可以被改变,这就是它被称为变量的原因。
我们可以通过标识符来访问变量。在很多语言里,可以用不同的多个标识符来访问同一个变量。
所以,int i 就定义了一个变量,这个变量被我们命名为i——i是标志符,不是变量;但我们可以通过i这个标志符来找到变量i。
通过c++的引用机制,我们可以再定义一个标识符j,让j同样和i代表的那个变量关联:
int &j=i;
注意i 、j都是一个标识符,而且它们还是不同的标志符,只是在背后,这两个标识符关联了同一个变量。
i、j关联的那个变量在哪里呢?
不知道。
根据程序逻辑的不同,编译器可以把它放在内存里,可以把它放到寄存器里,甚至还可以把它优化掉——不存在于内存,不存在于寄存器,只是干净利索的删除掉。
当然,大多数情况下,i、j关联的那个变量会被在内存里安排一个或多个存储单元。那么这个存储单元究竟在哪里?
我们可以用取地址操作符&得到这个信息——&i 或者 &j 都可以。
这里就可以很明显看出变量和标识符的区别了: 变量是一个实体,而标识符不是。就好像你是个实体,而你的名字不是一样。
但不管你有多少个名字、外号,你这个人的实体是不变的。离开了你这个实体,名字、外号就没有意义——你绝不等于你的名字,是吧?
通过你的名字(加上一些手续)可以找到你,但这和直接抓到你的手不同,是这样吧?
同样,拿到变量的名字,和知道你的名字一样;拿到变量的地址,就好像拿到了你的住址/座位号一样;但只有真的抓到了你的手,这才是实实在在知道了你究竟是什么样子。
所以,有以下关系:
1、标识符--寄存器--变量
2、标识符--内存地址--变量
3、标识符--因为从未被使用而没有生成变量
争论这个有什么用?也许你会疑惑。
我只能说,等你学到编译优化等知识时,就会知道不搞清楚这个会吃多大苦头了。 |
|