0
emp* emp::check(string a,emp* ceo)
{
   emp* l;
   employee* b;
   l=ceo;
   if(l->name==a)
   {
    cout<<l->name;
    return l;
   }
   b=l->j;
   while (b!=NULL)
   {
      check(a,b->junior);
      b=b->next;
   }
}

void main()
{
   l = check(d,ceo);
   cout<<l->name;
}

現在、最初は の値l->nameが出力されていますが、最終的に のmain値はl返されていません。
これは、returnステートメントに到達してlいるが返されていないことを意味します。
誰かが理由を説明できますか?

4

1 に答える 1

3

何が起こっているかというと、これは再帰呼び出しの 1 つで一致しcheck、戻り値を破棄します。関数を次のように変更する必要があります。

emp* emp::check(string a,emp* ceo)
{
   emp* l;
   employee* b;
   l=ceo;
   if(l->name==a)
   {
    cout<<l->name;
    return l;
   }
   b=l->j;
   while (b!=NULL)
   {
      l = check(a,b->junior); // <----- line changed
      if (l)
         return l;            // If we found something, return it. 
      b=b->next;
   }

   return 0; // <----- Always return a value
}

また、コードにはさまざまなスタイル上の問題があります。変数名と関数名が役立つように、次のような変更を加えた場合はより明確になります。

emp* emp::findEmployeeByName(string name,emp* root)
{
   if(root->name==a)
   {
    cout<<root->name;
    return root;
   }

   // What on earth is ->j? Give your members meaningful names
   for (employee* worker=l->j; worker; worker = worker->next)
   {
      emp* match = findEmployeeByName(name,worker->junior); // <----- line changed
      if (match)
         return match;            // If we found something, return it. 
   }

   return 0; // <----- Always return a value
}
于 2013-09-08T08:32:56.923 に答える