有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于环路Java短路混淆

此代码使用&&;处于for循环状态。它重复4次,得到的结果是“sum=20”。我认为它会重复5次,因为&&;条件为true,当右侧变为false时,循环结束

基本上,我的问题是,为什么它要迭代4次而不是5次,使“和=30”?谢谢

   `int[] lst = {1,2,3,4,5,4,3,2,1};
    int sum = 0;
    for (int frnt = 0, rear = lst.length - 1;
            frnt < 5 && rear >= 5; frnt++, rear--){
        sum = sum + lst[frnt] + lst[rear];
        System.out.println("frnt: " + frnt);
        System.out.println("rear: " + rear);
        System.out.println();
    }
    System.out.print(sum);`

共 (3) 个答案

  1. # 1 楼答案

    只有当整个表达式的值已知时,才会发生短路

    对于逻辑AND运算符(&;&;)如果左侧已经为false,那么右侧的计算结果是什么并不重要,因为整个表达式已经为false。如果左侧为true,则右侧的值决定表达式的值。因为在评估之前它是未知的,所以必须对它进行评估

    对于逻辑OR运算符(| |),则相反。如果表达式的左侧为真,那么无论右侧是什么,表达式都为真,因此不计算右侧。如果左侧为false,则表达式的值取决于右侧,因此必须对其求值

  2. # 2 楼答案

    问题源于for条件。在循环的最后一次迭代中,frnt = 4rear = 4。条件frnt < 5起作用,但rear >= 5为false,使整个表达式为false,从而打破了循环。关于每次迭代后的变量,请参见下文(请注意,该表显示了每次循环体运行并修改变量后的变量)

                  frnt   rear
    before loop:  0      8
    iteration 1:  1      7
    iteration 2:  2      6
    iteration 3:  3      5
    iteration 4:  4      4 <   Loop breaks after this
    

    两个计数器在中间相遇在4,但条件指定^ {CD5>}。为了获得正确的行为,将条件更改为:frnt < 5 && rear >= 4,或者更清楚地说,更改为frnt <= 4 && rear >= 4

  3. # 3 楼答案

    frnt{}{}

    0-8-true && true -> true

    1-7-true && true -> true

    2-6-true && true -> true

    3-5-true && true -> true

    4-4-true && false -> false

    一切都是对的,4次迭代,仅此而已

    我想你误解了短路原理。如果是&&;操作员:短路原理如下:

    由于A&&;只有当两个操作数都是true时,B操作才是true。然后在计算操作数A并发现它是false时,无需计算和检查操作数B的值。如果操作数A是true,则始终计算操作数B。所以在你的例子中,当循环中断时,操作数A是4 < 5,而操作数B是4 >= 5。因此,由于操作数A是true,因此必须对操作数B进行求值和检查,这种情况下,由于两个操作数都进行了求值,所以不存在短路。如果操作数A为false且未计算操作数B,则会出现短路情况