女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

女孩看到 score = score + 2,疑惑:一个数怎么会等于自己加 2?这里的等号与数学等式用途不同。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 先看右边旧 score 是 3
  2. 算出结果3 加 2 是 5
  3. 写入左边score 更新为 5

赋值先求右边表达式的值,再把结果写入左边指定的变量。

它描述一个动作,不是在宣称“两边永远相等”。因此执行前后,score 可以不同。

先读旧值,再写新值

同一行 score = score + 2 连续执行两次。

第 1 步 · 执行之前
score3

先读取右边的旧 score,它现在是 3。

第 2 步 · 第一次赋值
score5

右边 3 + 2 得 5,再把 5 写回 score。

第 3 步 · 第二次赋值
score7

这次读取的是 5,5 + 2 得 7;不会又从 3 开始。

01什么叫赋值?

看这行代码:

score = 95;

它的意思是:把右边表达式得到的值 95 写入左边的变量 score

02为什么 = 不是数学等号?

数学里写 x = x + 1 是不成立的。

但程序里:

x = x + 1;

意思是先读取旧的 x,计算 x + 1,再把结果写回 x

读取旧值计算 x + 1写回 x

03初始化和赋值一样吗?

不完全一样。

初始化

int x = 10;

创建对象时给它初始值。

赋值

x = 20;

对象已经存在,再把新值写进去。

04右边可以是计算结果吗?

当然可以。右边叫作表达式,它可以先计算:

int a = 3;
int b = 5;
int c;
c = a * 2 + b;

先计算 a * 2 + b,得到 11,再赋给 c

05不同类型之间能赋值吗?

有些情况下可以,但可能发生类型转换。

int x;
x = 3.9;

这里浮点数会被转换成整数,小数部分被截去,得到 3

06所有东西都能被赋值吗?

不行。左边必须是一个可修改的对象。

10 = x;   // 错误

数字字面量 10 不是可以被修改的对象,所以不能放在赋值号左边。

你已经知道了什么

  • 赋值是把右侧表达式的结果写入左侧对象。
  • = 是赋值运算符,不是数学相等符号。
  • x = x + 1 表示读取旧值、计算、再写回。
  • 初始化和赋值不是完全相同的概念。
  • 不同类型赋值时可能发生类型转换。

下一篇:+ - * /:让计算机做数学

轮到你来试一试

score 原来是 5,连续执行两次 score = score + 2,最后是多少?

想好了吗?点开看解释

第一次得到 7,第二次读取新的 7,再加 2 得到 9。不是两次都用最初的 5。