1

这是我的一个课程中的一段代码:

public void run() {  

    SomeClass[][] someClassArray = new SomeClass[6][];  
    someClassArray[0] = new SomeClass[1];  
    someClassArray[1] = new SomeClass[4];  
    someClassArray[2] = new SomeClass[16];  
    someClassArray[3] = new SomeClass[64];  
    someClassArray[4] = new SomeClass[256];  
    someClassArray[5] = new SomeClass[1024];

    someFunction(0,0); 
}

someFunction(int i, int j) {  
    if(i == 5) {  
        someClassArray[i][j].flag = test(i,j); // BASE CASE  
    }  
    else {  
        if(someFunction(someClassArray(i+1,j*4))  
                && someFunction(someClassArray(i+1,j*4+1))  
                && someFunction(someClassArray(i+1,j*4+2))  
                && someFunction(someClassArray(i+1,j*4+3)))  
            someClassArray[i][j].flag = true;  
        else  
            someClassArray[i][j].flag = false;  
    }  

    return someClassArray[i][j].flag;
}


class SomeClass {  

        boolean flag;  
        // other stuff  
}  

boolean test(int i, int j) {  

        // test some property of this coordinate  
}  

本质上,我想要的是仅当下一个数组级别中的四个相应对象的标志也为真时,才将一个 SomeClass 对象的标志设置为真。不幸的是,我似乎遇到了这个问题:

if(someFunction(someClassArray(i+1,j*4))  
&& someFunction(someClassArray(i+1,j*4+1))  
&& someFunction(someClassArray(i+1,j*4+2))  
&& someFunction(someClassArray(i+1,j*4+3)))  

看起来它只是检查第一个条件(我在计数器中添加了所以检查 someFunction 被调用了多少次,它只上升到 6,而不是我应该得到的 1365);您不能在 Java 中的 if 语句中执行多个函数调用吗?还是我做错了?

(顺便说一下格式,这是我第一次在这里发帖)

4

2 回答 2

4

操作数&&||是所谓的短路运算符。这意味着如果结果已知,它们所在的逻辑将立即停止执行。

在您的情况下,这可能意味着第一次调用的结果SomeFunctionfalse. 因为您在那条线上只有 AND,所以结果不可能true再有,因此您的其他 3 个调用SomeFunction不会被执行。

底线:将 更改&&&,这不会短路并且所有调用都将被执行。

于 2011-04-08T21:39:33.477 回答
2

如果条件从第一个函数调用中明确,则可以将其短路。

于 2011-04-08T21:36:35.290 回答