我从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。
9条答案
按热度按时间yqhsw0fo1#
println语句的内部是这个操作(d++)+(++d)
1.如下,读取d的值(d = 1)
1.将d(1)的当前值放入加法函数中
1.然后,在右侧,读取d的值(2)
1.最后将d(3)的值代入加法函数
因此1 + 3的结果是4
编辑:对不起的格式,我是相当糟糕的使用列表哈哈
gkn4icbw2#
关键是从操作中返回的内容。
打印4
r1zhe5dt3#
更高的优先级并不意味着将首先计算。
这意味着表达式将以这种方式分组。
在这种情况下,
d++ + ++d
将被分组为(d++) + (++d)
,并且此二进制表达式将按以下顺序进行计算:d++
。这个子表达式由一个后缀增量运算符和一个变量组成,所以它有两个效果:1
d = 2
++d
。这个子表达式由一个前缀增量运算符和一个变量组成,因此它具有以下两种效果:d = 3
3
+
使用两个操作数的值来求值。++
的前缀和后缀形式之间的不同优先级只会在++d++
中看到,它将被解释为++(d++)
-这没有任何意义((++d)++
也没有任何意义),因为++
只对变量有效,而不是值(结果是一个值)。pbossiut4#
这不是优先级的问题,而是求值顺序的问题。
d++
计算为1
,但随后d
递增。++d
递增d
,然后计算为3。bq9c1y665#
参见Why is this Java operator precedence being ignored here?。
它归结为这样一个事实,即后缀运算符首先被求值,但 * 返回变量 * 的原始值,正如设计的那样。所以为了你的行动
混淆的地方并不是要计算的标记的优先级顺序,您已经做对了。真实的的问题在于理解后缀和前缀运算符之间的功能差异。
rdlzhqv96#
d的值为1
d被评估;它的值是1,d现在是2(post返回递增前的值)
++d被求值;它的值是3,d现在是3(++pre返回递增后的值)
1 + 3 = 4
ercv8c1e7#
System.out.println(d++++d);
事情是这样的:
d被执行,所以d现在是2。
d + d被执行,其等于4。
值4被赋予System.out.println()
d被执行,所以现在d是3。
vfhzx4xs8#
我从上面看了所有的解释..根据理解下面的代码应该给予11.0然后y它给10.0双x = 4.5; x = x + ++x;// x得到值10.0。
r9f1avp59#
除了其他评论,我建议你看看序列点,因为其中一些东西可能会导致未定义的行为,尽管我认为你的情况是为java定义的。
x[i]=i++ + 1;
是什么?http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html