int it=9, at=9;
if(it>4 || ++at>10 && it>0)
{
System.out.print("stuff");
}
System.out.print(at);
打印出stuff9,我想知道为什么,因为我以为++at>10 && it>0
将首先评估,从而使在= 10为什么“或”在“和”之前?
int it=9, at=9;
if(it>4 || ++at>10 && it>0)
{
System.out.print("stuff");
}
System.out.print(at);
打印出stuff9,我想知道为什么,因为我以为++at>10 && it>0
将首先评估,从而使在= 10为什么“或”在“和”之前?
运算符优先级只控制参数分组;它对执行顺序没有影响。在几乎所有情况下,Java的规则都表示语句从左到右执行。的||
和&&
优先使if
控制要计算的表达式作为
it>4 || (++at>10 && it>0)
但&&
更高的优先级并不意味着&&
首先得到评价。相反,
it>4
进行评估,并且由于它是真的,的||
短路行为意味着右手边是不是在所有的评估。
您的复合式等同于
if(it>4 || (++at>10 && it>0))
由于Java的操作优先规则。 ||
的操作数从左到右评估,所以it>4
首先被评估,即true
,因此它的其余部分(整个&&
子表达式)根本不需要评估(因此at
不会更改)。
我觉得我应该添加如何实际获得您的预期输出。
简要说明:||
运算符short-circuits整个表达式,因此右侧甚至没有被评估。
但是,到不短路,让你的预期产出,而不是||
操作,只需使用|
,就像这样:
int a = 9, b = 9;
if(a>4 | ++b>10 && a>0)
{
System.out.print("stuff");
}
System.out.print(b);
的输出是stuff10
这不管一方是否真实,他们都仍然被评估。
同样的事情也适用于&&
和&
除此之外,这是一个很好的问题。我不明白为什么它是downvoted。 –
@mikeyaworski - “走在前面”对于OP的要求并不完全合理。这一切都涵盖在任何一半体面的Java教科书或教程中。 –
@StephenC很多问题都可以在书或教程中得到解答。他在使用和之前的知识,但没有意识到短路导致了意想不到的输出。我认为这是一个公平的调查,不管短路是否在书中。人们可能仍然会想到他对这些知识的看法。 –