Java增量后可变可用性

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); inti=1;

我弟弟正在上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);
inti=1;
而(i<10)
如果((i++)%2==0)
系统输出打印LN(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
在递增之前为
偶数时,计算结果为true

下面是一个简单的例子

intk=0;
如果(k++==0){
System.out.println(k);//打印1
}
另一方面,如果它是预先递增的,它将像这样工作

  int k = 0;
  if (++k == 1) {
     System.out.println(k); // print 1
  }
注意以下几点:

inti=1;
System.out.println(i++==i)//打印错误

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

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

将++i视为一个方法调用,让我们调用它incrementThenReturn(i)

在您的代码中,如果i=0且您“returnThenIncrement(i)”,您将得到0,然后我将为下一条语句递增


在您的代码中,如果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

不,不对。
i++
表达式的结果是
i
在递增之前的值。因此,如果
i
1
开始,它将增加到
2
,但是
i++
会导致
1
1%2
1
如果未执行
块;在第二次迭代中,
i
2
并增加到
3
,但
i++
会导致
2
2%2
为零-如果执行块并打印
i
,则
3
不完全正确:“表达式
(i++)%2==0
是在
i
递增之前计算的。不,它不是-“
i
是作为
i++
计算的一部分递增的,
i++
的结果是递增之前
i
的值(如果表达式中的其他地方使用了
i
,这可能是相关的)@CarlosHeuberger感谢您指出这一点。我更正了我的答案,并给出了另一个例子来说明这一点。