2016-05-16 13 views
0

私はいくつかの再帰的な関数を使ってコーディングしている間、いくつかの問題を抱えることに疑問を抱いています。今ここでは、ネストされた関数呼び出しで簡単なコードを与えているので、私の正確な問題を指摘することができます。どのようにreturn文がネストされた関数呼び出しで処理されますか?

int main(void) 
{ 

    int i; 
    i=a(); 
    printf("%d\n",i); 
    return 0; 
} 
int a() 
{ 
    return b(); 

} 
int b() 
{ 
    return 9; 
} 

も、全く問題は、それがとして出力を与えません。私のように機能a()を再定義した場合でも:

int a() 
{ 
b(); 
int new=0; //not significant 
} 

私はreturn私はコンパイルエラーを取得していなかったキーワード、どちらの値を削除しても再びそれが、ここに

9

を有効な出力、.IEを生成します出力のiが間違っていた...(私はゴミなどを期待していた)。 これらのものはどのように処理されますか?

+0

重複する質問ではありません。私の問題は、他の戻り値の型の問合せや問題とは若干異なります。 – RahulCoffee

+1

@RCoffee:申し訳ありませんが、選択した複製は、修正されたコードを正確に反映しています。動作は未定義です。結果はOKで、あなたの肩をすくめて "ああ"と言う以外の結果を説明する方法はありません。 –

+0

あなたが指摘したことは非常に論理的であるため、私はあなたのans @ CodeBatmanを受け入れています。しかし、私はgcc(私はFedoraを使用しています)とdev C++を試してみました。どちらも関数b()から返ってきたものを出力しています。 – RahulCoffee

答えて

0

コードの2番目の作品では:

int a() 
{ 
    b(); 
    int new=0; //not significant 
} 

a()の戻り値の型はintです。しかし、あなたのコードでは、何も返されません。これにより、通常はundefined behaviorになります。だから、あなたは何か価値があるかもしれません(あなたは9を得ていると言っていますが、理想のgccを使っていますが、私はgetting 0です)。これは未定義の動作なので、誰もあなたが得るものを正確に言うことはできません。

SO Answerで指摘されているように、コンパイラによって異なりますが、コンパイラは何が起こったかを文書化する義務はなく、戻り値の一貫性も要求されません。異なる呼び出しによって異なる値が返されることがあります。

関連する問題