+的优先级+;和——Java中的运算符

+的优先级+;和——Java中的运算符,java,increment,prefix,operator-precedence,postfix-operator,Java,Increment,Prefix,Operator Precedence,Postfix Operator,我从Java官方教程中读到前缀和后缀++有不同的先例: 后缀:expr++expr-- 一元:++expr--expr+expr-expr~ 根据教程,这不应该吗 d=1;System.out.println(d+++++d) 打印出6(d++为d2,++d为3)而不是4 我知道事先对++d进行评估的解释,但是如果d++的优先级高于++d,为什么不先评估d++?更重要的是,在什么情况下,d++应该显示它具有更高的优先级 编辑: 我尝试了以下方法: d=1;System.out.println(

我从Java官方教程中读到前缀和后缀++有不同的先例:

后缀:expr++expr--

一元:++expr--expr+expr-expr~

根据教程,这不应该吗

d=1;System.out.println(d+++++d)

打印出6(
d++
为d2,
++d
为3)而不是4

我知道事先对
++d
进行评估的解释,但是如果
d++
的优先级高于
++d
,为什么不先评估
d++
?更重要的是,在什么情况下,
d++
应该显示它具有更高的优先级

编辑:

我尝试了以下方法:

d=1;System.out.println(++d*d++)


它返回4。似乎应该是2*2,而不是1*3。

println语句的内部是这个操作 (d++++++(++d)

  • 如下所示,读取d的值(d=1)
  • d(1)的当前值被放入加法函数中
  • d的值递增(d=2)

  • 然后,在右侧,读取d的值(2)

  • d的值递增(现在d=3)
  • 最后,将d(3)的值放入加法函数中

    因此,1+3的结果是4


  • 编辑:对不起,格式不对,我不太擅长使用列表哈哈

    关键是操作返回的内容

    • x++更改x的值,但 返回旧的x
    • ++x更改x的值,并返回新值
    d=1 System.out.println(d+++++d);//d是1 System.out.println(1+++d);//d是2 System.out.println(1+3);//d是3
    打印4

    这不是优先级的问题,而是评估顺序的问题
    d++
    的计算结果为
    1
    ,但
    d
    随后递增<代码>++d
    递增
    d
    ,然后计算为3。

    d的值为1

    对d++进行了评价;它的值是1,d现在是2(post++返回增量之前的值)

    ++d进行评价;它的值是3,d现在是3(++pre在增量后返回值)

    1+3=4

    系统输出打印LN(d+++++d)

    事情是这样的:

    ++d被执行,所以d现在是2

    执行d+d,等于4

    值4被赋予System.out.println()


    d++已经执行,所以现在d是3。

    除了其他注释之外,我建议您看看序列点,因为有些东西可能导致未定义的行为,尽管我认为您的案例是为java定义的

    什么是
    x[i]=i+++1做什么

    请参见

    它归结为这样一个事实:postfix操作符首先被求值,但返回变量的原始值,正如设计的那样。因此,为了您的运营目的:

    (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
    

    混淆不在要计算的标记的优先顺序中,这是正确的。真正的问题在于理解后缀运算符和前缀运算符之间的功能差异。

    不同的优先级并不意味着将首先进行计算

    这意味着表达式将以这种方式分组

    在这种情况下,
    d+++++d
    将被分组为
    (d++++++(++d)
    ,并且将按以下顺序计算此二进制表达式:

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

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

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

    我明白了。但是你能给我看一个显示优先权的例子吗?@Ziyao:在一个像
    (3-4*5)
    这样的表达中,优先权意味着这相当于
    (3-(4*5))
    ,而不是
    ((3-4)*5)
    。谢谢你第一个回答并启发了我!然而,我今天用完了我的最高投票权,所以我想我明天就得这么做了。:)像这样的问题使我非常沮丧。没有人编写过像
    System.out.println(d+++++d)这样的代码(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