Java中一个非常简单的表达式,其计算方式很难理解

Java中一个非常简单的表达式,其计算方式很难理解,java,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

在用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)
增量在哪里丢失了?

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

 var=var++ + x;
分配优先。 试试这个


您应该得到16的值。

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

您的代码最好编写为:

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

var++
计算为var,然后递增
var
。因此,表达式的计算结果实际上是
var+x

行动顺序如下:

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

var = 10;
var = var++ + var;
System.out.println("var = " + var);
  • 计算var++:10
  • 增量var:var=11
  • 加x到10:15
  • 将加法结果分配给var:var=15

任何像这样的编程都应该被禁止开发,IMHO。

根据Java语言规范

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


这是增量后运算符的预期行为。通过运行以下命令,您可以更清楚地看到发生了什么:

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;

自动增量和赋值均按该顺序执行。大卫·康拉德:在宇宙osmo的回答中,他在执行相关语句之前自动递增var一次。您不能通过“上面”和“下面”引用答案,因为答案的顺序发生了变化。啊,对不起,我是指JB Nizet的答案。当我发表这一评论时,只有一个答案。我弄错了。谢谢,很抱歉搞混了。听,听。我希望编译器会拒绝它。