我正在尝试用Java编写一些游戏代码,但其中一个if语句没有按预期工作。
if(player.gety() < y+row*tileSize){
player.draw(g);
System.out.println("Row: " + y+row*tileSize);
System.out.println("Player: " + player.gety());
}
运行此代码时,我收到的输出是:
Player: 200
Row: -79.99999999968651320
Player: 200
Row: -79.99999999968651320
Player: 200
Row: -79.99999999968651320
这没有多大意义,因为player.gety()明显大于y + row * tileSize。这有什么理由会发生吗?
答案 0 :(得分:4)
字符串连接是你在这里绊倒的原因。具体来说,
"Row: " + y+row*tileSize
与
不同"Row: " + (y+row*tileSize)
在第一种情况下,您正在
("Row: " + y)+ (row*tileSize)
其中y
被转换为其String表示并连接到"Row: "
,然后row * tileSize
的乘积将转换为其String表示并连接到该表示。
在第二种情况下,您将获得(y + row * tileSize)
一个数字值,然后将其转换为字符串表示形式并连接到字符串"Row: :"
这实际上符合规范的要求。当+运算符的任一操作数是字符串时,它不再意味着&#34;添加&#34;,它意味着&#34;连接&#34;,并且连接不遵循算术优先规则。相反,它贪婪地将其他操作数强制转换为String值并将两者合在一起。
这可能会有一些意想不到的结果,正如您所发现的那样。尝试按照上面的建议添加parens,或单独打印出变量的值:
System.out.println("y = "+ y + " row = "+row + " tileSize = " + tileSize)
它会更容易看到发生了什么。
编辑: 我希望您发现更可能,y = -79.999999999(即-79.9,重复)和row * tileSize = 68651320。加上你的东西大大超过200。
答案 1 :(得分:0)
是的,我不认为Row输出语句显示了您认为它显示的内容。另外,player.draw(g)
可能会修改player.gety()
的结果吗?将输出语句放在if-true块中。输出每个变量而不是表达式。