关于 Java 8(OCA)中的短路运算符和后缀增量的问题 [关闭]

Posted

技术标签:

【中文标题】关于 Java 8(OCA)中的短路运算符和后缀增量的问题 [关闭]【英文标题】:Question concerning short-cirquit operators and post-fix incrementation in Java 8 (OCA) [closed] 【发布时间】:2019-12-16 12:42:25 【问题描述】:

我正在学习我的 OCA 认证,发现了这段代码,我想知道为什么下面代码的结果是“1, 2”而不是“1, 3”。

这里使用的'&'运算符不是short cirquit,后缀增量应用于第一个int,那么为什么不应用于第二个呢?

  int i = 0;
  int j = 1;
  if( (i++ == 0) & (j++ == 2) )
     i = 12;
  
  System.out.println(i+" "+j);

edit 学习时休息很重要。我理解所涉及的概念,但疲劳让我犯了一个逻辑错误,这让我假设 j 一开始是 2

【问题讨论】:

j++ = j + 1 = 1 + 1 = 2。为什么j 应该是 3? 因为我学习太久了,看来我的大脑已经被挖掘出来了..但是谢谢你的帮助hha.. 如果您使用 && 而不是 &,这将完全一样。 【参考方案1】:

为什么jifj++ == 2 中只增加一次时会是3。最初j 初始化为1,然后应用++ 运算符将其递增为2

++ 运算符本质上是在执行 j = j + 1,并且由于您使用了逻辑 AND 运算符 &,因此对第一个条件和第二个条件都进行了评估。

注意:如果第一个条件仍被评估为 false,则第二个条件将被评估为 & 是逻辑 AND 运算符,而不是条件 && 运算符,它是短路的。

javase specs 中描述的逻辑运算符。

【讨论】:

我会接受你的回答,因为你费尽心思把它全部写出来。谢谢!这里使用的概念对我来说很清楚,但我今天可能已经用了太久了。 @matthewkeissard,您可以检查我在答案中发布的 java 规范中按位逻辑运算符的行为。 这不是按位和运算符。这是逻辑和运算符。 @AndyTurner 我的错,bitwise 当操作数是 numericlogical 当操作数是 boolean,我说的对吗? @AmardeepBhowmick 你是大致正确的。您在答案中链接的语言规范部分更准确地描述了它。【参考方案2】:

正如@Marvin 在 cmets 中指出的那样,j++ = j + 1 = 1 + 1 = 2。

在学习 OCA 认证时,定期休息很重要 :)

【讨论】:

以上是关于关于 Java 8(OCA)中的短路运算符和后缀增量的问题 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 流短路

Java基础Java运算符优先级

Java运算符优先级

Java运算符优先级

*p++与(*p)++与*(p++)------自增运算符常见误区

Java运算符优先级(转)