【问题标题】:Confusion about result of pre and post decrements对前后递减结果的混淆
【发布时间】:2015-02-07 03:36:34
【问题描述】:

我最近开始在我的计算机科学课上学习 Java,并且遇到了一些有趣的事情。 基本上我的变量设置如下 int x = 5;

我创建了一个表达式x = (x--) - (--x) 当我打印变量 x 时,无论变量 x 是什么,它总是得到 2

具体代码是:

import acm.program.*;

public class MathOperations extends ConsoleProgram {

    private static final long serialVersionUID = 1L;

    public void run(){

        setFont("arial-bold-24");

        int x = -5, y = -3;
        double z = 2.2;

        x = (x--) - (--x);

        println ("x= " + x);
    }

}

为什么结果总是2?

【问题讨论】:

  • 你的问题是“为什么结果总是2?”?
  • 是的,你是怎么得出这个结果的
  • 在@rgettman 发布他的答案之后,只要说你不应该在前后递减的情况下做这样时髦的事情就足够了。
  • 这可以通过打印x----x然后减去它们来计算
  • 是的,我终于明白了,谢谢大家的帮助

标签: java


【解决方案1】:

结果始终为2,对于您可以使用的任何int。原因:

(x--) 首先求值,因为操作数是从左到右求值的。这会产生原始值 x,但之后,x 是原始 x - 1。然后评估 (--x)。它返回x - 1,已经减了一次,所以结果是原来的x - 2。

从那里,这是简单的数学运算,x - (x - 2)2

但是减量中可能的下溢呢?

int x = Integer.MIN_VALUE + 1;
x = x-- - --x;
System.out.println(x);

结果仍然是2。如何? Integer.MIN_VALUE 是:

10000000 00000000 00000000 00000000

将其递减两次将产生Integer.MAX_VALUE - 1

01111111 11111111 11111111 11111110

2 的补码符号中的减法产生

00000000 00000000 00000000 00000010

2,即使发生下溢。

对于任何整数类型都是如此:byteshortintlong

有趣的是,对于大多数常见的浮点值也是如此,例如2.2

但是,如果浮点类型的精度大于1,那么递减运算的结果将不会改变值。在这种情况下,结果将是0

double x = (double) (1L << 54);
x = x-- - --x;
System.out.println(x);

结果:

0.0

【讨论】:

  • 我要补充一点,表达式是从左到右计算的,除非括号设置不同的优先级。
  • 另外,请注意“any int”的下溢
【解决方案2】:

Java 使用固定的order of precedence 评估运算符。这行代码x = (x--) - (--x)有4个运算符:前缀--、后缀--、减法、赋值。按优先级排序,它们是后缀--、前缀(一元)--、减法(加法)和赋值。这使您的语句按以下顺序运行:

  1. x = 5 - (--x): x(5) 在此操作后递减
  2. x = 5 - (3): x 再次从之前的递减值递减到 3
  3. x = 5 - 3
  4. x = 2

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2016-07-08
    • 2013-08-19
    相关资源
    最近更新 更多