Java 后增量变量可用性

  • 本文关键字:变量 可用性 Java java
  • 更新时间 :
  • 英文 :


我哥哥正在上Java课。我对Java不是很熟悉,但我知道C#。我试图解释为什么下面的代码返回 3,5,7,9 而不是 1,3,5,7,9。我说 i 的新(递增(值在 i 递增的行中不可用,因此当 i 为 1 时不满足 if 条件。我不确定我是否解释得很好,所以我希望也许有人能给出更好的解释。为什么代码返回 3,5,7,9 而不是 1,3,5,7,9?

int i = 1;
while (i < 10)
if ((i++) % 2 == 0)
System.out.println(i);

真的是索蒂里奥斯???这是重复的?此问题与其他问题不同,因为此问题包含一个循环。此外,增量发生在 if 语句中。我承认另一个问题在上下文中是信息丰富的和相似的,但这并不能使它重复。刚接触Java的人可以从这个问题中学习,而不是向另一个人学习(反之亦然(。有时感觉重复问题的标准是任意的。

答案是因为当i = 1时,i++ % 2 == 0返回false,所以什么都不打印。 这是因为1 % 2 == 1,而不是0

表达式中的i(i++) % 2 == 0在递增i之前使用。

因此,当i为 2 时,i++ % 2 == 0为真。 但在那之后,i已增加到 3,因此它打印 3。

它以这种方式继续,当i在递增之前even时计算为 true。

下面是一个更简单的示例。

int k = 0;
if (k++ == 0) {
System.out.println(k); // print 1
}

另一方面,如果它是预先递增的,它将像这样工作。

int k = 0;
if (++k == 1) {
System.out.println(k); // print 1
}

请注意以下几点:

int i = 1;
System.out.println(i++ == i);  //Prints false

这是因为表达式的计算结果为1 == 2,因为首先使用i的前增量值,然后使用增量值作为比较的目标。 感谢Carlos Heuberger指出这一点。

将 i++ 视为一个方法调用,我们称之为 returnThenIncrement(i(。

将++i视为一个方法调用,我们称之为incrementThenReturn(i(。

在你的代码中,如果 i=0 并且你"returnThenIncrement(i("你会得到 0,然后 i 将在下一个语句中递增。

在你的代码中,如果 i=0 并且你"incrementThenReturn(i("你会得到 1,因为我在使用之前被递增了。

您的程序永远不会打印 1,因为您在第一步中失败了 i=1:

if( 1 % 2 == 0) // Evaluates to false
System.out.println(2); // Code is never reached

如果您希望它打印 1,请将第一行更改为 int i=0;并且您的算法计算如下内容:

if( 0 % 2 == 0) // Evaluates to true, and i is now 1
System.out.println(1); // Eureka

最新更新