Java中一个非常简单的表达式,它以难以遵循的方式进行评估

时间:2011-11-09 16:39:54

标签: java

在JSF中开发Web应用程序时,我遇到了一个以我无法遵循的方式进行评估的表达式。让我们用简单的Java代码表示相同的表达式。

final public class Main
{
    public static void main(String[] args)
    {            
        int x=5;
        int temp=10;

        temp=temp + 1 + x;
        System.out.println("temp = "+temp);

        int var=10;
        var=var++ + x;
        System.out.println("var = "+var);
    }
}

在上面的简单代码段中,第一种情况很明显,它通过语句System.out.println("temp = "+temp);显示值 16 。毫无疑问,但在第二种情况下,我使用简写运算符 ++ (var ++)表示相同的事情,并导致值 15 显示在控制台上,而不是显示 16 。这个表达式在这里如何评估?


这里有一个显而易见的事情应该提到。在表达式var ++中,首先传递10,并且该值(不是11)用于计算赋值右侧的整个表达式,在本例中为 var ++ + x ,然后是 var 增加1.因此,此处无法观察到自身(var)的分配。 增量丢失在哪里?

5 个答案:

答案 0 :(得分:4)

var++计算到var,然后递增var。所以你的表达式实际上被评估为var + x

行动顺序如下:

  • 评估var ++:10
  • 增量var:var = 11
  • 将x添加到10:15
  • 将添加结果分配给var:var = 15

任何这样的编程应该被禁止开发,恕我直言。

答案 1 :(得分:3)

像x ++这样的后增量运算符意味着首先使用值x然后增加,在我们的例子中

 var=var++ + x;

分配优先。 试试这个

 var=++var + x;

你应该得到16的值。

答案 2 :(得分:2)

您为var分配了一个值,因此会执行自动增量但会被覆盖。

您的代码最好写成:

int var = 10;
var += x + 1;
System.out.println("var = " + var);

答案 3 :(得分:2)

根据Java语言规范

  

后缀增量表达式的值是存储新值之前的变量的值。

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.14.2

答案 4 :(得分:1)

这是后增量运算符的预期行为。通过运行以下内容,您可以更清楚地了解正在发生的事情:

int var = 10;
var = var++;
System.out.println("var = " + var);

var = 10;
var = var++ + var;
System.out.println("var = " + var);

这应该产生输出:

10
21

后递增运算符返回当前表达式中变量的当前值,然后递增它,因此递增的值仅在下次使用该变量时可见。

在代码中,在使用递增值之前覆盖var的值(因此递增“丢失”)。我想字节代码类似于:

// r holds the intermediate value of the expression while it's calculated
int x = 5;
int var = 10;

int r = r + var;
var = var + 1;  // note var is not read after this point
r = r + x;
var = r;