在Java中,为什么b的输出在这种情况下不改变?是否可能使用;或;让它只审理第一个案件?

在Java中,为什么b的输出在这种情况下不改变?是否可能使用;或;让它只审理第一个案件?,java,if-statement,Java,If Statement,这是代码,我对输出很困惑 public static void main(String[] args) { int a = 1; int b = 1; for (int c = 0; c < 5; c++) { if ((++a > 2) || (++b > 2)) { a++; } } System.out.println(a + " " + b); } publicstat

这是代码,我对输出很困惑

public static void main(String[] args) {
    int a = 1;
    int b = 1;

    for (int c = 0; c < 5; c++) {
        if ((++a > 2) || (++b > 2)) {
            a++;

        }
    }
    System.out.println(a + " " + b);
}
publicstaticvoidmain(字符串[]args){
INTA=1;
int b=1;
对于(int c=0;c<5;c++){
如果(++a>2)| |(++b>2)){
a++;
}
}
系统输出打印项次(a+“”+b);
}
输出为102


然而,为什么a总是可以改变而b保持不变?

|
是一个短路运算符

因此,如果第一个操作数
(++a>2)|(++b>2)
为false,则
将只计算第二个操作数
(++b>2)


一旦
a
达到3,
b
不再递增。

如果
短路,则
内的
表达式。计算以下表达式时:

(++a > 2) || (++b > 2)
只有当
a
术语为
false
时,才对
b
术语进行评估


在第一次迭代中,
a
项失败,并对
b
项进行评估。在第一次迭代之后,
a
b
都等于
2
。对于每个后续迭代,
a
项始终为真,而
b
项甚至从未计算过。

|是短路运算符 这意味着如果第一个条件为true,它将不会检查第二个条件,因为or语句只需要一个true条件 所以第一次“++a=2”,这不是>2,所以它是假的 所以它检查第二个条件++b=2 然后“++a=3”,它大于2,所以它是真的,所以它不会检查第二个条件 当“a=4到10”时相同

因此,如果你想让它检查b,你也必须从

if ((++a > 2) || (++b > 2)) 


您可以调试程序以跟踪
a
b
变量,并在每次迭代中准确地获得发生的情况:

a=1 ; b=1;
当逻辑运算符为
|
时,如果编译器发现第一个操作数
为false
,他将转到下一个操作数进行检查,这样
++a
++b
都将在第一次迭代中执行,因此
a=2;b=2

现在,下一次迭代编译器发现第一个操作数
a=3
true
,它将不会去下一个操作数检查它,因此
b
的值不会增加
1
并保持
b=2

a=3; b=2;
下一步,同样以同样的方式启动,直到循环结束,这样您将获得输出:

a=10
b=2
检查此程序以了解操作员的工作方式:

    int a = 1;
    int b = 1;
    int d = 1;
    for (int c = 0; c < 5; c++) {
        if ((++a > 2) || (++b > 2) || (++d > 2)) {
            a++;  
        }
    }
下一次迭代
c=2
变量为:

a =2 
b =2 
d =2
a=4
b=2
d=2
a=6
b=2
d=2
在此迭代中,编译器将只检查第一个操作数
a=3
,即
true
,而不会检查其他操作数,因此其值将保持不变
b=2
d=2

下一次迭代
c=3
变量为:

a =2 
b =2 
d =2
a=4
b=2
d=2
a=6
b=2
d=2
依此类推,直到循环输出结束:

a=10
b=2
d=2 

这是因为环境或条件。如果左侧的一个表达式被赋值为true,则表达式的其余部分不会被赋值。我不建议使用后者,因为这可能会让读者感到困惑。如果您真的想增加这两个变量,只需这样做:
a++;b++;如果(a>2 | | b>2).
。你不会因为把所有的东西都塞进一行而得到分数。我知道,但当我这样回答时,他不会知道如果他将来需要第二个条件,他将如何访问第二个条件。所以“|”也意味着或者,但它不是一个短路运算符?是的,它与&&&不一样,你能更具体一点吗?如果有人好奇,“[| |]只在其左侧操作数的值为false时才计算其右侧操作数。”@NewUser我不知道为什么这两个用户会投反对票,但我猜这是因为Tim和Eran更愿意回答而不是作为重复结束。埃兰在任何可能的情况下都以务农而闻名,但蒂姆·梅应该更清楚这一点。顺便说一句,“无论如何,投票反对反对票。”是一个不好的投票理由。对答案进行投票,如果你喜欢,不要“不适当地”进行其他投票。@Tom如今许多农场声誉不佳的部分原因是网站上出现了大量糟糕的Java问题。这个问题虽然很可能是某个问题的重复,但相对来说还是不错的,因此有那么多人试图给出答案。@TimBiegeleisen问题的质量决定了你是投赞成票还是反对票,但投票结束取决于这个问题是否是可回答的,而不是重复的。如果一个人不在乎最后一个,那么他仍然可以回答,但其他人可能不喜欢这种行为。顺便说一句,“很多人”:有4个答案。2人是在这个网站有经验的人(这些答案有反对票),2人是没有太多经验的人(根据他们的代表判断),他们没有反对票。也许是巧合?或者选民们对你和埃兰的期望更高。@NewUser你可能想检查一下。这两个网站都是用来讨论堆栈溢出(第一个链接)或堆栈交换(第二个链接)。你可以通过搜索“帮助吸血鬼”(问不好的问题而不关心质量或本网站的人)和“rep farming”(还有另一个名字,不能写在评论中)(做一些事情只是为了提高声誉的人)来找到一些有用的问题。在这个问题上,如果我们有什么样的情况,每个人都可以自己决定。