预减量运算符未在Java中加载减量值
我有以下简单的代码:预减量运算符未在Java中加载减量值,java,Java,我有以下简单的代码: public static void main(String[] args) { int i = 1, j = 10; do { if (i++ > --j) continue; } while (i < 5); System.out.println("i=" + i + " j=" + j); } publicstaticv
public static void main(String[] args) {
int i = 1, j = 10;
do {
if (i++ > --j) continue;
} while (i < 5);
System.out.println("i=" + i + " j=" + j);
}
publicstaticvoidmain(字符串[]args){
int i=1,j=10;
做{
如果(i++>--j)继续;
}而(i<5);
System.out.println(“i=“+i+”j=“+j”);
}
输出为:i=5j=6
该结果表明,if语句在第一次“do”迭代中使用的“i”和“j”的值是原始值(即,i为1,j为10)。对于I++,我可以理解这一点,但我不理解为什么if语句中的--j在第一次迭代中是10而不是9。我认为-,j应该是9,而不是10,因为它是一个预减量。
有人能澄清一下吗?
谢谢 我在我的计算机上运行了此代码,您的代码工作正常。试着写:
如果(--j==9){
System.out.println(“是”);
}
是的
将被打印。对我来说很简单:
循环在
i之前运行了4次,感谢大家的澄清;我的观点如下:
第一次“do”迭代:i=1,j=9,在执行if之后,i=2,j=9
第二次迭代:i=2,j=8,在if之后,i=3,j=8
第三次迭代:i=3,j=7,在if之后,i=4,j=7
第四次迭代:i=4,j=6,在if之后,i=5,j=6
此时i不再小于5,并以i=5和j=6退出循环
我最初的印象是,这个序列会是-
- (1,10)(2,9)、(3,8)、(4,7)和最后(5,6)
然而,快速检查表明情况并非如此
给定-
public static void main(String[] args) {
int a = 1, c = 0;
int b = 10, d = 0;
do {
c = (a++);
d= (--b);
System.out.println("c :"+ (c) +", d:"+ (d) +", a:"+(a) + ", b:"+(b));
if ( c > d) {
System.out.println("(c > d) !!");
continue;
}
}while( c<5);
System.out.println("c :"+ (c) +", d:"+ (d));
}
在任何时候都不会调用“continue
”,因为条件(LHS>RHS)永远不会满足
总的来说,将这两个约定精确地混合在一起不是一个好主意,因为它会造成混乱
作为额外的预防措施,出于同样的原因(除非代码是性能密集型代码),最好将增量操作作为一个独立的步骤(没有任何赋值)
现在是9点。我不知道你是怎么知道它是10的。如果预减量有效,显示的输出就会出现。它将1与9、2与8、3与7、4与6进行比较,然后以i=5和j=6离开循环。是什么让您认为预减量运算符不起作用?当您发现自己处于这种情况时,您可能会发现在Java交互式shell中探索较小片段的行为会有所帮助,jshell
。从i++
和++i
开始,然后构建更大的结构,如循环。交互式shell鼓励您将内容分解成更小的块,以便更容易地查看正在发生的事情。谢谢@BrianGoetz,我将检查jshell。不是真的。我认为应该是(1,10)(2,9),(3,8),(4,7)最后(5,6)。这实际上是有争议的一点。检查编译后的代码后,确认在“if”语句中使用了减小的“j”值。所以它从(1,9)开始。是的。我的错。我自己验证过了。将保留评论的原样。此外,循环运行5次。(c:1,d:9,a:2,b:9),(c:2,d:8,a:3,b:8),(c:3,d:7,a:4,b:7),(c:4,d:6,a:5,b:6),(c:5,d:5,a:6,b:5)。将在我的回答中详细说明。更新#2。它运行了4次!我的答案中的代码片段仅用于演示后期增量的行为。不是原始循环的精确重建。循环运行5次!否,每个循环将i
增加一个。在第四次运行i=5
结束时,循环退出。是。确实是4。我想我是把我的代码片段作为参考,这并不等同于最初的文章。我会留下我的评论!谢谢您的逻辑中有一个错误:a=(c++)
将c
的值设置为a
的值,然后再递增,因此您的检查不会试图证明任何逻辑。仅记录行为,以便快速参考。您提到的行为在第一个输出中自我记录(可以说),其中“c”的值为1。@Jan-PS:是的。事实上,上面的代码片段并不完全等同于问题陈述。但我认为这很好地证明了后增量是如何工作的。
c :1, d:9, a:2, b:9
c :2, d:8, a:3, b:8
c :3, d:7, a:4, b:7
c :4, d:6, a:5, b:6
c :5, d:5, a:6, b:5
c :5, d:5
int i = 1;
i++;
System.out.println("i :"+i);