一段计时的代码,把时间长度用“2小时37分钟28秒”这样的形式输出,但是偶然注意到结果很有问题。盯着代码看了半天,觉得逻辑判断都是正确的,后来用一个数字 debug 才找到真相。
比如 4000 秒,程序先判断如果大于一小时,就输出小时数,然后算余数。就是算余数这一步除了问题,代码写成 secs % 60*60
。写代码的人为了清晰,还故意在乘号两边去掉了空格,可是这更加容易地造成了错觉,让人觉得 60*60
是先计算的。可是 “%” 的优先级和乘除是同等的!
运算符优先级是挺难记的。我觉得,迷惑的时候,加括号就行了,可读性也绝对好。
不过这次通过 Oracle 这个文档我是记住了,”%” 和乘除都是 multiplicative operators, 所以是同等优先级。想想处理器原理,确实是这样,除法的结果不就顺便出来余数了吗。
Leave a Reply