2017-05-10 12 views
-6

コントロールがあれば条件isCyclic()関数には行っていないが、それでも、それは私がリターン0のステートメントのコメントを外した場合、それは確かにそう0なぜこの関数は1を返しますか?

を返して1を返して、int型の機能をしていますがデフォルトで1を返しますか?私はそうは思わない。ガベージ値を返します。しかし、なぜそれがここ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"; 
} 
+1

1はゴミ値です。 – InternetAussie

+0

あなたは '#include 'を使うべきではありません。必要な '#include'を使います。 – mch

答えて

3

したがって、int関数はデフォルトで1を返しますか?

号には、デフォルトの戻り値はありません(デフォルトでは0を返すmain、を除く。)

これは、ガベージ値を返します。

正しい。より正確に:プログラムの動作は未定義です。

しかし、なぜそれがここ1を返すのですか?

動作が定義されていないためです。

"ゴミ"の価値が何を意味するのか誤解していると思います。ゴミは何らかの価値を持つことができます。 1がセット「任意の値」内にあります。

ただし、毎回PCごとに1回戻っています!

動作が定義されていないためです。標準では、いかなる場合でも戻り値が1以外であることを保証するものではありません。それで、なぜ関数が1を返さないと思いますか?もちろん、戻り値が1であることを保証するものではないので、それも同じように愚かであると予想します。あなたの行動が未定義であることを知っているならば、どんな期待も愚かではないでしょう。

+0

ええ、私は同意しますが、毎回すべてのPCで1を返しています! –

+0

@AshutoshMaheshwari編集を参照してください。 – user2079303

2

そして、1つの完璧な "ごみ値"ではありませんか? §6.6.3/2で

C++11ドラフト状態:

機能の端を流れる[...]の値を返す関数で未定義の動作をもたらします。

「未定義の動作」は、基本的に「何かが起こる」ことを意味します。あなたが "int"を返す関数を持っていても返さない場合は、現在メモリに置かれているものを返します。それは、0,1、12345、またはあなたが考えることができる他のゴミ値になります。

関数が終了できるすべてのコードフローにreturnステートメントを追加する必要があります。パラメーター-Wreturn-typeを使用すると、将来これらの問題についてコンパイラーが警告することができます。

+0

毎回毎回1枚ずつPC復帰中!! –

+0

だから何ですか?それは許可されています。「未定義」は「ランダム」を意味するものではありません。それはできますが、そうする必要はありません。特定の結果が必要な場合は、「return」で定義し、必要な戻り値を追加します。 –

関連する問題