字符串输出与+混淆

时间:2015-10-01 08:18:11

标签: java string

public class Test2 {     public static void main(String [] args){

    System.out.println("3 + 6"); 
    System.out.println(3 + 6); 
    System.out.println(3 + 6 + "buffer"); 
    System.out.println("buffer" + 3 + 6); 
    System.out.println("buffer " + (3 + 6)); 
 }


}

的输出
 System.out.println(3 + 6 + "buffer");

  

9缓冲区

的输出
System.out.println("buffer" + 3 + 6);

  

缓冲区36

为什么差异?为什么

System.out.println(3 + 6);

输出

  

9

6 个答案:

答案 0 :(得分:3)

算术运算符从左到右解析。当你+使用字符串时,它会附加为字符串。

System.out.println(3 + 6 + "buffer"); 

那就变成了

System.out.println(  9 + "buffer"); 

当你做的时候

System.out.println("buffer" + 3 + 6); 

评估为

 //  "buffer3" + 6
 //  "buffer36"

 System.out.println(3 + 6)

没有字符串连接。所以直接整数加法发生。

如果是

System.out.println("buffer " + (3 + 6)); 

您在3+6添加了括号。由于优先级较高,括号中的表达式首先进行求值。因此,成为

System.out.println("buffer " + 9); 

答案 1 :(得分:2)

传递给println的表达式在传递之前进行评估。

从左到右评估它们。

如果表达式中的第一个(左)操作数是字符串,+执行字符串连接,则"buffer" + 3 + 6变为"buffer3" + 6,变为"buffer36"

如果第一个和第二个操作数是数字,+执行添加,3 + 6 + "buffer"变为9 + "buffer",变为"9buffer"

如果某些操作数被括号括起来,则首先应用它们之间的运算符,因此"buffer " + (3 + 6)等同于"buffer " + 9

答案 2 :(得分:2)

表达式正在评估从左到右的方向。

所以import AVFoundation var backgroundMusicP: AVAudioPlayer! func playBackgroundMusic(filename: String) { let url = NSBundle.mainBundle().URLForResource( filename, withExtension: nil) if (url == nil) { print("Could not find file: \(filename)") return } var error: NSError? do { backgroundMusicP = try AVAudioPlayer(contentsOfURL: url!) } catch { backgroundMusicP == nil } if backgroundMusicP == nil { print("Could not create audio player: \(error)") return } backgroundMusicP.numberOfLoops = -1 backgroundMusicP.prepareToPlay() backgroundMusicP.play() } 在这一行中首先评估整数和System.out.println(3 + 6 + "buffer");这里是第一种类型是字符串,并根据字符串类型在右边评估类型转换。

答案 3 :(得分:1)

首先从左到右评估您传递的表达式。这里是3 + 6 +"缓冲区"前两个参数是整数,因此+运算符将它们相加,sum为9,当它得到第三个参数" buffer"这是一个字符串,它将结果转换为字符串并打印出来。因此你得到字符串" 9buffer"结果。

然而在第二种情况下"缓冲区" + 3 + 6第一个参数是字符串,第二个参数是整数,所以第二个参数首先转换为字符串,然后+运算符连接它们。类似的情况是当它到达第三个操作符时它会"缓冲" +6并再次连接它,因此结果变为"缓冲区36"。

答案 4 :(得分:0)

如果您对String使用+符号,则java编译器将其视为连接并自动将toString调用到其他对象。

因此,当您尝试打印3+6+"stuff"时,它意味着int + int + contate to String,因此首先添加两个数字,然后将其转换为字符串并将其与"stuff".连接 如果您致电"stuff"+3+6,则会打印stuff36

答案 5 :(得分:0)

在程序运行的第一个(3 + 6 +“缓冲区”)中,java从左侧读取程序,因此将3和6视为整数,它们的总和为9,然后读取一个字符串,从而将其与字符串,结果为“ 9buffer”。 在第二个(“缓冲区” + 3 + 6)中,它首先读取字符串,因此将另一个与之连接 结果是buffer36。 在第三个(3 + 6)中,它们采用整数,因为在它们之前没有字符串 所以它给出9。