Java运算符预先混淆了&&和++

 Lucky_Leeing 发布于 2023-02-07 18:21

&&从左至右评估短路操作,因此,如果在左侧的操作&&运营进行评估,以虚假的,评估应该不会继续.但我++之前应该评估&&它,因为它具有更高的优先级,并且(来自链接):

优先级较高的运算符在优先级相对较低的运算符之前进行求值.

在这种情况下,为什么不在count这段代码的第三行增加?

int mask = 2;
int count = 0;
if( !(mask > 1) && ++count > 1) { mask += 100; }
System.out.println(mask + " " + count);

Martijn Cour.. 6

不,表达式的计算方式从左到右,同时考虑运算符优先级.因此,一旦在 a && ba变假,b不再被评估.

JLS§15.23.条件和运算符&&说:

条件和运算符&&类似于&(§15.22.2),但只有在其左侧操作数的值为真时才计算其右侧操作数.


以下是对其工作原理的详细分步评估:

这是因为,当您将表达式解析为人类时,首先从最低优先级运算符开始.在这种情况&&下,优先级较低++.

++a < 0 && foo
        ^^
       start

为了计算结果&&,你应该知道左操作数:

++a < 0 && ++b
^^^^^^^
so compute this

现在,当你想知道结果时++a < 0,首先看看最低优先级运算符,即<:

++a < 0
    ^
   evaluate this

为此,您需要左右操作数.所以计算它们:

++a
0

这是++a增加的时刻.

所以,现在我们处于底层.让我们回到顶端:

false && foo

这就是&&短路的事实.左操作数是假的,因此foo不再评估右操作数表达式.哪个成了:

false

没有评估右操作数.

1 个回答
  • 不,表达式的计算方式从左到右,同时考虑运算符优先级.因此,一旦在 a && ba变假,b不再被评估.

    JLS§15.23.条件和运算符&&说:

    条件和运算符&&类似于&(§15.22.2),但只有在其左侧操作数的值为真时才计算其右侧操作数.


    以下是对其工作原理的详细分步评估:

    这是因为,当您将表达式解析为人类时,首先从最低优先级运算符开始.在这种情况&&下,优先级较低++.

    ++a < 0 && foo
            ^^
           start
    

    为了计算结果&&,你应该知道左操作数:

    ++a < 0 && ++b
    ^^^^^^^
    so compute this
    

    现在,当你想知道结果时++a < 0,首先看看最低优先级运算符,即<:

    ++a < 0
        ^
       evaluate this
    

    为此,您需要左右操作数.所以计算它们:

    ++a
    0
    

    这是++a增加的时刻.

    所以,现在我们处于底层.让我们回到顶端:

    false && foo
    

    这就是&&短路的事实.左操作数是假的,因此foo不再评估右操作数表达式.哪个成了:

    false
    

    没有评估右操作数.

    2023-02-07 18:23 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有