¿Por qué array [idx ++] + = "a" aumenta idx una vez en Java 8 pero dos veces en Java 9 y 10?

Para un desafío,un compañero golfista de código escribió el siguiente código:

import java.util.*;
public class Main {
  public static void main(String[] args) {
    int size = 3;
    String[] array = new String[size];
    Arrays.fill(array, "");
    for(int i = 0; i <= 100; ) {
      array[i++%size] += i + " ";
    }
    for(String element: array) {
      System.out.println(element);
    }
  }
}

Al ejecutar este código en Java 8, obtenemos el siguiente resultado:

1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97 100 
2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68 71 74 77 80 83 86 89 92 95 98 101 
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 

Al ejecutar este código en Java 10, obtenemos el siguiente resultado:

2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 

La numeración está completamente desactivada con Java 10. Entonces, ¿qué está pasando aquí? ¿Es un error en Java 10?

Seguimientos de los comentarios:El problema aparece cuando se compila con Java 9 o posterior (lo encontramos en Java 10). Compilar este código en Java 8, luego ejecutarlo en Java 9 o cualquier versión posterior, incluido el acceso temprano a Java 11, da el resultado esperado. Este tipo de código no es estándar, pero es válido de acuerdo con las especificaciones. Fue encontrado porKevin Cruijssen en undiscussion en ungolfing challenge, de ahí el extraño caso de uso encontrado.

Didier L descubrió que el problema se puede reproducir con el código mucho más pequeño y más comprensible:

class Main {
  public static void main(String[] args) {
    String[] array = { "" };
    array[test()] += "a";
  }
  static int test() {
    System.out.println("evaluated");
    return 0;
  }
}

Result cuando se compila en Java 8:

evaluated

Result cuando se compila en Java 9 y 10:

evaluated
evaluated

El problema parece estar limitado al operador de concatenación y asignación de cadenas +=) con una expresión con efectos secundarios como el operando izquierdo, como enarray[test()]+="a", array[ix++]+="a", test()[index]+="a" otest().field+="a". Para habilitar la concatenación de cadenas, al menos uno de los lados debe tener el tipoString. Intentando reproducir esto en otros tipos o construcciones falló.

Respuestas a la pregunta(1)

Su respuesta a la pregunta