Java中++和--运算符的优先级

qvtsj1bj  于 2023-06-28  发布在  Java
关注(0)|答案(9)|浏览(134)

我从Java的官方教程中读到,前缀和后缀++--有不同的优先级:
后缀:expr++ expr--
一元:++expr --expr +expr -expr ~!
Operators
根据教程,这不应该
d = 1; System.out.println(d++ + ++d);
打印出6(d++使d 2,++d使它3)而不是4?
我知道++d被预先计算的解释,但是如果d++++d有更高的优先级,为什么d++没有被首先计算?更重要的是,在什么情况下d++应该显示它具有更高的优先级?
编辑:
我尝试了以下操作:
d = 1; System.out.println(++d * d++);
返回4。看起来应该是22,而不是13。

yqhsw0fo

yqhsw0fo1#

println语句的内部是这个操作(d++)+(++d)
1.如下,读取d的值(d = 1)
1.将d(1)的当前值放入加法函数中

  1. d的值递增(d = 2)。
    1.然后,在右侧,读取d的值(2)
  2. d的值递增(现在d = 3)
    1.最后将d(3)的值代入加法函数
    因此1 + 3的结果是4
    编辑:对不起的格式,我是相当糟糕的使用列表哈哈
gkn4icbw

gkn4icbw2#

关键是从操作中返回的内容。

  • x++改变x的值,但返回旧的x。
  • ++x改变x的值,并返回新的值。
d=1
System.out.println(d++ + ++d); // d is 1
System.out.println(1 + ++d); // d is 2
System.out.println(1 + 3); // d is 3

打印4

r1zhe5dt

r1zhe5dt3#

更高的优先级并不意味着将首先计算
这意味着表达式将以这种方式分组
在这种情况下,d++ + ++d将被分组为(d++) + (++d),并且此二进制表达式将按以下顺序进行计算:

  • 左操作数d++。这个子表达式由一个后缀增量运算符和一个变量组成,所以它有两个效果:
  • 子表达式的值为1
  • 更新变量:d = 2
  • 右操作数++d。这个子表达式由一个前缀增量运算符和一个变量组成,因此它具有以下两种效果:
  • 变量更新:d = 3
  • 子表达式的值为3
  • 运算符+使用两个操作数的值来求值。
  • 因此,表达式值为1 + 3 = 4。

++的前缀和后缀形式之间的不同优先级只会在++d++中看到,它将被解释为++(d++)-这没有任何意义((++d)++也没有任何意义),因为++只对变量有效,而不是值(结果是一个值)。

pbossiut

pbossiut4#

这不是优先级的问题,而是求值顺序的问题。d++计算为1,但随后d递增。++d递增d,然后计算为3。

bq9c1y66

bq9c1y665#

参见Why is this Java operator precedence being ignored here?
它归结为这样一个事实,即后缀运算符首先被求值,但 * 返回变量 * 的原始值,正如设计的那样。所以为了你的行动

(d++ + ++d)

Processes as:
1. d++ evaluates, returning the original value of 1 but incrementing d to 2
2. ++d evaluates, incrementing the value of 2 TO 3, and returning 3
3. +   evaluates, resulting in 1 + 3

混淆的地方并不是要计算的标记的优先级顺序,您已经做对了。真实的的问题在于理解后缀和前缀运算符之间的功能差异。

rdlzhqv9

rdlzhqv96#

d的值为1
d被评估;它的值是1,d现在是2(post返回递增前的值)
++d被求值;它的值是3,d现在是3(++pre返回递增后的值)
1 + 3 = 4

ercv8c1e

ercv8c1e7#

System.out.println(d++++d);
事情是这样的:
d被执行,所以d现在是2。
d + d被执行,其等于4。
值4被赋予System.out.println()
d
被执行,所以现在d是3。

vfhzx4xs

vfhzx4xs8#

我从上面看了所有的解释..根据理解下面的代码应该给予11.0然后y它给10.0双x = 4.5; x = x + ++x;// x得到值10.0。

r9f1avp5

r9f1avp59#

除了其他评论,我建议你看看序列点,因为其中一些东西可能会导致未定义的行为,尽管我认为你的情况是为java定义的。
x[i]=i++ + 1;是什么?
http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html

相关问题