如果var = var ++,则++ operand不起作用;

时间:2015-11-22 09:33:26

标签: java increment

从过去,我已经知道++意味着逐步增加一个整数的值。如果++ var它将首先添加一个然后将其分配给值,如果var ++它将稍后添加一个。

这是我的问题:

int step=0;
if(conditon==true){
    while(!end ){
        step=step++;
    }
}
     System.out.println(step);

这段小代码的输出将为零。但是,如果我将step=step++;替换为step=++step;,那么它会给出正确答案。

但是我很困惑为什么会有区别?

修改

与所提到的答案的区别:有2个(或甚至3个)不同的变量彼此分配,而这里step = step ++将导致0.基于该问题的答案,它将是不同的。但事实并非如此。为什么?

以下是该问题的答案:

int x = 0;
int y = 0;
y = ++x;            // result: y=1, x=1

int x = 0;
int y = 0;
y = x++;            // result: y=0, x=1

根据这一点,step=step++应该加起来step(因为这里的x和y都是相同的变量,这是步骤),但事实并非如此。

编辑2

还有一些令人困惑的事情。如果将step=step++替换为step++,则会导致与step=++step相同的事情,这让我更加困惑。

3 个答案:

答案 0 :(得分:2)

step++++step本身会增加step的值,但它们会评估为不同的值。 step++计算增量值,++step计算为非递增值。

step = step++递增步骤,然后将非递增值分配给步骤。

step = ++step递增步骤,然后将递增的值分配给步骤。

所以step = step++正在递增步骤,然后将其设置回原始值,使语句看起来没有效果。

答案 1 :(得分:1)

我将您的条件分成以下简单代码:

  int step=0;
  step=step++;           
  System.out.println(step); // will give 0

这给出0作为输出的原因是因为递增的值从未分配给step

step=step++;这就是发生的事情

int temp = 0;
step = temp; // step will get 0
temp = temp +1; // while temp is incremented

如果++step上述更改

int temp =0 ;
temp = temp + 1; // temp gets incremented
step =temp; // step gets the  incremented value

答案 2 :(得分:1)

行为的差异是由于您正在使用的两个不同运营商的行为。变量前面的++是前缀运算符,变量后面的++是后缀运算符。在评估表达式期间,两个不同的运算符在两个不同的时间修改变量。请参阅此stackoverflow What is the difference between prefix and postfix operators?

执行赋值时,将对赋值运算符右侧的运算(等号或=)进行求值,并将结果放入赋值运算符左侧的变量中。 / p>

通过使用运算符优先级的各种规则来评估或计算右侧的操作。请参阅此stackoverflow Operator precedence in Java

所以问题是当评估右侧时,赋值运算符右侧的各种操作的结果是什么。

前缀和后缀运算符在Java和大多数语言中几乎都具有最高的运算符优先级。这意味着除非使用括号来修改评估序列,否则前缀和后缀运算符将是最先评估的运算符之一。有关简短的备忘单表,请参阅Java Operator Precedence Table

前缀运算符修改变量,然后在任何其他操作中使用变量的新值。在将变量的当前值保存为临时值之后,后缀运算符会修改变量。

换句话说,表达式中使用的变量的值将是带有前缀运算符的更改值和带有后缀运算符的未更改值。

通过使用两个变量而不是一个变量,更容易看出发生了什么:

int  a, b;

a=0;
b = ++a;  // increment a and assign the new value of variable a to variable b
b = a++;  // increment a and assign the old value of variable a to variable b

如果您正在使用单个变量,那么会发生变量a的值被赋值语句更改为右侧评估的任何值。因此,即使变量a被前缀和后缀运算符修改,赋值也将覆盖右侧评估的新值。

使用前缀运算符,右侧将计算变量a的新增值。使用后缀运算符,右侧将在变量a的旧值被后缀运算符递增之前求值。

通常情况下,当只需要增加一个变量时,就会在独立语句中使用前缀或后缀++

int a = 0;

a = a + 1;   // increment a by adding 1 to the value and assigning new value to a
a += 1;  // increment a by using += operator
a++;   // increment a by using postfix ++ operator
++a;   // increment a by using the prefix ++ operator

在上面使用++运算符的语句中,操作结果没有任何作用。因此,变量a会增加,但是来自后缀运算符的a的旧值或来自前缀运算符的a的新值不会用于任何事情。使用这些运算符的唯一结果是变量a递增。

换句话说,当使用前缀或后缀运算符时,实际上有两个来自运算符的结果或结果。第一个结果是操作员正在修改的变量的变化,也称为副作用。第二个结果是提供给可能涉及计算的任何其他运算符的值。对于前缀运算符,第二个结果是应用前缀运算符后变量的新值。对于后缀运算符,第二个结果是应用后缀运算符之前的变量的旧值。