黑马程序员技术交流社区

标题: 程序计算表达式的底层运算原理(什么时候进行运算、赋值 [打印本页]

作者: fso918    时间: 2011-10-14 19:48
标题: 程序计算表达式的底层运算原理(什么时候进行运算、赋值
先引用2 个帖子:
脑力问题:http://bbs.itheima.com/thread-1891-1-1.html
++ 与 () 的表达式:http://bbs.itheima.com/thread-2401-1-1.html

这两个帖子表现得问题是同一个问题:
即 java 对运算符的运算顺序 与 java 程序执行顺序的问题。

表达式 int b = 5;a = b + (b = 6);
我们以前原始的思维是:即按小学老师的思维
先计算括号里的,因为他的优先级最高,至于括号前面的b等于多少,先放一放,把优先级高的运算先算完,等要用到它的时候再确定他的值,
所以括号运算完后,b就等于6 了,然后来算括号外的,外面有个b变量要参加运算,所以就去确定b 的值,而此时b等于 6,所以 a 的最终结果等于 12.

这对我们人来说,很好理解。但是计算机却无法这样做。因为我们人脑比计算机复杂多,而计算机是一根筋,他如果碰到变量没有值,就会报错。
所以上述表达式的执行程序顺序不是这样的。

那是怎么样的呢?

就是计算机如果碰到变量,就要解析他的值,如果没有值,不是给它它赋值,就是报错,程序中断。所以,当计算机执行 a = b + (b = 6 )时,他先
解析 变量a,这里a没值,那就给a赋值,然后程序执行到 b 这个变量,就立刻去解析这个变量b,把它的值取出来,这时b的值为5,就把5存起来;用5占住
b变量的位置,然后程序往下执行,碰到括号,程序就进入括号,读里面的b变量,此时b等于5,然后执行=号运算,程序就给b赋值6,此时b就等于6了,
所以以后对变量b的访问取回来得值都是6.即如果在表达式后加上对b的访问,如改为 a=b+(b= 6)+b结果为17.

其实,这归根结底是计算机的智能不够。不能完全按人类的思维方式来运作。

这不是java语言特有的,而是所有程序设计语言都是这样的。(我模糊记得N年以前教我C语言的那女老师是这么说的,具体是真记不清楚了,唉)

因为 引用的两个帖子在不同的区,所以我会在2个区里都发表这个帖子,斑竹们别删哦。
作者: 梁锡伟    时间: 2011-10-15 11:55
。。我觉得你了解这个,还不如写代码时候多加个括号,因为你的代码很可能别人会看得很纠结




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2