2014-05-13 38 views
4
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为什么“或”在“和”之前?

+0

除此之外,这是一个很好的问题。我不明白为什么它是downvoted。 –

+1

@mikeyaworski - “走在前面”对于OP的要求并不完全合理。这一切都涵盖在任何一半体面的Java教科书或教程中。 –

+0

@StephenC很多问题都可以在书或教程中得到解答。他在使用和之前的知识,但没有意识到短路导致了意想不到的输出。我认为这是一个公平的调查,不管短路是否在书中。人们可能仍然会想到他对这些知识的看法。 –

回答

14

运算符优先级只控制参数分组;它对执行顺序没有影响。在几乎所有情况下,Java的规则都表示语句从左到右执行。的||&&优先使if控制要计算的表达式作为

it>4 || (++at>10 && it>0) 

&&更高的优先级并不意味着&&首先得到评价。相反,

it>4 

进行评估,并且由于它是真的,的||短路行为意味着右手边是不是在所有的评估。

9

您的复合式等同于

if(it>4 || (++at>10 && it>0)) 

由于Java的操作优先规则。 ||的操作数从左到右评估,所以it>4首先被评估,即true,因此它的其余部分(整个&&子表达式)根本不需要评估(因此at不会更改)。

0

我觉得我应该添加如何实际获得您的预期输出。

简要说明:||运算符short-circuits整个表达式,因此右侧甚至没有被评估。

但是,到短路,让你的预期产出,而不是||操作,只需使用|,就像这样:

int a = 9, b = 9; 

if(a>4 | ++b>10 && a>0) 
{ 
    System.out.print("stuff");  
} 
System.out.print(b); 

的输出是stuff10

这不管一方是否真实,他们都仍然被评估。

同样的事情也适用于&&&

从变量名
相关问题