Java中的++和 – 运算符的优先级
我从Java的官方教程中读到前缀和后缀++ – 具有不同的优先级:
后缀:expr ++ expr–
一元:++ expr –expr + expr -expr~!
运营商
根据教程,不应该这样
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.它似乎应该是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++ + ++d
将被分组(d++) + (++d)
,并且将按以下顺序计算此二进制表达式:
- 左操作数
d++
。 此子表达式由后缀增量运算符和变量组成,因此它具有以下两种效果:- 子表达式的值为
1
- 变量更新:
d = 2
- 子表达式的值为
- 右操作数
++d
。 此子表达式由前缀增量运算符和变量组成,因此它具有以下两种效果:- 变量更新:
d = 3
- 子表达式的值为
3
- 变量更新:
- 使用两个操作数的值评估operator
+
。- 因此表达值为1 + 3 = 4。
++
的前缀和后缀forms之间的不同优先级只能在++d++
看到,它将被解释为++(d++)
– 这没有任何意义( (++d)++
没有任何一个,或者),因为++
只适用于变量,而不适用于值(结果是值)。
这不是关于优先权,而是关于评估顺序。 d++
计算结果为1
,但随后d
递增。 ++d
递增d
,然后计算结果为3。
请参阅此处为何忽略此Java运算符优先级? 。
归结为后缀运算符首先被计算,但返回变量的原始值 ,如设计的那样。 因此,出于您的操作目的:
(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
对于要评估的令牌,混淆不是优先顺序,你已经做到了。 真正的问题在于理解后缀和前缀运算符之间的function差异。
d的值为1
d ++被评估; 它的值是1,d现在是2(后++在增量前返回值)
++ d被评估; 它的值是3,d现在是3(增量后的++预返回值)
1 + 3 = 4
System.out.println(d ++ + ++ d);
这是怎么回事:
++ d被执行,所以d现在是2。
执行d + d,等于4。
值4被赋予System.out.println()
d ++被执行,所以现在d是3。
我从顶部经历了所有的解释。根据理解下面的代码应该给出11.0然后y它给出10.0倍x = 4.5; x = x + ++ x; // x得到值10.0。
除了其他评论之外,我建议你看看序列点,因为这些东西中的一些可能导致未定义的行为,尽管我认为你的案例是为java定义的。
x[i]=i++ + 1;
做?
http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html
这是一个常见的错误。 即使在oracle认证指南中,他们也说Post增量和减量运算符的优先级高于Pre运算符。
我相信这是一个许多人已经存在一段时间的错误。 在试验了几个表达式之后。 我相信我可以自信地说前置和后置运算符具有相同的优先级,并且从左到右进行评估。
您可以通过评估以下示例进行实验,以便自己确认。
int y = 4; int x = --y * 2 + 3 + y-- * 2; // x is 15 int y = 4; int x = --y * 2 + 3 + y++ * 2; // x is 15