【问题标题】:+= operator with String and casted char+= 带有字符串和强制转换字符的运算符
【发布时间】:2019-06-08 07:01:48
【问题描述】:

这可能是一个愚蠢的问题,但我发现了一个我无法理解的交互。我认为这与 += 的工作方式有关。

String temp = "";
temp += (char) 90 + 10;
System.out.println(temp); // "100"
temp = "" + (char) 90 + 10;
System.out.println(temp); // "Z10"

Z10 是有道理的。 100 没有。我认为第二行将以产生“Z10”或“d”的两种不同方式之一执行。为什么演员表似乎被忽略了?

【问题讨论】:

    标签: java string casting char


    【解决方案1】:

    += 无关。这与+ 的工作方式有关。

    如果+的任一操作数为String类型,则+为字符串连接运算符;否则为数字加法。


    temp += (char) 90 + 10; 
    

    一样
    temp += ((char) 90 + 10);
    

    所以首先计算括号,然后应用+=。这里,(char) 9010 都不是 Strings,所以 + 是数字加法。

    为了进行数字加法,必须使两个操作数兼容 - 这称为二进制数字提升。如果操作数是charint,则char 扩大为int

    因此(char) 90 立即扩大回90;然后可以添加两个 ints - 产生 100 - 然后可以通过 += 将其附加到 temp 字符串。


    另一方面

    temp += "" + (char) 90 + 10;
    

    一样
    temp += (("" + (char) 90) + 10);
    

    所以,它首先计算最里面的括号。

    因为""String,所以"" + (char) 90是字符串拼接,导致值"Z"。那也是String;所以"Z" + 10也是字符串拼接,导致"Z10"

    【讨论】:

    • 好的,谢谢。所以你提到的二进制数字提升的东西就像使用整数表达式来初始化一个双精度,对吧?这只是一个特例,其中 + 运算符也会根据使用的数据类型而变化。
    • 使用整数初始化双精度是widening primitive conversion。但这是同一种想法:编译器应用自动转换以使值与特定上下文兼容。
    • 谢谢——最后一个问题。因此,如果我理解正确,int foo = 100; String bar = "d"; foo == bar.charAt(0)(100 的 unicode 是 'd')由于二进制数字提升应该是正确的,对吗?
    【解决方案2】:

    += 等赋值运算符具有lowest precedence,因此在+ 之后评估+=

    因此,在计算 += 运算符之前,先计算其 2 个操作数。第一个操作数是temp,第二个操作数是(char) 90 + 10(char) 90 + 10 计算结果为 100(两个数字操作数,所以 + 执行加法)。因此100temp 引用的空String 连接,从而得到String“100”。

    另一方面,在

    temp = "" + (char) 90 + 10;
    

    有两个+ 运算符。两者具有相同的优先级,因此它们从左到右进行评估。

    • 首先"" + (char) 90 执行Stringchar 的串联,产生一个String,其单个字符是匹配值90(“Z”)的字符。

    • 然后第二个+int 10 连接到String“Z”,得到String“Z10”。

    【讨论】:

      【解决方案3】:

      类型转换的优先级高于算术运算符。

      (char) 90 + 10 被评估为((char) 90) + (10)。将char 添加到int 的结果是int

      你想要的是(char) (90 + 10),即将添加的结果转换为char。然后它将作为char附加到String

          String temp = "";
          temp += (char) (90 + 10);
          System.out.println(temp); // prints "d"
      

      【讨论】:

        猜你喜欢
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 2013-04-09
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        相关资源
        最近更新 更多