如果语句运行时为false

时间:2016-02-02 06:21:23

标签: java if-statement

我正在尝试用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。这有什么理由会发生吗?

2 个答案:

答案 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块中。输出每个变量而不是表达式。