2011-01-10 15 views
7

Cuando intento escribir un postfijo/prefijo en/decremento, seguido de una entrada/prefijo en/decremento, aparece el siguiente error: Argumento no válido para la operación ++/-.En Java, ¿por qué no puedo escribir i ++++ o (i ++) ++?

Pero, de acuerdo con JLS:

PostIncrementExpression: 
     PostfixExpression ++ 

y

PostfixExpression: 
     Primary 
     ExpressionName 
     PostIncrementExpression 
     PostDecrementExpression 

por lo que escriben:

PostfixExpression ++ ++ 

debería ser posible ... ¿Alguna idea?

+4

¿Qué devuelve 'i ++'? –

+5

¿No crees que '- ++ ---- ++ var ++ ---- ++ - ++' podría ser un poco confuso? – Crozin

+3

Dado que el incremento de C++ es C#, ¿ha intentado utilizar 'i #'? ;-) –

Respuesta

23

Tenga en cuenta que la gramática prima carece de semántica. Es solo sintaxis, y no todos los programas sintácticamente válidos serán generalmente válidos. Por ejemplo, el requisito de que las variables deban declararse antes del uso generalmente no está cubierto por la gramática (puede hacerlo, pero es engorroso).

Postfix-Increment produce un valor r - y al igual que no puede postfix-incrementar literales, no puede postfix-incrementar el resultado de i++.

Citando del JLS (3 rd ed, página 486.):

The result of the postfix increment expression is not a variable, but a value.

+0

¿Puede codificar la declaración previa al uso en la gramática? Para cualquier número de identificadores? – delnan

+0

@delnan: Las gramáticas de Van Wijngaarden fueron concebidas para tales cosas, sí. Pero para todos los propósitos prácticos, las gramáticas de dos niveles son difíciles de manejar y se puede lograr gran parte de lo mismo con una gramática atribuida simple que define las afirmaciones que se propagan por AST (si mal no recuerdo, han pasado algunos años desde esa clase). – Joey

0

¿Qué intenta lograr con (i ++) ++?

increment it twice !!

Utilizar ciclo

Incremento dentro de un bucle :)

+3

Ugghh. Sin duda, 'i + = 2' es mejor que un ciclo. –

1

cuál debe ser el resultado de una operación de este tipo? El resultado de i++ es (una copia de) el valor actual de i, y i se incrementa posteriormente (post). Entonces, ¿cómo te imaginas incrementar el resultado de i++ una vez más? Si i originalmente era 1, ¿cuál debería ser su valor después de i++++, y cuál debería ser el resultado de esta operación?

Si lo piensas bien, probablemente te des cuenta de que sería muy difícil de definir correctamente. Dado que los diseñadores de Java intentaron evitar las trampas "indefinidas" de C/C++ (y dado que el valor de dicha afirmación es dudoso en el mejor de los casos), probablemente decidieron rechazarlo explícitamente.

+0

No, no es por eso. La razón, como se afirma en otras respuestas, se debe a que el resultado de la expresión i ++ es un valor, no una referencia que puede modificarse. –

+0

@John, ¿cuál fue el motivo de tu pregunta, entonces? –

+0

Lo recordé debido a los comentarios/respuestas. –

8

El error que da la respuesta:

unexpected type 
required: variable 
found : value 
     (i++)++; 

Así, el i ++ se evalúa como un valor, mientras que el operador requiere una variable.

+2

Hm, depende del compilador, supongo. EclipseC produce »argumento no válido para la operación ++/-« que no es tan útil. – Joey

+0

Interesante. Sí, eso no es tan útil. El error anterior es del compilador de Sun. – JOTN

5

Solo puede aplicar ++ o -- a una expresión que indique una ubicación modificable (un lvalue). El RESULTADO de ++ o -- es el valor de la ubicación (un valor r - antes o después del incremento o decremento) y no es una ubicación modificable.Por lo tanto, no puede decir (a++)++ más de lo que puede decir (a+b)++ - no hay ninguna ubicación para modificar.

0

En i ++, ++ es un operador de postfijo, por lo que devuelve el valor de iy luego lo incrementa. ¿Qué quieres (i ++) ++ hacer? ¿Debería devolver i + 1 desde (i ++ == i)? Si no es así ¿no sería extraño que i = i ++ pero (i ++) ++ = i) examinar las siguientes expresiones:!

i++ == i; // true 
j = i++ // j gets the value of i 
j++ == i // still true since j== i 

(i++) ++ == j ++ // what should be the answer here? 

¿ha considerado i + 2 =?

2

i ++ es básicamente un atajo para:

(i = i + 1)

Y no tendría ningún sentido escribir:

(i = i + 1) ++ ;

¿verdad? :)

+3

'(i = i + 1)' es * no * el mismo comportamiento que '(i ++)' - el primero devuelve el nuevo valor de i, este último devuelve el anterior. –

+0

Lo siento. Supongo que no escogí una buena carita que transmita cariño. Mi error. -1 a mí mismo por esto. – Kylar

0

¿Por qué no solo utiliza el operador de incremento de taquigrafía?

i+=2 

There.

4

El problema con esta expresión i = (i ++) ++; es que (i ++) se resuelve a un valor y la definición de ++ operador dice que 1. incrementará la variable especificada y pondrá/devolverá un valor para esto ya sea que use Postfix o Prefix. 2. Este operador requiere una variable ya sea prefijo o postfijo. Pero lo que está sucediendo aquí es (i ++) es devolver un valor y colocarlo en lugar de (i ++) y luego está teniendo (valor) ++ y (valor) no es el tipo esperado para este operador ya que requiere una variable en lugar de valor

por ejemplo en Java si se compila el código siguiente fragmento obtendrá el error como se indica tras fragmento:

public class A { prueba public void() {int i = 0; i = (i ++) ++; } }

salida

Compilación:

A.java: 4: tipo inesperado requerido: variable encontrado: valor i = (i ++) ++; ^ 1 error

1

debe recordar: Incremento & decremento (prefijo & postfix) operador siempre trabajar con variables no valor

Aquí estoy explicar esto con un solo exe :

int i = 0; 

int j = (i++)++; 

anterior exe.

initialize value of i with 0(zero)

in (i++) '++' work with i which is variable & after performing operation return (1)

now in (1)++ '++' work with (1) which is value not variable that is oppose to rules of java that's why compile time error generate Invalid argument to operation ++/--

Cuestiones relacionadas