如果第一条语句错误,则第二条语句中的两个条件成立?

如果第一条语句错误,则第二条语句中的两个条件成立?

问题描述:

好的,所以我测试了这段代码,发现没有任何异常抛出。如果第一条语句错误,则第二条语句中的两个条件成立?

public static void main(String[] args) { 
    int[] list = {1,2}; 
    if (list.length>2 && list[3] == 2){ 
     System.out.println(list[1]); 
    } 
} 

在这里所做的

if (list.length>2 && list[3] == 2) 

的声明意味着如果第一个条件是假的,我们甚至没有检查第二个条件?

或者它等于

if (list.length>2){ 
    if (list[3] == 2){ 
     ... 
    } 
} 

而且,如果它是用C或Python或其他语言编写的呢?

感谢

+1

你的两种方式是相同的 –

+2

Java遵循http://en.wikipedia.org/wiki/Short-circuit_evaluation(短路评估)来验证该表达式 – Vasu

+1

短路评估让您可以评估长期合法的条件因为第一个条件是合法的。你会经常看到这样'如果代码(字符串!= NULL && string.length减> 5)' –

它是语言(Java和Python是其中之一),以评估的逻辑AND第一个参数,完成语句的评价,如果第一个参数是false常见。这是因为:

The Order of Evaluation of Logic Operators从,

当爪哇计算表达式d = B & &Ç;,它首先检查是否b为真。这里b为假,所以B & & c必须是假的,无论C是否是或不是真的,所以Java不打扰检查c的值。

这被称为short-circuit evaluation,在Java docs也被称为。

这是经常可以看到list.count > 0 && list[0] == "Something"检查列表元素,如果它存在。


还值得一提的是,if (list.length>2 && list[3] == 2)等于第二种情况

if (list.length>2){ 
    if (list[3] == 2){ 
     ... 
    } 
} 

,如果有一个else之后。 else仅适用于它附加的if声明。

为了证明这一点疑难杂症:

if (x.kind.equals("Human")) { 
    if (x.name.equals("Jordan")) { 
     System.out.println("Hello Jordan!"); 
    } 
} else { 
    System.out.println("You are not a human!"); 
} 

会达到预期效果,但

if (x.kind.equals("Human") && x.name.equals("Jordan")) { 
    System.out.println("Hello Jordan!"); 
} else { 
    System.out.println("You are not a human!"); 
} 

还会告诉任何人谁不Jordan他们不是人。

+1

最后一块是公平的。只有乔丹才能运行这个世界。 – TheBrenny

+0

Python('&','|')**的按位运算符不支持短路。但是,下面的Python **运算符会执行**:'和','或','any','all' – anilbey

是。如果第一个条件不满足,则不评估其余条件。这被称为短路。有关更多详细信息,请参阅here。请注意,这不是Java特有的,许多其他语言也会这样做。

是的,两种用法在语义上是等价的...... 也就是说,除非长度大于2,那么代码是否允许访问多于第二个元素。

在第一种情况下,重要的是在&&运营商,认为它是: 如果第一个条件为真然后应用第二个条件。

随后的条件也有一个隐式 “然后” 子句

if length greater than two 
then access third element 

右键从的Javadoc:

的条件运算符

的& &和||操作符对两个布尔表达式执行条件AND和条件OR操作。这些运算符展示 “短路”行为,这意味着第二个操作数是 仅在需要时进行评估。

& & Conditional-AND ||有条件-OR

如果第一个条件是假,那么它不会检查第二个条件是什么& &˚F= F 再次这取决于它咬你在做明智的操作。 像OR(||)的情况下,如果第一个条件为真(T)它不会检查第二个条件|| T = t,但如果它的假(F),那么它肯定会检查第二

你在你的IF语句已指定了要执行的的System.out.println两个条件应该是真实的。所以如果第一个条件本身失败,第二个条件不会被检查(这是AND运算符)。但是如果您在If语句中指定了OR运算符,则会触发第二个条件。