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,9Java增量后可变可用性,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;
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感谢您指出这一点。我更正了我的答案,并给出了另一个例子来说明这一点。