java中的递增和递减运算符
Posted
技术标签:
【中文标题】java中的递增和递减运算符【英文标题】:Increment and Decrement operators in java 【发布时间】:2014-03-21 06:35:18 【问题描述】:我对增量和减量运算符有疑问。我不明白为什么 java 会给出这些输出。
x = 5; y = 10;
System.out.println(z = y *= x++); // output is 50
x = 2; y = 3; z = 4;
System.out.println("Result = "+ z + y++ * x); // output is Result = 46
x = 5;
System.out.println( x++*x); // output is 30
x = 5;
System.out.println( x*x++); // output is 25
例如,在第二个 println 函数中,y 乘以不增加 1,而在第三个函数中,x 与 x+1 相乘。据我所知,一元递增和一元递减运算符的优先级高于算术运算符,所以为什么第二个计算不增加 1( y++ * x = 3*2 = 6 ,为什么不 (y+1) * x = 8 ?
【问题讨论】:
您将运算符优先级与求值顺序混淆了。 如果只考虑优先级,那么为什么还要麻烦y++
和++y
? :)
对于第 2 行,如果您在之后的行中使用变量 y,则 y 将得到值 '4'。这与 * 优先于 + 的运算符的算术排序无关。 preincrement 运算符立即使用递增的值,而 postincrement 运算符在执行操作后递增值。
【参考方案1】:
postfix-++
表示,变量以其当前值求值,在对周围的表达式求值后,变量递增。
【讨论】:
【参考方案2】:y++ 将在代码后的 y 上加 1。 ++y 将在代码前的 y 上加 1。
【讨论】:
【参考方案3】:需要理解的东西:
后自增运算符(变量名后的++
)返回变量的旧值,然后递增变量。因此,如果x
是5
,那么表达式x++
的计算结果为5
,并且具有将x
设置为6
的副作用。
这个有点特别:
x = 2; y = 3; z = 4;
System.out.println("Result = "+ z + y++ * x); // output is Result = 46
注意这里使用了字符串连接。它打印Result =
,然后是4
,它是z
的值,然后是y++ * x
的值,它是6
。 46
不是一个数字,它是来自两个表达式的4
和6
。
【讨论】:
感谢您的评论。我基本明白了。【参考方案4】:它们的优先级高于二元运算符,但它们的计算结果为“x”。后递增的副作用不是优先级的一部分。
【讨论】:
【参考方案5】: x = 5; y = 10;
System.out.println(z = y *= x++); // output is 50 -->z=y=y*x i.e, z=y=10*5 (now, after evaluation of the expression, x is incremented to 6)
x = 2; y = 3; z = 4;
System.out.println("Result = "+ z + y++ * x); // output is Result = 46 --> from Right to left . y++ * x happens first..So, 3 * 2 = 6 (now, y will be incremented to 4) then "Result = " +z (String) + number (y++ * z) will be concatenated as Strings.
x = 5;
System.out.println( x++*x); // output is 30 --> 5 * (5+1 i.e, x is already incremented to 6 when you do x++ so its like 5 *6 )
x = 5;
System.out.println( x*x++); // output is 25 -- > 5 * 5 (x will be incremented now)
【讨论】:
【参考方案6】:因为y++
y
将首先被评估,然后递增。
相反,++y
的增量发生在评估之前。
【讨论】:
【参考方案7】:您的第一个表达式z = y *= x++
等于:
z=y=y*x;
x++;
您的第二个表达式+ z + y++ * x
等价于:
z + ""+ (y*x) // here z = 4 and y*x is 6 which gives us 46.
同样你可以找出第三个和第四个表达式。
【讨论】:
【参考方案8】:我建议阅读本教程,我想会对用法有所启发 -> Java operators.
让我们把它分解:
x = 5; y = 10;
System.out.println(z = y *= x++);
在上面的代码中,您对 y * = x++; 的结果赋值给 z这意味着 y = y * x++。现在,x++ 将在乘法完成后进行评估。如果您希望它发生在以前,您应该使用 ++x。
x = 2; y = 3; z = 4;
System.out.println("Result = "+ z + y++ * x); // output is Result = 46
在这种情况下,您将字符串与上述值连接起来;首先是乘法,然后是加法,最后才计算后增量。
其余示例与上述示例类似。运算符优先级是上面应用的规则,您可以使用此表查看它们的评估顺序:Operator Precedence
【讨论】:
以上是关于java中的递增和递减运算符的主要内容,如果未能解决你的问题,请参考以下文章