
一起动脑筋 · 先看一个小故事
女孩看到 score = score + 2,疑惑:一个数怎么会等于自己加 2?这里的等号与数学等式用途不同。
把过程摊开来看
- 先看右边旧 score 是 3
- 算出结果3 加 2 是 5
- 写入左边score 更新为 5
赋值先求右边表达式的值,再把结果写入左边指定的变量。
它描述一个动作,不是在宣称“两边永远相等”。因此执行前后,score 可以不同。
先读旧值,再写新值
同一行 score = score + 2 连续执行两次。
score3
先读取右边的旧 score,它现在是 3。
score5
右边 3 + 2 得 5,再把 5 写回 score。
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。