2013-03-13 9 views
7

EDIT 1Cosa succede se si rimuove lo spazio tra gli operatori + e ++?

NOTA BENE: So che+++non è davvero un operatore ma i + e ++ operatori senza uno spazio. So anche che non c'è motivo di usarlo; questa domanda è solo per curiosità.


così, sono curioso di vedere se è necessario lo spazio tra + e ++var in Java.

Ecco il mio codice di prova:

int i = 0; 
System.out.println(i); 
i = i +++i; 
System.out.println(i); 

Questo stampa:

0 
1 

che funziona come mi sarei aspettato, proprio come se ci fosse uno spazio tra la prima e la seconda +.

Poi, ho provato con la concatenazione di stringhe:

String s1 = "s " + ++i; 
System.out.println(s1); 
// String s2 = "s " +++i; 

Questo stampa:

s 2 

Ma se la terza linea non sia commentata, il codice non si compila, con l'errore:

Problem3.java:13: unexpected type 
required: variable 
found : value 
    String s2 = "s " +++i; 
       ^
Problem3.java:13: operator + cannot be applied to <any>,int 
    String s2 = "s " +++i; 
        ^

Che cosa sta causando la differenza di comportamento tra la concatenazione di stringhe e l'aggiunta di numeri interi ition?


EDIT 2

Come discusso nel Abhijit's follow-up question, la regola che la gente ha detto (il token più grande ++ essere analizzato prima, prima che il token ++ più breve) è discusso in this presentation in cui appare per essere chiamata la regola di Munchy Munchy.

+1

E simmilary i = i +++++ i; NON è valido ma i = i ++ + ++ i; È. – Jayamohan

+0

Dato che non è un operatore, chiedersi come funziona non ha senso. Non è una vera domanda. – EJP

+1

Domanda di followup [Is '+++' è solo un incremento post-fix seguito da un infisso (sempre)?] (Http://stackoverflow.com/q/15382171/977038) – Abhijit

risposta

5

compilatore genera più lunghi possibili token durante l'analisi fonte, così quando incontra +++, si prende come ++ +.

Quindi il codice di

a +++ b 

sarà sempre uguale a

(a++) + b 
+1

+1 per aver menzionato la regola token più lunga. – Morwenn

+0

+1 per la regola token più lunga. – chm

2

Il vantaggio tripla non è un operatore stesso, è due operatori combinati:

Nei Triple Plus acutually fa è:

un +++ 1 == un ++ + 1;

Quello che stai cercando di fare è ++ una stringa, che non è definita.

Mai e poi mai usare +++ senza spazi nel codice; quasi nessuno saprà cosa fa (senza consultare il web). Inoltre, dopo una settimana o giù di lì, non saprai cosa fa veramente te stesso.

13

Non c'è l'operatore +++. Quello che hai è un operatore postfix ++ seguito da un operatore infisso +. Questo è un errore di compilazione perché il suffisso ++ può essere applicato solo a una variabile e "s " non è una variabile.

Poiché si intende realmente un operatore + infisso seguito da un operatore prefisso ++, è necessario inserire lo spazio tra gli operatori.

In realtà, dovresti farlo TUTTO. +++ è un crimine contro la leggibilità !!!

1

+++ non è un operatore di per sé.

i = i +++i; risultati in pre-incremento valore i, quindi aggiungendolo al valore di i e riporlo in i.

Con String, + non significa addizione, quindi si sta tentando di concatenare insieme la stringa e il numero intero.