为什么此代码的结果为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);
}
}
答案 0 :(得分:9)
b = !b
将b
从true
更改为false
,反之亦然。
if (b = !b)
被分配true
,则 b
评估为true
。
因此,运行此条件的循环是b
从false
到true
的替代,并且还会替换if
条件的结果。
答案 1 :(得分:5)
虽然其他人已经提供了答案,但我会尝试深入解释这里发生的事情。
当你这样做时:
if(b = !b)
如果b
为true
,则表达式将评估为true
,并且将满足if条件。
请参阅JLS:
在运行时,赋值表达式的结果是值 分配后的变量。
但在下一次迭代中,b
将为false
,然后条件将无法满足,因为赋值运算符将返回false
。
值得一提的是,强烈建议使用{
和}
,即使是一行代码。
答案 2 :(得分:2)
您在if语句中使用赋值运算符:
if (b = !b) i++;
表达式
b = !b
包含赋值运算符(=)而不是比较(==)。分配给b一个新值!b并返回该新值。
现在问题是你想做什么。您当前的代码将继续切换b的值。当然,在这里使用比较总是返回false(b ==!b),所以这也没用。