代码之家  ›  专栏  ›  技术社区  ›  Ankit Mishra

C++中的和运算符参数求值[重复]

c++
  •  0
  • Ankit Mishra  · 技术社区  · 9 年前

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

    这是密码

    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(循环实用程序) 对于 0 ,第一个 3. 中的值 记录堆栈 结果证明是真的。如果第二个表达式也在 if语句 。因为呼叫 节点2 将达到其 子级0 。但由于循环从0开始,0已被访问,因此 记录堆栈[0 ]应初始化为false。但这并没有发生,所有这些都是事实。仿佛 条件一遇到就终止 已访问[0] 说真的,甚至不打电话 isCyclicUtil(0,已访问,recStack )再次。

    1 回复  |  直到 9 年前
        1
  •  2
  •   jtbandes    9 年前

    这是正确的。这被称为 short-circuiting 并且是许多编程语言的特征。