2014-12-23 14 views
30

Quindi, mi aspetto che questo non per compilare, e non:Un plus plus due compilazioni inaspettatamente

// the two is inc'd, so reduces symbolically to println(int int) 
// which is a compile error 
System.out.println(1 ++ 2); 

ma questo:

System.out.println(1 + + 2); // returns three 

cosa succede? Non dovrebbe anche non compilare?

Inoltre, questa domanda è molto difficile per cercare perché degli operatori ..

+1

++ è un operatore di incremento in modo che il compilatore possa aspettarsi un nome di variabile prima o dopo ++ – ryekayo

+12

Nel secondo caso '+' è un operatore di "zucchero sintattico" (mirroring '-') che non fa nulla per operando. –

+4

* "Inoltre, questa domanda è molto difficile da cercare a causa degli operatori .." * Perché non cercare "operatori Java"? Otterrai un elenco di operatori e questi operatori sono elencati. – Radiodef

risposta

65

Java interpreta il 1 + + 2 lavorare come 1 più positiva 2. Vedere la Unary operator section.

+7

Anche se non dettagliato come le altre risposte corrette, questo è stato abbastanza veloce da analizzare e capire. – jabgibson

+8

A volte non è necessaria una suddivisione dettagliata delle specifiche. A volte, la risposta migliore è la più semplice. :) –

41

dalla specifica, il Lexical Translations

Il più lungo possibile traduzione è utilizzato ad ogni passo, anche se il risultato ultima analisi non fa un programma corretto mentre un'altra traduzione lessicale sarebbe. C'è un'eccezione: se la traduzione lessicale si verifica in un contesto di tipo (§4.11) e il flusso di input ha due o più caratteri> successivi che sono seguiti da un carattere non> , allora ogni carattere> deve essere tradotto in il token per l'operatore di confronto numerico>.

(anche noto come maximal munch.)

Il ++ viene interpretato come postfix increment operator che non può essere applicata a un letterale intero, così l'errore di compilatore.

Mentre

1 + + 2 

ciascun carattere viene interpretato separatamente. 1 è un valore intero letterale, + è il additive operator, + è il unary plus operator e 2 è un valore letterale intero. L'intera espressione è equivalente a

1 + (+2) 

che è più facile da leggere.

6

In Java/C++/C ++ non corrisponde a + +. ++/-- sono Increment/Decrement operator. Il primo caso non funziona perché non si applica ai valori letterali (1 o 2). Anche in questo caso non sarebbe una dichiarazione valida, né 1++ 21 ++2 sono dichiarazioni valide in Java. Il secondo esempio funziona perché è interpretato come 1 + (+2). Il lexer Java ignora lo spazio bianco. Allo stesso modo questo è valido:

1 + + + 2 --> 1 + (+ (+2)) 

O

1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 

Funziona solo perché + è un operatore unary.Non funziona per le stringhe come qui sotto:

"a" + + "b" // does not work because +"b" is not valid. 

Allo stesso modo non è valida con la moltiplicazione

1 * * 2  // does not work because *2 is not valid. 
+1

Non è giusto dire che il lexer ignora gli spazi bianchi, eh? Dopo tutto, non interpreta '1 ++ 2' come' int biplus unplus int', né '1+ + 2' come' int incr int' – djeikyb

3

Il messaggio è:

Main.java:14: error: ')' expected 
     System.out.println(1 ++ 2); 
          ^

La dichiarazione 1 ++ 2 viene analizzato come 1 seguito da ++ seguito da 2. Questo viene interpretato come 1++ e 2 creando un errore di sintassi (e non un errore unexpected type, infatti, si otterrà lo stesso errore se si utilizzano le variabili, ad esempio i ++ j).


La 1 + + 2 dichiarazione d'altra parte viene analizzato come 1 seguito da + seguito da +2 che compila come previsto. Lo spazio tra i due operatori separa i due operatori.

3

A volte è più facile vedere un problema utilizzando le variabili.

tuo frammento potrebbe essere riscritto come:

int a = 1; 
int b = +2; 
System.out.println(a + b); 

Ora, si può facilmente vedere che il secondo operatore + è usato per indicare un valore positivo. Potresti anche aver scritto +1 + +2.

L'operatore - può essere utilizzato per negare un'espressione.

+ e - sono operatori unari.