先贴一段简单的代码,i的值是多少?
public class test{
public static void main(String args[]) {
int i = 1;
i += i + (i = 4);
System.out.println(i);
}
}
如果将 i += i + (i = 4);
改为 i += i + (i = 4) + i;
i的值又是多少?
问题的理解点在于数据结构的栈。表达式求值是栈应用的一个典型例子。(这里考虑算符优先法。)
算符间的优先关系:
+ | - | * | / | ( | ) | # | |
---|---|---|---|---|---|---|---|
+ | > | > | < | < | < | > | > |
- | > | > | < | < | < | > | > |
* | > | > | > | > | < | > | > |
/ | > | > | > | > | < | > | > |
( | < | < | < | < | < | = | |
) | > | > | > | > | | > | > |
# | < | < | < | < | < | = |
任何一个表达式都是由操作数、运算符和界限符组成的,我们称它们为单词。
现在我们再来分析 i += i + (i = 4);
这个表达式:
先拆开:i = i + (i + (i = 4));
,i 的值等于 i + (i + (i = 4))
的值。
i 的初始值是 1,i = 1现在入栈,就是1 + (1+ 4),在(i = 4)入栈且计算完毕后 i=4,最后 i 的值是 6 。
对于i += i + (i = 4) + i;
这个表达式,在 i = 4 之后再入栈一个 i ,因为此时 i = 4,所以是 1+(1+4+4),i 的值是10。
在计算完 (i = 4) 之后会在栈顶输入 4,没有 (i = 4) 了,也就没有括号了。
今天第一次看见这样的表达式。。知识欠缺。如果你不明白栈是什么,相信你会查查资料。
参考资料:
- 数据结构(C语言版)严蔚敏版 算法3.2.5 表达式求值
- 搜索“表达式求值”。