代码之家  ›  专栏  ›  技术社区  ›  Pindatjuh

Java做的同时

  •  8
  • Pindatjuh  · 技术社区  · 15 年前

    运行此代码时,我可以预期的行为:

    do while(testA) {
    
        // do stuff
    
    } while(testB);
    

    会不会表现得像:

    do {
        while(testA) {
            // do stuff
        }    
    } while(testB);
    

    或:

    if(testA) {
        do {
            // do stuff
        } while(testA && testB);
    }
    

    或者完全出乎意料的事情?

    我问这个问题是因为我觉得这个问题很模糊,对于其他人来说, 因为我懒得测试。

    6 回复  |  直到 10 年前
        1
  •  7
  •   John Kugelman Michael Hodel    15 年前

    它相当于你的第一个街区:

    do {
        while(testA) {
            // do stuff
        }    
    } while(testB);
    

    的相关部分 Java grammar 分析时,这是:

    DoStatement:
        do Statement while ( Expression ) ;
    
    Statement:
        WhileStatement
    
    WhileStatement:
        while ( Expression ) Statement
    
    Statement:
        Block
    
    Block:
        { BlockStatements_opt }
    

    您可以看到Java编译器将解析为 do <WhileStatement> while ( Expression ) ; . 这是解析您编写的代码的唯一有效方法。

    请记住,它没有任何特殊的规则来解析此构造。由于do-while循环的编写方式不寻常,最终会让人读起来很困惑。在正常使用中,do while总是写为 do { ... } while 有明显的大括号。

        2
  •  3
  •   Felix Kling    15 年前

    它确实有效,但行为取决于您正在测试的条件。例如,此代码:

      int i = 2;
      int j = 4;
      do while(j > 0) {
           i--; j--;
           System.out.println("i:" + i + " j:" + j);
     } while(i > 0);
    

    输出:

    i:1 j:3
    i:0 j:2
    i:-1 j:1
    i:-2 j:0
    

    所以它的工作原理是:

    while(j>0) {
    
    }
    

    而通过交换变量名:

    do while(i > 0) {
        //.. same as above
     } while(j > 0);
    

    输出为:

    i:1 j:3
    i:0 j:2
    

    看起来它的行为与第一种情况(即考虑第一个while)相同,但是在这里, 应用程序未终止!


    总结:
    当时 testA 不满意 不再 testB 也是 不满意 ,代码的工作方式类似于 while(testA){} 循环。
    但是: 如果,当时 种皮 不再满足 , 泰斯布 仍然满意 ,循环是 再执行一次脚本 不终止 . 这仅适用于需要在循环内部更改“外部”循环的条件的情况。

    更新: 在阅读了其他答案之后,我意识到这正是嵌套 do-while - while 循环。
    不管怎样,经验教训:不要使用这种语法,因为它会让你感到困惑;)

        3
  •  1
  •   Andrea Zilio    15 年前

    它的行为就像

    do {
        while(testA) { 
            // stuff
        }
    } while(testB);
    

    所以,这段代码是这样解析的:

    当testb为true时,执行{代码块}。其中{代码块}是内部while。

    写这样的代码肯定有点不常见:)

        4
  •  1
  •   Pierre-Antoine LaFayette    15 年前

    答案是1。它将继续循环,只要 testB 满足,但如果 testA 不满意。

        5
  •  1
  •   Michael Myers KitsuneYMG    15 年前

    do {} while(); 是一个结构,而 while(){} “是另一个。

    世上没有这样的东西 do while “您无意中嵌套了它们,并利用了{}对于单个指令是可选的这一事实。

    换句话说,这是合法的语法:

    do System.out.println("Hello World") while (true);
    

    就像在 if -语句中,块被视为单个语句。

    也就是说,你第一个可能的答案是正确的,在哪里 ({)} “外面是没有括号的东西吗?” 做{}while();

        6
  •  0
  •   giri    15 年前

    我不认为这是合法的。

    do while(testA) {
    
            // do stuff
    
        } while(testB);