我的逻辑是输出将保持顺序(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);
}
}
答案 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在下面的评论中指出,println
和x
并未按字面意思传递给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行,两个变量都递增并具有相同的值。