【发布时间】:2016-01-12 06:23:09
【问题描述】:
我正在尝试更深入地使用 post 和 pre 增量器,但我有点坚持以下表达式:
public static void main(String[] args) {
int i = 0;
i = i+=(++i + (i+=2 + --i) - ++i);
// i = 0 + (++i + (i+=2 + --i) - ++i);
// i = 0 + (1 + (3 + 2) - 1 );
// i = 0 + (6 - 1 );
System.out.println(i); // Prints 0 instead of 5
}
我知道我在某处遗漏了逻辑,但在哪里?
我尝试过的:
- 从左到右(虽然我知道不推荐)
- 从内侧括号开始,从那里开始。
感谢您的帮助
PS : cmets 是我的微积分的细节
编辑 1
我尝试将表达式中的硬编码值从2 更改为其他值,结果总是给出0
看看这个例子:
int i = 0;
i = i+=(++i + (i+=32500 + --i) - ++i);
System.out.println(i); // Prints 0
这个表达式在逻辑上应该离0很远,但它确实打印了它。
当我使用否定时也会发生同样的情况:
int i = 0;
i = i+=(++i + (i+=(-32650) + --i) - ++i);
System.out.println(i); // Prints 0
编辑 2
现在,我将i 的值改为:
int i = 1;
i = i+=(++i + (i+=2 + --i) - ++i);
System.out.println(i); // Prints 2
i = 2;
i = i+=(++i + (i+=10000 + --i) - ++i);
System.out.println(i); // Prints 4
i = 3;
i = i+=(++i + (i+=(-32650) + --i) - ++i);
System.out.println(i); // Prints 6
无论硬编码的值是什么,它每次都会给出i 的两倍。
【问题讨论】:
-
啊,没听懂
-
从左到右不会解决它.. 编译器将普通表达式转换为 reverse polish notations 并评估它们,然后构造一个 表达式树 并解决表达式.
-
所以简单地从左到右或从内到内不会给你程序将生成的结果
-
@Thomas 这确实只是好奇。我想了解我所学的一切。
-
@JiriTousek 我用 1.4 编译,然后运行以下版本,在 Windows 7 上都生成了
0: 1.4.2_19, 1.5.0_22, 1.6.0_45, 1.7.0_79, 1.8.0_51 , Sun/Oracle JVM。
标签: java logic post-increment pre-increment