Java中的OR运算符

时间:2014-02-24 06:48:52

标签: java operators

这是一个面试问题的“计数和说出”问题,我正在尝试使用以下代码来解决它:

public static String countAndSay(int n) {
    char[] c = new char[] { '1' };
    StringBuffer buffer = null;
    for (int i = 1; i < n; i++) {
        buffer = new StringBuffer();
        int start = 0; 
        int len = c.length;
        for (int j = 1; j <= len; j++) {
            if (j == len || c[j] != c[start]) {
                buffer.append(j - start);
                buffer.append(c[start]);
                start = j;
            }
        }
        c = buffer.toString().toCharArray();
    }
    return new String(c);
}

public static void main(String[] args) {
    System.out.println(countAndSay(2));
}

这是问题的描述: count-and-say序列是整数序列,开头如下: 1,11,21,1211,111221,......

1作为“一1”或11读出.11作为“两个1”或21读出.21作为“一个2,然后一个1”或1211读出。给定一个整数n,生成第n序列。

这是一个可运行的代码。但是对于行if (j == len || c[j] != c[start]),如果我将其更改为if (c[j] != c[start] || j == len),则会出现错误java.lang.ArrayIndexOutOfBoundsException。我很困惑为什么两个条件的不同顺序对于OR运算符会有不同的结果。提前谢谢!

3 个答案:

答案 0 :(得分:2)

if (j == len || c[j] != c[start])
true---^              ^------Expression is NOT evaluated

 if (j == len || c[j] != c[start])
false---^             ^------Expression is evaluated

如果第一个表达式为true,那么在OR运算符

的情况下,jvm将不会检查第二个表达式

答案 1 :(得分:0)

如果第一个表达式的计算结果为“true”,那么当表达式由OR运算符

分隔时,将忽略另一个表达式

答案 2 :(得分:0)

对Or运算符进行求值,以便按从左到右的顺序计算选项,当第一个选项为true时,整个语句为true。这意味着,如果您(valid-statement || invalid-statement)valid-statementtrue,则invalid-statement永远不会被评估。