为什么说赋值并不好理解

赋值是什么?

对于那些以面向过程语言来入门的人来说,可能认为赋值是最重要的东西。因为上来就说的是这个,并且也貌似容易理解。
但是,赋值和所谓的“变量”真正意义是啥呢?

两个意思

变量就是一块内存,赋值就是改变这块存储的内容。问题就出在这个改变上,这个改变导致了状态的变化。比如:

1
2
int a = 1;
a = a + 10;

对于初学者来说,碰到a = a + 10这种语句肯定非常困惑,a = 1是好理解的,无非就是给1起名字叫a,在这里等号就是起名字的意思,但是到了a = a + 10这句,等号就不再是起名字的意思了。等号的意思是改变a的状态,a的初始状态是1,改变a的状态,加10。
那问题就来了,这个a这个字母,第一行的a和第二行的a是不是同一个a?当然不是,但是,人脑习惯上会把不同的东西当作一个东西。
昨天的我和今天的我当然不是同一个我,但是,我仍然认为就是同一个我。没想到在这里遇到了赫拉克利特的困境:

人不能两次踏进同一条河流

虽然确实不是同一条河流,但是我坚持认为就是同一条河流。

赋值,有时候是起名字的意思,有时候是改变状态的意思。

名字起的好有多重要

编程就是起名字,然后控制这些名字。至于怎么个控制法,那就是一个学问了。

例子:
二叉树右旋

1
2
3
4
5
6
7
8
9
//定位右孩子(起名字)
right_child = (*root)->Right;

//右孩子的左节点变为根节点的右子树(改变)
(*root)->right = right_child->left;
//根变为右孩子的左子树(改变)
right_child->left = root;
//右孩子变为当前根节点(改变)
root = richt_child;
image host

这几行代码貌似看着简单,都是赋值语句。但是理解起来并不简单。因为它在频繁的改变状态:

频繁改变状态带来的问题就是必须得跟踪这个状态的改变,才能理解代码的逻辑。

为什么看不懂源码

  • 没有类型标识,变量名起的太差,不知道名字的语义是啥。
  • 不知道名字的状态是啥,无法跟踪它的状态。

这也就不难理解为什么有人建议要谨慎赋值了,主要是为了可读性。还有提高可读性的方法就是,精简注释,函数起名的时候尽量用动词,比如get_height, close_remote这种。容器类型的名字尽量是复数之类的。