虽然控件没有进入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";
}
答案 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,所以期望这同样是愚蠢的。当你知道行为未定义时,任何期望都是愚蠢的。