2.8 字符串运算符
一般而言,不能对字符串执行数学运算,即便对那些看起来像数字的字符串亦是如此。下面的表达式是非法的:
"Hello" - 1 "World" / 123 "Hello" * "World"
运算符 + 可用于字符串,但其所作所为可能出乎意料。用于字符串时,运算符 + 执行串接(concatenation),即首尾相连,因此 "Hello, " + "World!" 的结果为字符串 "Hello, World!"。
再举一个例子。如果你声明了类型为 String 的变量 name,则表达式 "Hello, " + name 会将变量 name 的值附加在字符串 hello 的后面,从而生成个性化的问候。
鉴于对数字和字符串都定义了加法运算,因此 Java 可能执行意料之外的自动转换:
System.out.println(1 + 2 + "Hello");// 输出为3HelloSystem.out.println("Hello" + 1 + 2);// 输出为Hello12
Java 按从左到右的顺序执行这些运算。在第 1 行中,1 + 2 等于 3,而 3 + "Hello" 的结果为 "3Hello";在第 2 行中,"Hello" + 1 的结果为 "Hello1",而 "Hello1" + 2 的结果为 "Hello12"。
表达式包含多个运算符时,将根据运算顺序(order of operation)计算表达式。一般而言,Java 按从左到右的顺序执行运算(如 2.7 节所示),但对于数值运算符,Java 遵循如下的数学规则。
乘除运算的优先级高于加减运算,这意味着先乘除后加减。因此
1 + 2 * 3的结果为7,而不是9,而2 + 4 / 2的结果为4,而不是3。运算符的优先级相同时,按从左到右的顺序执行。因此,表达式
minute * 100 / 60先执行乘法运算;如果minute的值为 59,这个表达式将变为5900 / 60,结果为98。如果按从右到左的顺序执行这些运算,将得到错误的结果59 * 1。要想改变默认的运算优先级或对默认的运算优先级不太确定时,可使用括号。首先计算括号内的表达式,因此
(1 + 2) * 3的结果为9。还可用括号让表达式更容易理解,如(minute * 100) / 60,虽然就这个表达式而言,用不用括号对结果并没有影响。
别费劲地去记运算符的优先级,尤其是除算术运算符外的其他运算符。如果表达式的含义不那么明显,可用括号让它清晰起来。
