问题:为什么出现下面的结果?
代码:
int i = 0;
int a = (i++) + (i++) + (++i);
System.out.println(a); // 输出4
希望能用 javap 分析的字节码文件解释下这个输出,如果不能,那用口述也行,这是在《Java特种兵上》书第三章第二节中碰到的问题(第85页)。
问题:为什么出现下面的结果?
代码:
int i = 0;
int a = (i++) + (i++) + (++i);
System.out.println(a); // 输出4
希望能用 javap 分析的字节码文件解释下这个输出,如果不能,那用口述也行,这是在《Java特种兵上》书第三章第二节中碰到的问题(第85页)。
这样你就能明白了,i++
下一次才会自增,而++i
本次就会自增,而i
会累加的
int i = 0; // i=0
int a = (i++); // a=0, i=1
int b = (i++); // b=1, i=2
int c = (++i); // c=3, i=3
System.out.println(a);
System.out.println(b);
System.out.println(c);
奉劝楼主不要研究这类问题。用如果用C语言试的话,结果是3(我试过MSVC,还没试过其他编译器)。而:
(i++) + (++i) + (++i)
这个结果是6。
务必坚持一个原则:运算符++
、--
要独立成行。
换句话说,要始终认为i++
和++i
是一回事。如果同事的代码中有++
、--
跟其他运算符组合用,务必改写掉,否则就留下一个坑。
这个和你用什么语言无关,造成这个原因是你的前置++
和后置++
运算顺序的问题,
int a = (i++) + (i++) + (++i);
等效于:
int i = 0;
int a = 0;
a = i++; // i = 0,a = i + a = 0, i = i+1 = 1
a += i++; // i = 1,a = i + a = 1, i = i+1 = 2
a += ++i; // i = i+1 = 3, a = a + i = 4
不知道你看明白了没有?
int i = 0;
int a = (i++) + (i++) + (++i);
| 执行过程 | i值 |
由于不明原因的排版问题,我只能截图了?
凭感觉写了个操作数栈的执行过程,自增自减是在栈顶发生的,这类对变量自身值读-写
的操作在多线程情况下存在 happend-before
问题,因此并发环境下基本不会直接写自增自减,需要用到java自实现的CAS类比如 AtomicInteger
。
i++ 是一个表达式, 表达式的值为 i的值, 副作用是i的值 加1。
++i 是一个表达式, 表达式的值为 i + 1, 副作用是 i的值 加1
int a = (i++) + (i++) + (++i) 就是 a = 0 + 1 + 3 = 4
4 回答957 阅读✓ 已解决
4 回答1.1k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
2 回答680 阅读✓ 已解决
2 回答1.6k 阅读
2 回答1.6k 阅读
2 回答1.2k 阅读
这几行代码对应的字节码如下(javap -c xxx.class):
(其中/**/里面的内容是我写的注释)