问题
int it=9, at=9;
if(it>4 || ++at>10 && it>0)
{
System.out.print("stuff");
}
System.out.print(at);
prints out stuff9 and I want to know why as I thought ++at>10 && it>0
would be evaluated first and thus make at = 10.
回答1:
Operator precedence only controls argument grouping; it has no effect on execution order. In almost all cases, the rules of Java say that statements are executed from left to right. The precedence of ||
and &&
causes the if
control expression to be evaluated as
it>4 || (++at>10 && it>0)
but the higher precedence of &&
does not mean that the &&
gets evaluated first. Instead,
it>4
is evaluated, and since it's true, the short-circuit behavior of ||
means the right-hand side isn't evaluated at all.
回答2:
Your compound expression is equivalent to
if(it>4 || (++at>10 && it>0))
due to Java operator precedence rules. The operands of ||
are evaluated left to right, so it>4
is evaluated first, which is true
, so the rest of it (the entire &&
subexpression) doesn't need to be evaluated at all (and so at
does not change).
回答3:
I feel I should add how to actually get your expected output.
Brief explanation: the ||
operator short-circuits the entire expression, thus the right side not even being evaluated.
But, to not short-circuit and get your expected output, instead of the ||
operator, just use |
, like so:
int a = 9, b = 9;
if(a>4 | ++b>10 && a>0)
{
System.out.print("stuff");
}
System.out.print(b);
The output to that is stuff10
This way, regardless of one side being true or not, they're both still evaluated.
The same thing goes for &&
and &
来源:https://stackoverflow.com/questions/23620919/why-does-the-or-go-before-the-and