2010-03-14 12 views
5

Podría alguien por favor dígame el significado de "++" con matriz en el siguiente código en Java:¿Por qué el lado izquierdo de una tarea no puede ser una expresión de incremento?

int [ ] arr = new int[ 4 ]; 
    for(int i = 0; i < arr.length; i++){ 
     arr[ i ] = i + 1; 
     System.out.println(arr[ i ]++); 
    } 

lo que es arr[ i ]++ significado en el código de seguridad, y por qué no podemos hacer como:

arr[ i ]++ = i + 1; 
+1

Nunca he visto el estilo de codificación (con espacios dentro de llaves cuadradas) en código java. – Roman

+0

Como nota al margen, el bytecode para el operador ++ depende de si se usa en una variable int local o no, y de si el resultado se usa o no. El caso más simple es el de un incremento simple de una variable int local, donde se genera una única instrucción de incremento. Su caso de postincremento de un miembro de matriz genera algunos de los códigos de bytes más complejos.(No puedo comentar ninguna transformación JIT). – Neil

Respuesta

7

El operador que se trata aquí se llama operador de incremento de postfijo (JLS 15.14.2). Se especifica que se comporten de la siguiente manera:

  1. En tiempo de ejecución, si la evaluación de la expresión completa operando bruscamente, entonces la expresión de incremento de sufijo termina abruptamente por la misma razón y no se produce incrementación.
  2. De lo contrario, el valor 1 se agrega al valor de la variable y la suma se almacena de nuevo en la variable.
    1. Antes de la adición, se realiza la promoción numérica binaria (§5.6.2) en el valor 1 y el valor de la variable.
    2. Si es necesario, la suma se reduce mediante una conversión de primitiva de estrechamiento (§5.1.3) y/o se somete a la conversión de boxeo (§5.1.7) al tipo de la variable antes de que se almacene.
  3. El valor de la expresión de incremento Postfix es el valor de la variable antes de que el nuevo valor se almacena.

El último punto es la clave para esta pregunta: la razón por la que no puede hacer arr[i]++ = v; es la misma razón exacta de por qué no se puede hacer x++ = v;; la expresión de incremento postfix devuelve un valor , no una variable .

De JLS 15.1 Evaluation, Denotation and Result:

Cuando una expresión en un programa es evaluado (ejecutado), el resultado indica una de tres cosas:

  • Una variable [...] (en C, esto se llama un valor-I)
  • un valor [...]
  • Nada (la expresión se dice que es void)

Una asignación necesita una variable de en el lado de la mano izquierda, y un valor no es una variable, y por eso no se puede hacer x++ = v;.

De JLS 15.26 Assignment Operators:

El resultado del primer operando de un operador de asignación debe ser una variable, o un error de tiempo de compilación se produce. Este operando puede ser una variable con nombre [...] o puede ser una variable calculada, como puede ser el resultado de un campo [...] o un acceso de matriz. [...]

el siguiente fragmento muestra los intentos erróneos para asignar un valor a , pasando de más sutil a más obvia:

int v = 42; 
int x = 0; 
x = v;  // OKAY! 
x++ = v;  // illegal! 
(x + 0) = v; // illegal! 
(x * 1) = v; // illegal! 
42 = v;  // illegal! 
    // Error message: "The left-hand side of an assignment must be a variable" 

Tenga en cuenta que puede utilizar el incremento de sufijo operador en algún lugar en el lado izquierdo de un operador de asignación, siempre que el resultado final sea una variable.

int[] arr = new int[3]; 
int i = 0; 
arr[i++] = 2; 
arr[i++] = 3; 
arr[i++] = 5; 
System.out.println(Arrays.toString(arr)); // prints "[2, 3, 5]" 
2

arr[i]++ significa "aumentar el valor de arr[i] en 1" y devolver el valor anterior. Así que su código primero establece arr[i] a i+1 usando arr[ i ] = i + 1;. Luego lo aumenta a i + 2 usando arr[ i ]++ e imprime el valor que tenía antes de se aumentó la segunda vez, es decir, i + 1.

En su lugar, no puede usar arr[ i ] = arr[i] + 1; porque significa "aumentar el valor de arr[i] en 1 y devolver el nuevo valor".

No se puede hacer arr[ i ]++ = i + 1; porque no tiene sentido.

+1

El código no aumenta primero el valor de arr [i]. Eso sería 'arr [i] = arr [i] + 1'. Pero dice 'arr [i] = i + 1'. Eso es diferente. –

+0

@MarkByers: tienes razón, por supuesto. Fijo. – sepp2k

0

arr[ i ]++ aumenta matriz [i] en 1. Podría ser como:

arr[i] = i + 1; 

En cuanto a arr[ i ]++ = i + 1; por favor no trate de escribir dicho código. Incluso si compila, será un rompecabezas para ti o para otros.

PS yo preferiría:

++arr[i]; 
+1

pero '++ arr [i]' imprimirá un resultado diferente como 'arr [i] ++'. –

+0

Sí, tienes razón. Haría cada vez más: '++ arr [i]' en una línea e imprimiendo en otra. Creo que esto será más legible. –

0

matriz [i] ++ es aumentar el valor de la matriz [i] por uno y asignar

como para arr[ i ]++ = i + 1; Esta frase significa algo completamente diferente, No sé que incluso es válido java para ser honesto. Me gustaría, si funciona, incriminar el valor en arr [i] y luego asignarlo al índice + 1;

3

El código System.out.println(arr[i]++) significa esto:

int tmp = arr[i]; 
arr[i] = arr[i] + 1; 
System.out.println(tmp); 

Su segundo ejemplo no tiene sentido porque no se puede utilizar el operador ++ en un valor.

2

El operador ++ no tiene nada que ver con las matrices. Incrementa cualquier variable entera (o más generalmente, cualquier lvalue) en 1. Es lo mismo que i ++ en el ciclo.

Puede escribir ya sea ++ x o x ++. Ambos incrementan x, pero tienen valores diferentes: ++ x devuelve el nuevo valor de x y x ++ devuelve el valor anterior. Por lo tanto, su código imprime 1, 2, 3, 4 en lugar de 2, 3, 4, 5.

Cuestiones relacionadas