java运算符的优先_Java运算符的优先级

由于Java中运算符优先级的正确性,我感到困惑。 我很久以前在教程中读到,"与"的优先级高于"或",这在问题中提供了答案。 但是,我目前正在使用" Sun Java 6认证程序员学习指南"来学习Java。 本书包含以下示例:

int y = 5;

int x = 2;

if ((x > 3) && (y < 2) | doStuff()) {

System.out.println("true");

}

我复制并引用了有关编译器如何处理上述代码的解释:

If (x > 3) is true, and either (y < 2) or the result of

doStuff() is true, then print "true". Because of the

short-circuit &&, the expression is evaluated as though there were

parentheses around (y < 2) | doStuff(). In other words, it is

evaluated as a single expression before the && and a single

expression after the &&.

尽管这意味着|的优先级高于&&。 是否由于使用"非短路OR"而不是短路OR? 什么是真的?

书中可能是印刷错误。 按位或黑白(y<2)和doStuff()没有意义。 此外,解释还讨论了" y <2为真或doStuff()为真",这是逻辑或。

可能不是按位或,请再次检查。

|与||不同。 一个是按位的。 另一个是合乎逻辑的。

好的,名称错误,不是"按位或",而是"非短路或"。

问可能很明显,但是什么书呢?

@owlstead:" Sun Java 6认证程序员学习指南"。 您可以对这本书发表评论吗?

只是为了更容易理解,我更愿意在不需要的情况下加上一些括号。

试图在那本书上找到勘误,但我没有找到。 无论如何,Sun / Oracle几乎从未承认过错误。

我已经格式化了您的问题,也许您可以检查一下最终的降价格式。 请使用4个空格而不是制表符作为代码片段。

这是因为它使用|运算符而不是||,后者具有更高的优先级。 这是桌子。

改用||运算符,它将按照您的想法进行操作。

也就是说,这本书的解释是完全错误的。 &&运算符的短路性与为什么对(y < 2) | doStuff()进行评估时好像在其周围有括号有关。

@JB Nizet:该示例是根据运算符的优先级设置的,而不是&&的实际工作方式。令人惊讶的是,这本书缺少一个表格来显示本节中所有运算符的优先顺序,因此根据我以前的知识使我感到困惑。

是的,我同意这是一个愚蠢的例子。底线是运算符优先级表告诉所有

@arjacsoh:我的意思是这句话是错误的:由于&&的短路,该表达式的值好像是在括号内(y <2)| |。做东西()。实际上,它应该是:具有比&&更高的优先级,该表达式的计算方式就像在(y <2)|周围有括号一样。做东西()。

很难看到它如何编译-布尔值(y < 2)是否会自动提升为int?

Because of the short-circuit &&, the expression is evaluated as though there were parentheses around (y < 2) | doStuff() ...

这句话是不正确的,的确是毫无意义的。 &&是短路算子的事实与(y <2)|的求值无关。 doStuff(),实际上只有在doStuff()返回布尔值时才能编译。 造成差异(隐式括号)的原因是&&相对于|的优先级,在JLS ## 15.22-23中定义为&&较低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值