2013-07-24 18 views
8

Dal momento che ci sono state così tante domande operatore di precedenza poco tempo fa, ho iniziato a giocare con un po 'di codice e arrivato fino a questo:problema Precedenza degli operatori porta a "Errore: tipo imprevisto"

int x = someNumber; 
int y = --x++; 

Questo dà:

Error: unexpected type 

required: variable 
found: value 

Ho provato questo perché ero interessato a sapere come java avrebbe a che fare con il fatto che postfix ha una precedenza di operatore superiore a prefix. Questo sembra che l'affermazione precedente porterebbe ad una contraddizione, che immagino sia gestita da questo errore.

La mia domanda è duplice:

  1. Perché questo errore? Cosa significa esattamente?
  2. Perché lo postfix ha una precedenza superiore a prefix? Sono sicuro che c'è una buona ragione, ma non sono stato in grado di inventarne uno. Forse risolverebbe questo comportamento non definito , ma in qualche modo causerebbe più problemi?

risposta

11

La causa dell'errore è che x++ produce un valore, e non è possibile applicare un decremento operatore su un valore, solo su una variabile. Ad esempio se x = 41, x++ restituisce 41, non la variabile x e --(41) non ha significato.

Per quanto riguarda il motivo per cui postfix ha una precedenza più alta del prefisso, la mia ipotesi è che sia per evitare l'ambiguità con altri operatori durante l'analisi. Ad esempio, il compilatore può segnalare un errore di sintassi per x--x invece di analizzarlo come x-(-x).

+1

+1, buona risposta. :) – PermGenError

+0

Ottima risposta. Grazie. Non ho mai pensato a questa possibilità. Ha senso. –

4

provare

int y = 2++; 

si otterrà lo stesso errore. Messaggio operatore/pre vengono applicati sulla variabile non su alcuni number.Thats perché si ottiene l'errore

Error: unexpected type 

perché si aspetta una variabile non qualche numero. Supponiamo che il tuo numero sia 3

int x = 3; 
int y = --x++; 

int y become 2++ after applying -- operator on java (as java operator works 
from left to right) 

Non so esattamente cosa stai cercando di porre nella seconda domanda. Ma prendere scenario

int y = -x---x; 

anche qui sarà operato da sinistra a destra che viene a

(-x--)-(x) so answer will be -3 so dont get confused by postfix and prefix 
+0

Buona risposta. Grazie. –

2

x è una variabile, è modificabile, quindi è possibile eseguire ++x o x++.

Ma quando si esegue --x++, quindi viene applicato su x++, che non è modificabile poiché è un valore e non una variabile.

+0

Buona risposta. Grazie. –

2

Tecnicamente, qualche entità in un'espressione è "lval" o "rval". "lval" è un "valore di mano sinistra" (sul lato sinistro di x = y) e può essere assegnato a. "rval" è un "valore di destra" e non può essere assegnato a.Puoi usare un "lval" dove è richiesto un "rval", ma non viceversa. ++ e -- richiedono "lvals".

Un "lval" può essere un nome di variabile semplice o un puntatore dereferenziato o un'espressione di indicizzazione dell'array (e probabilmente altri 2-3).

Problemi correlati