简体   繁体   中英

Nested array references

I'm currently learning Java online and am confused about the following code and what one of the elements in the array is evaluating to:

int[] a = new int[]{9, 8, 3, 1, 5, 4};

for (int i = 0; i < a.length; i++) {
    if (a[i] % 2 == 0) {
        a[i] += 1;
    } else if (a[i] < a.length) {
        a[i] += a[a[i]];
    }
}

I am looking at a[3] and the number that this evaluates to, and when I am debugging the code, my IDE is showing that a[a[i]] is evaluating to 9 , which is where I'm a bit confused.

I thought that a[3] would equal 1 and then a[1] would equal 8 , however this doesn't seem to be the case. Could anyone provide clarity as the JetBrains Academy course doesn't refer to this.

Note the first condition - if (a[i] % 2 == 0) {a[i] += 1;} - this causes even values to be incremented. Therefore a[1] is incremented from 8 to 9 .

Now, when i==3 , a[a[i]] is evaluated to a[1] which is equal to 9 . Then you are adding it to the original value of a[3] (note the operator is += , not = ), so a[3] becomes 1 + 9 , which is 10 .

int[] a = new int[] {9, 8, 3, 1, 5, 4};

for (int i = 0; i < a.length; i++){
    if (a[i] % 2 == 0)
        a[i] += 1;
    else if(a[i] < a.length)
        a[i] += a[a[i]];
}

|i | a[i] old | a[i] % 2 | a[i] < a.length | a[a[i]] | a[i] new |
|--|----------|----------|-----------------|---------|----------|
|0 |  9       |    -     |   -             |  NaN    |    9     |
|1 |  8       |    +     |   -             |  NaN    |    9     |
|2 |  3       |    -     |   +             |  1      |    4     |
|3 |  1       |    -     |   +             |  9      |    10    |
|4 |  5       |    -     |   +             |  4      |    9     |
|5 |  4       |    +     |   -             |  9      |    5     |

// a = {9, 9, 4, 10, 9, 5};

I thought that a[3] would equal 1

That's correct, at step 3 , a[3] = 1

and then a[1] would equal 8

That's not correct, because at step 1 it was incremented to 9

Its okey. Best way to see what you are doing is debuggin (painting in this case) your code:

int[] a = new int[] {9, 8, 3, 1, 5, 4};

    for (int i = 0; i < a.length; i++){
        if (a[i] % 2 == 0){
            System.out.printf(a[i]);
            a[i] += 1;
            System.out.printf(a[i]);
        }else if(a[i] < a.length){
            System.out.printf(a[i]);
            a[i] += a[a[i]];
            System.out.printf(a[i]);
}

And you will see more clearly.Sometimes its better to face the wall by ourselves because one best practices is learn about you. Good luck!.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM