Java: sum di due interi che vengono stampati come concatenazione dei due

class giri{ public static void main(String args[]) { int x = 17; int y = 013; System.out.println("x+y = " + x+y); } } 

Quando eseguo il programma ottengo l’output 1711. Qualcuno può dirmi come ottengo il 1711

Il 17 è lì direttamente.

013 è una costante ottale pari a 11 in decimale.

 013 = 1*8 + 3*1 = 8 + 3 = 11 

Quando vengono aggiunti insieme dopo una stringa, vengono concatenati come stringhe, non aggiunti come numeri.

Penso che quello che vuoi sia:

 int x = 17; int y = 013; int z = x + y; System.out.println("x+y = " + z); 

o

 System.out.println("x+y = " + (x + y)); 

Quale sarà un risultato migliore.

Ci sono due problemi qui: letterale ottale e ordine di valutazione.

int y = 013 equivale a int y = 11 , perché 13 nella base 8 è 11 nella base 10.

Per ordine di valutazione, l’operatore + viene valutato da sinistra a destra, quindi "x+y = " + x+y è equivalente a ("x+y = " + x)+y , non "x+y = " + (x+y) . Gli spazi bianchi sono insignificanti in Java.

Guarda il seguente diagramma ( sc is string concatenation, aa is arithmetic addition):

 ("x+y = " + x)+y | | (1) sc | | sc (2) "x+y = " + (x+y) | | | aa (1) | sc (2) 

In entrambi i diagrammi, (1) accade prima (2) .

Senza le parestes, il compilatore valuta da sinistra a destra (secondo le regole di precedenza).

  "x+y = " + x+y | | (1) | | (2) 

Stai facendo concatenazione di stringhe nella stampa finale, dato che stai aggiungendo una stringa. Poiché "x+y = " è una stringa, quando aggiungi x ad essa, ti dà "17" , rendendo "x+y = 17" .

Il 013 è in ottale, così trattato come un decimale, si ottiene 11. Quando si concatena questo, si finisce con "x+y = 17" + "11" , o 1711

 "x+y = " + x+y 

equivale

 ("x+y = " + x) + y 

quale è uguale a

 ("x+y = " + String.valueOf(x)) + y 

quale è uguale a

 "x+y = " + String.valueOf(x) + String.valueOf(y) 

013 è ottale = 11 in decimale

I numeri preceduti da 0 sono ottali . 13 ottale è 11 decimale.

La chiamata x + y considera entrambi i parametri come stringhe, quindi si combina la stringa “17” e “11”.

013 è ocatal … convertilo in decimale e otterrai 11. Dai un’occhiata qui per una spiegazione del sistema ottale.

È la concatenazione di stringhe di decimali 17 e ottali 13 (equivalente al decimale 11).

Sembra interpretare y come usando la notazione ottale (che valuta 11). Inoltre, stai concatenando le rappresentazioni di stringa di xey in System.out.printLn.

Vorrei solo aggiungere alla spiegazione di Reed che 013 è interpretato come Octal 13, che è decimale 11.

tutti menzionati 0 rendono il numero ottale.
Voglio solo aggiungere che 0x rende esadecimale