【问题标题】:understanding the java string with add operator用 add 运算符理解 java 字符串
【发布时间】:2015-06-15 15:46:18
【问题描述】:

我试图了解编译器如何查看以下打印语句。这很简单,但有点有趣。

这会打印附加值。足够有说服力。

System.out.println(1+2); //输出:3

下面的输出看起来也很有说服力:

System.out.println(1+2+"3");//输出:33

我的问题(基于上述行为)在这里。

System.out.println("1"+2+3);//应该是15吧?不。现在是 123。

我尝试了一些其他类似的陈述。我能够看到一两个明确的行为。

  • 如果整数在前面,不带引号,则添加它们,后续整数只是作为后缀附加到前面添加的值。

  • 如果语句以字符串开头,在引号下,则所有其他后续元素都作为后缀附加。

这是在 java api 文档中的某个地方吗?或者只是非常明显的字符串或添加我没有看到的操作员行为。我们将不胜感激您的任何宝贵见解。

这里是sn-p的代码:

public static void main(String[] args) {
    System.out.println(1+2);
    System.out.println(1+2+"3");
    System.out.println("1"+2+3); 
    System.out.println("1"+2+"3");
    System.out.println("1"+2);
}
//   The Console output:
//      3
//      33
//      123
//      123
//      12

【问题讨论】:

    标签: java string operator-overloading operators


    【解决方案1】:

    这是字符串中有趣的部分。 当一个字符串被添加到任何其他数据类型时,结果值是一个字符串。另一个变量也被转换为一个字符串,然后连接起来。但是,当使用 + 符号对两个整数进行运算时,+ 充当加法运算符而不是串联运算符。 如果 println() 或 print() 方法中的表达式包含括号,则首先计算括号中的值。考虑以下示例:

        int a = 5;
        int b = 6;
        System.out.println(a + b); // Output will be: 11
        System.out.println("5" + "6"); // Output will be: 56
        System.out.println("" + a + b); // Output will be: 56
        System.out.println(5 + 6 + a + " " + b + a); // Output will be: 16 65
        System.out.println("Result: " + a + b); // Output will be: 56
        System.out.println("Result: " + (a + b)); // Output will be: 11
    

    您可以看到最后两个 sysout 语句之间的区别

    【讨论】:

      【解决方案2】:

      + 运算符在编译器中被重载。如果两个操作数都是数字,+ 是加法。如果一个或两个操作数都是字符串,+ 是字符串连接。 (如果一个操作数是字符串,而另一个是数字,则将数字转换为字符串)。最后,+ 从左到右绑定。

      所有这些都会导致复合公式 a + b + c + ... 从左到右进行加法运算,直到遇到第一个字符串操作数,此时它切换到公式其余部分的字符串连接。所以...

      "1" + 2 + 3 + 4 = 1234   /* cat cat cat */
      1 + "2" + 3 + 4 = 1234   /* cat cat cat */
      1 + 2 + "3" + 4 = 334    /* add cat cat */
      1 + 2 + 3 + "4" = 64     /* add add cat */
      

      【讨论】:

      【解决方案3】:

      我猜Java specification 解释得最好:

      + 运算符在语法上是左结合的,不管它是否 由类型分析确定以表示字符串连接或 数字加法。在某些情况下,需要小心才能获得所需的 结果。例如,表达式:

      a + b + c

      总是被视为意义:

      (a + b) + c

      所以,如果aString,那么它会与b 连接。结果将是String 类型,因此它继续与c 连接。

      【讨论】:

      • 这确实是有道理的,但当你看到类似byte b =10; b = b+10;//gives type mismatch error 的东西时会感到困惑:byte c = 10; c+=10; //no error here(implicit typecasting) 时没有错误?
      • 这是一个完全不同的问题,但是是的,这也是 JLS 中的定义。复合赋值运算符(+=/= 等)隐式转换回被分配的类型,但普通赋值运算符 = 不会。
      【解决方案4】:

      我也觉得这很有趣。我最近没有在 java 中工作太多,但我发现了一些信息,通过使用它可能会有所帮助。

      我认为这与 java 所做的自动类型转换有关。

      System.out.println("1"+2+3);

      如您所说,打印 123。由于“1”被转换为字符串,Java假设因为第一个是字符串,除非另有说明,否则后面的将是一个用于连接的字符串

      虽然,当你定义类型时,这个结果会打印 15

      System.out.println("1" + (int)(2+3));

      在这种情况下,它可以在连接之前完成操作。

      所以我认为 java 假设第一个是字符串,其余的将是字符串并将它们连接起来。

      编辑:你可以在 oracle 的网站here 上看到一些关于自动类型转换的信息

      【讨论】:

      • System.out.println("1" + (2+3)); 也可以,你不需要将子表达式转换为int
      • 好电话 - 没注意到。看起来 java 在将子表达式作为一个整体转换为用于连接的字符串之前评估子表达式,从而使转换无关紧要。
      猜你喜欢
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2020-12-17
      • 2019-12-14
      • 2011-01-20
      • 2020-02-02
      相关资源
      最近更新 更多