赋值是什么?
对于那些以面向过程语言来入门的人来说,可能认为赋值是最重要的东西。因为上来就说的是这个,并且也貌似容易理解。
但是,赋值和所谓的“变量”真正意义是啥呢?
两个意思
变量就是一块内存,赋值就是改变这块存储的内容。问题就出在这个改变上,这个改变导致了状态的变化。比如:
1 | int a = 1; |
对于初学者来说,碰到a = a + 10
这种语句肯定非常困惑,a = 1
是好理解的,无非就是给1起名字叫a,在这里等号就是起名字的意思,但是到了a = a + 10
这句,等号就不再是起名字的意思了。等号的意思是改变a的状态,a的初始状态是1,改变a的状态,加10。
那问题就来了,这个a
这个字母,第一行的a和第二行的a是不是同一个a?当然不是,但是,人脑习惯上会把不同的东西当作一个东西。
昨天的我和今天的我当然不是同一个我,但是,我仍然认为就是同一个我。没想到在这里遇到了赫拉克利特的困境:
人不能两次踏进同一条河流
虽然确实不是同一条河流,但是我坚持认为就是同一条河流。
赋值,有时候是起名字的意思,有时候是改变状态的意思。
名字起的好有多重要
编程就是起名字,然后控制这些名字。至于怎么个控制法,那就是一个学问了。
例子:
二叉树右旋
1 | //定位右孩子(起名字) |
这几行代码貌似看着简单,都是赋值语句。但是理解起来并不简单。因为它在频繁的改变状态:
频繁改变状态带来的问题就是必须得跟踪这个状态的改变,才能理解代码的逻辑。
为什么看不懂源码
- 没有类型标识,变量名起的太差,不知道名字的语义是啥。
- 不知道名字的状态是啥,无法跟踪它的状态。
这也就不难理解为什么有人建议要谨慎赋值了,主要是为了可读性。还有提高可读性的方法就是,精简注释,函数起名的时候尽量用动词,比如get_height
, close_remote
这种。容器类型的名字尽量是复数之类的。