从过去,我了解到++意味着增量添加到整数的值。 如果++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
相同的事情,这让我更加困惑。
step++
和 ++step
本身会增加 step 的值,但它们的计算结果不同。 step++
计算结果为递增值,++step
计算结果为非递增值。
step = step++
递增步进,然后将非递增值分配给步进。
step = ++step
递增步进,然后将递增的值分配给步进。
因此step = step++
递增步骤,但然后将其设置回其原始值,使语句看起来没有效果。
我把你的条件剥离成简单的以下代码:
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
行为的差异是由于您使用的两个不同运算符的行为造成的。 变量前面的++
是前缀运算符,变量后面的++
是后缀运算符。在表达式计算期间,两个不同的运算符在两个不同的时间修改变量。看到这个堆栈溢出 前缀和后缀运算符有什么区别?
时,将计算赋值运算符右侧的操作(等号或=
(,并将结果放入赋值运算符左侧的变量中。
右侧的操作是使用各种运算符优先级规则计算或计算的。 请参阅Java 中的堆栈溢出运算符优先级。
所以问题是当评估右侧时,赋值运算符右侧的各种操作的结果是什么。
前缀和后缀运算符在 Java 以及大多数语言中几乎都具有最高的运算符优先级。这意味着,除非使用括号来修改求值顺序,否则前缀和后缀运算符将是最早计算的运算符之一。 请参阅 Java 运算符优先级表,了解简短的备忘单表。
前缀运算符修改变量,然后在任何其他操作中使用变量的新值。后缀运算符在变量的当前值另存为临时值后修改变量。
换句话说,表达式中使用的变量的值将是具有前缀运算符的更改值和具有后缀运算符的未更改值。
使用两个变量而不是一个变量更容易看到正在发生的事情:
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
递增。
换句话说,当使用前缀或后缀运算符时,该运算符实际上有两个结果或结果。第一个结果是运算符正在修改的变量的更改,也称为副作用。第二个结果是提供给可能参与计算的任何其他运算符的值。对于前缀运算符,第二个结果是应用前缀运算符后变量的新值。对于后缀运算符,第二个结果是应用后缀运算符之前变量的旧值。