以及C++中的运算符参数求值

And operator argument evaluation in C++

本文关键字:参数 运算符 C++ 以及      更新时间:2023-10-16

和运算符如何评估其参数。我有一个代码来检查一个图是否是循环的。在这段代码中,if语句中有一个和条件。我认为,就我所能理解的而言,它在第一次遇到错误表达式时终止,而根本不评估第二个表达式。

这是代码

bool Graph::isCyclicUtil(int v, bool *visited, bool *recStack){
    if (visited[v] == false){
            // Mark the current node as visited 
            visited[v] = true;
            recStack[v] = true;
            // Recur for all the vertices adjacent to this vertex
            list<int>::iterator i;
            for (i = adj[v].begin(); i != adj[v].end(); i++){
     -------->**This and cond**if (!visited[*i] && isCyclicUtil(*i, visited, recStack))
                            return true;
                    else if (recStack[*i])
                            return true;
            }
    }
    recStack[v] = false;    // remove the vertex from the recursion stack
    return false;
}
void Graph::printRecStack(bool *recStack){
    cout << "n n";
    for (int i = 0; i < V; i++){
            if (recStack[i])
                    cout <<i<< "n";
    }
    return;
}

bool Graph::isCyclic(){
    // Mark all the vertices as not visited and not part of recursion stack
    bool *visited = new bool[V];
    bool *recStack = new bool[V];
    for (int i = 0; i<V; i++){
            visited[i] = false;
            recStack[i] = false;
    }
    // Call the recursive helper function to detect cycle in different
    // DFS trees.
    if (isCyclicUtil(0,visited, recStack)){
            printRecStack(recStack);
            return true;
    }
    /*for (int i = 0; i < V; i++){
            if (isCyclicUtil(i, visited, recStack))
                    printRecStack(recStack);
                    return true;
    }*/
    return false;
}

请观察isCyclicUtil函数中if语句内部的和条件。

如果你把一个简单的图作为一个测试用例,比如这个:

0->1
1->2
2->0
2->3
3->3

并且调用isCyclicUtil对于0recStack//strong>中的第一个<1>值为true。如果第二个表达式也在if语句中求值,则情况不应该如此。因为对节点2的调用将到达其子节点0。但由于循环从0开始,0已经被访问,因此recStack[0]应该初始化为false。但这并没有发生,所有这些都是真的。就好像条件在遇到visited[0]时立即终止为真,甚至没有再次调用isCyclicUtil(0,visited,recStack[/strong>)。

这是正确的。这被称为短路,是许多编程语言的一个特点。