增量和减量不起作用

时间:2014-07-13 11:15:16

标签: java

为什么此代码的结果为0和1?有人可以解释一下这段代码吗?

如何在if (b = !b)true之间更改条件结果:false

代码:

public class Atomicity extends Thread {
    volatile static int i;
    boolean b;

    public void run() {
        while (true) {
            if (b = !b) i++;
            else i--;
        }
    }

    public static void main(String[] args) {
        //new Atomicity().start();
        new Atomicity().start();

        while (true)
            System.out.println(i);
    }
}

3 个答案:

答案 0 :(得分:9)

b = !bbtrue更改为false,反之亦然。

如果if (b = !b)被分配true,则

b评估为true

因此,运行此条件的循环是bfalsetrue的替代,并且还会替换if条件的结果。

答案 1 :(得分:5)

虽然其他人已经提供了答案,但我会尝试深入解释这里发生的事情。

当你这样做时:

if(b = !b)

如果btrue,则表达式将评估为true,并且将满足if条件。

请参阅JLS

  

在运行时,赋值表达式的结果是值   分配后的变量

但在下一次迭代中,b将为false,然后条件将无法满足,因为赋值运算符将返回false

值得一提的是,强烈建议使用{},即使是一行代码。

答案 2 :(得分:2)

您在if语句中使用赋值运算符:

if (b = !b) i++;

表达式

b = !b

包含赋值运算符(=)而不是比较(==)。分配给b一个新值!b并返回该新值。

现在问题是你想做什么。您当前的代码将继续切换b的值。当然,在这里使用比较总是返回false(b ==!b),所以这也没用。