Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
预减量运算符未在Java中加载减量值_Java - Fatal编程技术网

预减量运算符未在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);