+的优先级+;和——Java中的运算符
我从Java官方教程中读到前缀和后缀++有不同的先例: 后缀:expr++expr-- 一元:++expr--expr+expr-expr~ 根据教程,这不应该吗+的优先级+;和——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(
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)这样的代码那你为什么在乎?这是一件非常琐碎的事。@Qwerky虽然没有人会写这样的代码,但也许是为了学校。老师/教授喜欢问这样的问题:“它永远不会像这样写,但我们无论如何都要测试你,看看你是否理解它是如何工作的。”Qwerky很抱歉让你失望:)至于我问的原因,也许是因为好奇。我很幸运,因为我不是一只猫。@Kevin老师们可能喜欢它,但我可以向你们保证,这会从教室外的任何地方的代码审查中反弹回来。这里没有。都是中缀。有后缀运算符。请关闭,但您的结论不正确。它应该是1+3=4,如上述答案所述++d返回增量之前的结果,因此尽管在计算左表达式后d将等于2,但左表达式的计算结果为1。感谢您的更正。。
(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