为什么执行"boolean t = true,b; b = (t || ((i++) == 0))"后"i"的值没有变化
Why does the value of "i" not change after executing "boolean t = true,b; b = (t || ((i++) == 0))"
int i = 0;
boolean t = true;
boolean f = false, b;
b = (t || ((i++) == 0));
b = (f || ((i+=2) > 0));
System.out.println(i);
上面代码执行后,打印结果是2,不是3,为什么?
我发现 "i" 在 debuging.Well 执行 "b = (t || ((i++) == 0))" 之后是 0 而不是 1,我很困惑为什么 "i++" 没有改变 "i"。
Well,I'm confused why "i++" not changes "i".
因为i++
没有在您提供的代码中执行。
在 a || b
形式的表达式中,首先计算 a
,如果为真(在本例中为真),则表达式 b
未 评估。这被称为短路。
这在 JLS section 15.24 中有描述。
如果您更改代码以改用非短路 |
运算符,如下所示:
b = (t | ((i++) == 0));
...然后它将计算两个操作数,而不管。
int i = 0;
boolean t = true;
boolean f = false, b;
b = (t || ((i++) == 0));
b = (f || ((i+=2) > 0));
System.out.println(i);
上面代码执行后,打印结果是2,不是3,为什么?
我发现 "i" 在 debuging.Well 执行 "b = (t || ((i++) == 0))" 之后是 0 而不是 1,我很困惑为什么 "i++" 没有改变 "i"。
Well,I'm confused why "i++" not changes "i".
因为i++
没有在您提供的代码中执行。
在 a || b
形式的表达式中,首先计算 a
,如果为真(在本例中为真),则表达式 b
未 评估。这被称为短路。
这在 JLS section 15.24 中有描述。
如果您更改代码以改用非短路 |
运算符,如下所示:
b = (t | ((i++) == 0));
...然后它将计算两个操作数,而不管。