递减开关语句输出

时间:2014-11-06 15:25:49

标签: java switch-statement decrement

基本上输出显示为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);
    }
}

2 个答案:

答案 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=2f为真

......你怎么得到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}}:)