为什么这个函数返回1?

时间:2017-05-10 07:04:33

标签: c++ function graph return return-value

虽然控件没有进入isCyclic()函数中的if条件,但它仍然返回1.当我取消注释返回0语句时,它确实返回0。

那么,int函数默认返回1吗?我不这么认为。它返回垃圾值。但那么为什么它会在这里回归!!!

#include <bits/stdc++.h>

using namespace std;

class edge{
public:
    int src,des;
};

class graph{
public:
    int v,e;
    edge *edges;
    int edges_counter;
    graph(int v, int e){
        this->v = v;
        this->e = e;
        edges = new edge[e];
        edges_counter = 0;
    }
    void addedge(int src, int des){
        edges[edges_counter].src = src;
        edges[edges_counter].des = des;
        edges_counter++;

    }

    int find(int parent[], int i){
        if(parent[i]==-1)
            return i;
        return find(parent, parent[i]);
    }

    void Union(int parent[], int x, int y){
        parent[x] = y;
    }

    int isCyclic(){
        int parent[v];
        for(int j=0; j<v ;j++) parent[j] = -1;

        for(int i=0; i<e; i++){

            int first = find(parent, edges[i].src);
            int second = find(parent, edges[i].des);

            if(first==second){
                cout <<"Hell";
                return 1;
            }

            Union(parent, first, second);

        }
        //return 0; //here
    }
};

int main(){
    graph g(3,2);
    g.addedge(0, 1);
    g.addedge(0, 2);
    cout << g.isCyclic() << endl;
    if(g.isCyclic()==1) cout << "Grpah contains cycle\n";
    else cout << "Grpah doesn't contain cycle\n";
}

2 个答案:

答案 0 :(得分:2)

并不是一个完美的“垃圾价值”?

§6.6.3/ 2中的C++11草案规定:

  

在函数结束时流出[...]会导致值返回函数中出现未定义的行为。

“未定义的行为”基本上意味着“任何事情都可能发生”。如果你有一个函数返回“int”,但你没有返回,它将返回当前在内存中存在的任何内容。那可能是0,1,12345,或者你能想到的任何其他垃圾值。

您应该为您的函数可能结束的每个可能的代码流添加一个return语句。您可以使用参数 -Wreturn-type 使编译器在将来警告您这些问题。

答案 1 :(得分:2)

  

那么,int函数默认返回1吗?

没有。没有默认返回值(main除外,默认返回0.)

  

返回垃圾值。

正确。更正确:程序的行为未定义。

  

但是为什么它会在这里返回1 !!!

因为行为未定义。

我认为你误解了什么&#34;垃圾&#34;价值意味着垃圾可以有任何价值。 1在集合中,任何值&#34;。

  

但是每次在每台PC上都返回1 !!

因为行为未定义。该标准不保证在任何情况下返回值不是1。考虑到这一点,为什么你会期望函数不返回1?当然,它也不能保证返回值为1,所以期望这同样是愚蠢的。当你知道行为未定义时,任何期望都是愚蠢的。