跳到主要内容

i += i + (i = 4)

阅读需 2 分钟

先贴一段简单的代码,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) 了,也就没有括号了。

今天第一次看见这样的表达式。。知识欠缺。如果你不明白栈是什么,相信你会查查资料。

参考资料:

  1. 数据结构(C语言版)严蔚敏版 算法3.2.5 表达式求值
  2. 搜索“表达式求值”。
暂时未加入评论功能,请在对应公众号文章下或 GitHub Issues下留言反馈。