初学者Java做概念混乱

时间:2017-05-13 15:18:32

标签: java do-while

我的逻辑是输出将保持顺序(1,0)(2,1)...(5.4),但输出是(5,5)不是(5,4)。

我是否误解了概念中的做法?

public class Test {
  public static void main(String[] args) {

    int x = 0;
    int y = 0;

    do{
        y++;
        ++x;
    } while(x<5);
    System.out.print(x + "," + y);


  }
}

2 个答案:

答案 0 :(得分:2)

我想也许这就是你想要的目标?

public class Test {
  public static void main(String[] args) {

    int x = 0;
    int y = 0;

    do{
        System.out.println( ++x + "," + y++ );
    } while(x<5);
  }
}

此处x的值在传递给方法println之前会递增,因此它始终至少比起始值多一个,并且每次迭代都会递增。 {<1}}的值在传递给方法后递增,因此它首先打印在起始值,然后每次迭代增加一个。

(我从y更改为print,因为后者使输出更易于阅读。)

Lew Bloch在下面的评论中指出,printlnx并未按字面意思传递给y方法。相反,Java编译器实际上通过扩展它来处理该方法:

println

Java不是直接将 public static void main( String[] args ) { int x = 0; int y = 0; do { // System.out.println( ++x + "," + y++ ); StringBuilder concat = new StringBuilder(); concat.append( ++x ); concat.append( ", " ); concat.append( y++ ); System.out.println( concat.toString()); } while( x < 5 ); } x直接传递给y,而是创建一个临时的println对象,它执行代码隐含的字符串连接。然后,字符串构建器用于返回一个字符串,这是实际传递给StringBuilder的唯一内容。

但是,println方法的工作方式与上述方法相同,因此概念上没有任何改变。 StringBuilder仍然比y少一个,因为后递增在{1}}递增之前取值x并将其传递给y方法。在很少的情况下,记住append对象实际上是相关的,尽管偶尔会有可以应用的重要速度优化。

答案 1 :(得分:1)

如果是代码

mask = tf.less(original_tensor, 0.0001 * tf.ones_like(original_tensor))

你得到了期望值(do{ System.out.print(++x + "," + y++); } while(x<5); ),因为在一个陈述中我们a)增加x; b)印刷值; c)增加y。

但是以防万一

(1,0)(2,1)...(5.4)

无关紧要,使用前后增量。在第3行,两个变量都递增并具有相同的值。