Java: sum of two integers being printed as concatenation of the two

前端 未结 10 1913
忘了有多久
忘了有多久 2020-12-03 19:41

Consider this code:

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

When I run this code I get the output 1711. Can anybod

相关标签:
10条回答
  • 2020-12-03 19:41

    There are two issues here: octal literal, and order of evaluation.

    int y = 013 is equivalent to int y = 11, because 13 in base 8 is 11 in base 10.

    For order of evaluation, the + operator is evaluated left to right, so "x+y = " + x+y is equivalent to ("x+y = " + x)+y, not "x+y = " + (x+y). Whitespaces are insignificant in Java.

    Look at the following diagram (s.c. is string concatenation, a.a. is arithmetic addition):

    ("x+y = " + x)+y
              |   |
         (1) s.c  |
                  |
                 s.c. (2)
    
    
    "x+y = " + (x+y)
             |   |
             |  a.a. (1)
             |
            s.c. (2)
    

    In both diagrams, (1) happens before (2).

    Without the parantheses, the compiler evaluates left-to-right (according to precedence rules).

     "x+y = " + x+y
              |  |
             (1) |
                 |
                (2)
    
    0 讨论(0)
  • 2020-12-03 19:48

    It appears to be interpreting y as using octal notation (which evaluates to 11). Also, you're concatenating the string representations of x and y in System.out.printLn.

    0 讨论(0)
  • 2020-12-03 19:50

    The 17 is there directly.

    013 is an octal constant equal to 11 in decimal.

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

    When added together after a string, they are concatenated as strings, not added as numbers.

    I think what you want is:

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

    or

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

    Which will be a better result.

    0 讨论(0)
  • 2020-12-03 19:55

    You're doing string concatenation in the final print, since you're adding to a string. Since "x+y = " is a string, when you add x to it, it's giving you "17", making "x+y = 17".

    THe 013 is in octal, so treated as a decimal, you get 11. When you concatenate this, you end up with "x+y = 17" + "11", or 1711

    0 讨论(0)
  • 2020-12-03 19:55

    It's string concatenation of decimal 17 and octal 13 (equivalent to decimal 11).

    0 讨论(0)
  • 2020-12-03 19:56
    "x+y = " + x+y
    

    equals

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

    which equals

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

    which equals

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

    013 is octal = 11 in decimal

    0 讨论(0)
提交回复
热议问题