基本上输出显示为i = 11
,但每次我尝试跟踪时,答案都会出现9
。
我一直在玩代码,看看额外的2来自哪里。它在3/4
的情况下,但我找不到i
的任何增量状态,尽管它在那时变为4
。任何人都可以帮助并向我解释这个吗?
public class out2 {
public static void main(String args[]) {
int i = 0, j = 7;
boolean f = true;
while (i <= 4) {
switch (--j) {
case 1:
case 2:
i = f ? i + 7 : i + 1;
break;
case 3:
case 4:
i = !f ? j++ : j--;
break;
case 5:
case 6:
i = (i == j) ? i - 1 : i + 1;
}
}
System.out.println("j=" + j + "\ni=" + i);
}
}
答案 0 :(得分:1)
使用调试器单步执行它会向您显示...
循环1
--j
因此j
递减
i = (i == j) ? i - 1 : i + 1;
= i+1
...所以i=1
(i = 0 + 1)i
不等于j
循环2
--j
= 5
i = (i == j) ? i - 1 : i + 1;
= i+1
...所以i=2
(i = 1 + 1)i
不等于j
循环3
--j
= 4
i = !f ? j++ : j--;
= j--
= i=j; j++
= i=j; j=j-1
......所以i=4
(i = j)&amp; j=3
(j = 4 -1,在分配给i后发生)!f
为假
循环4
--j
= 2
i = f ? i + 7 : i + 1;
= i+7
...所以i=11
(i = 4 + 7)&amp; j=2
为f
为真
......你怎么得到9?
备注强>
!true
只是说“不是真的”,是的;当然,它不是。i=j++
将j
分配给i
然后增加j
i=++j
增量j
然后分配给i
i = true ? j++ : j--
会将j
分配给i
,然后增加j
这就是为什么你看起来像是9,@ GameDroids发现你没有分配到i
答案 1 :(得分:0)
我为你重写了这个程序,也许这样更容易理解:
public static void main(String[] args) {
int i = 0;
int j = 7;
boolean f = true;
while (i <= 4) {
switch (--j) {
case 1: // no break here
case 2:
// i = f ? i + 7 : i + 1;
// this you can rewrite to:
if (f) {
i = i + 7;
} else {
i = i + 1;
}
break;
case 3: // no break here
case 4:
// i = !f ? j++ : j--;
// this you can rewrite to:
if (!f) {
// if f == false
i=j;
j++;
} else {
// if f == true
i=j;
j--;
}
break;
case 5: // no break here
case 6:
// i = (i == j) ? i - 1 : i + 1;
// this you can rewrite to:
if (i == j) {
i = i - 1;
} else {
i = i + 1;
}
}
}
System.out.println("j=" + j + "\ni=" + i);
}
更详细:
i = f ? i + 7 : i + 1;
此处i
获取一个新值f ? i + 7 : i + 1
,因此您需要先评估该表达式:它会检查f
是否设置为true
,如果是,然后该表达式返回i+7
,否则返回i+1
(当f
设置为false
时)
这样的另外两个表达式可以用同样的方式重写 现在的诀窍是第二个表达式:
i = !f ? j++ : j--;
人们会认为首先评估j++
或j--
,但事实并非如此。 i++
或i--
表示首先将使用i
的当前值,然后该值将递增/递减。所以:i=j
先,然后是j++
或j--
在您的计算中(当您最后得到9
时),您忘记将j
的值分配给i
。您刚刚计算了j++
或j--
但未计算i=j
:)
旁注:特别是在开头你应该尝试坚持清晰的编码风格。不要使用一行声明,例如int i=0, j=7
。它很难阅读,如果你在一行中有更多的声明,它可能会让人感到困惑。我想说的第二件事是:类应该有一个大写字母Out2
而不是{{ 1}}:)