++ 操作数在 var=var++ 时不起作用;
++ operand does not work if var=var++;
从很久以前,我就知道++的意思是递增地增加一个整数的值。如果是 ++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
相同,这让我更加困惑。
我将你的情况简化为以下简单的代码:
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
step++
和 ++step
本身会增加 step 的值,但它们会计算出不同的值。 step++
计算为增量值,++step
计算为非增量值。
step = step++
递增 step,然后将未递增的值分配给 step。
step = ++step
递增 step,然后将递增的值分配给 step。
因此 step = step++
正在递增步长,但随后将其设置回其原始值,使得该语句似乎无效。
行为差异是由于您使用的两个不同运算符的行为所致。变量前面的++
是前缀运算符,变量后面的++
是后缀运算符。在表达式求值期间,两个不同的运算符会在两个不同的时间修改变量。看到这个计算器 What is the difference between prefix and postfix operators?
当你做赋值时,赋值运算符右侧的运算(等号或=
)被计算,结果被放入赋值运算符左侧的变量中.
右侧的运算是使用各种运算符优先级规则进行评估或计算的。看到这个 Whosebug Operator precedence in Java.
所以问题是当计算右侧时,赋值运算符右侧的各种操作的结果是什么。
前缀运算符和后缀运算符在 Java 以及大多数语言中几乎都具有最高的运算符优先级。这意味着除非使用括号来修改求值顺序,否则前缀和后缀运算符将是最先求值的运算符之一。请参阅 Java Operator Precedence Table 获取简短的备忘单 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
递增。
换句话说,当使用前缀或后缀运算符时,运算符实际上有两个结果。第一个结果是操作员正在修改的变量的变化,也称为副作用。第二个结果是提供给可能参与计算的任何其他运算符的值。对于前缀运算符,第二个结果是应用前缀运算符后变量的新值。对于后缀运算符,第二个结果是应用后缀运算符之前变量的旧值。
从很久以前,我就知道++的意思是递增地增加一个整数的值。如果是 ++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
相同,这让我更加困惑。
我将你的情况简化为以下简单的代码:
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
step++
和 ++step
本身会增加 step 的值,但它们会计算出不同的值。 step++
计算为增量值,++step
计算为非增量值。
step = step++
递增 step,然后将未递增的值分配给 step。
step = ++step
递增 step,然后将递增的值分配给 step。
因此 step = step++
正在递增步长,但随后将其设置回其原始值,使得该语句似乎无效。
行为差异是由于您使用的两个不同运算符的行为所致。变量前面的++
是前缀运算符,变量后面的++
是后缀运算符。在表达式求值期间,两个不同的运算符会在两个不同的时间修改变量。看到这个计算器 What is the difference between prefix and postfix operators?
当你做赋值时,赋值运算符右侧的运算(等号或=
)被计算,结果被放入赋值运算符左侧的变量中.
右侧的运算是使用各种运算符优先级规则进行评估或计算的。看到这个 Whosebug Operator precedence in Java.
所以问题是当计算右侧时,赋值运算符右侧的各种操作的结果是什么。
前缀运算符和后缀运算符在 Java 以及大多数语言中几乎都具有最高的运算符优先级。这意味着除非使用括号来修改求值顺序,否则前缀和后缀运算符将是最先求值的运算符之一。请参阅 Java Operator Precedence Table 获取简短的备忘单 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
递增。
换句话说,当使用前缀或后缀运算符时,运算符实际上有两个结果。第一个结果是操作员正在修改的变量的变化,也称为副作用。第二个结果是提供给可能参与计算的任何其他运算符的值。对于前缀运算符,第二个结果是应用前缀运算符后变量的新值。对于后缀运算符,第二个结果是应用后缀运算符之前变量的旧值。