2014-11-06 59 views
-3

基本上输出结果为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); 
    } 
} 
+4

您是否尝试通过放置一些断点来调试并查看执行流程是什么? – user2336315 2014-11-06 15:27:38

+1

甚至更​​简单:尝试通过在while循环中添加println来查看流程。 – user1252434 2014-11-06 15:33:28

+0

伙计们不要再这么说了,这就是它如何写在血腥的试卷中,所以我需要以它的方式来理解它-_- – 2014-11-06 15:37:44

回答

1

通过它与调试器步进会向你展示......

环1

--j所以j递减

i = (i == j) ? i - 1 : i + 1; = i+1

.. .so i=1( I = 0 + 1)作为i不等于j

回路2

--j = 5

i = (i == j) ? i - 1 : i + 1; = i+1

...所以i=2(I = 1 + 1 )as i不等于j

回路3

--j = 4

i = !f ? j++ : j--; = j-- = i=j; j++ = i=j; j=j-1

...所以i=4(I = j)的& j=3(J = 4 -1,分配给后会发生i)as !f is false

Loop 4

--j = 2

i = f ? i + 7 : i + 1; = i+7

...所以i=11(I = 4 + 7)& j=2f是真的

...你是如何得到9?

注意

  • 测试!true只是说是 '不正确的',真实的;当然不是。
  • i=j++分配ji然后递增j
  • i=++j增量j然后分配到i
  • i = true ? j++ : j--将分配给j然后i增加j这就是为什么你听到9样子,@GameDroids发现你没有分配到i
+0

我认为OP在试图在纸上回溯时得到'9' - 这是i ++和我 - 这是令人困惑的 – GameDroids 2014-11-06 15:53:01

+0

是的,但我不明白为什么他们在纸上得到9,我甚至不能得到9甚至玩前,后分配增量和递减 – 2014-11-06 15:55:59

+1

我再次检查它,抱歉它不是'i ++'或'我 - '。在这种情况下,'9'的结果是'j'的值没有赋值给'i'(不管何时j递增/递减) – GameDroids 2014-11-06 16:00:59

0

我重写了你的程序,也许这样它是ea思尔明白:

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而不是out2的名称:)