プロが教える店舗&オフィスのセキュリティ対策術

strに格納されている文字数を数えるプログラムです。

#include<stdio.h>

int rstrlen(char *);

int main(void)
{
char str[] = {"abcdefghijk"};
printf("文字数:%d\n",rstrlen(str));
return 0;
}
int rstrlen(char *p)
{
if(*p) {
p++;
printf(p);
return 1 + rstrlen (p);
}
elsereturn 0;
}

return 1 + rstrlen (p);の部分で再帰をし1をプラスすることにより文字数をカウントしmainのprintfで文字数を表示しているのですがカウントしている値はどこに格納していてどのようにmainに返しているのかが分かりませんでした。教えてください。

A 回答 (2件)

rstrlen("abc")


→ (1 + rstrlen("bc"))
→ (1 + (1 + rstrlen("c")))
→ (1 + (1 + (1 + rstrlen("")))
→ (1 + (1 + (1 + (0))))
→ (1 + (1 + (1 + 0)))
→ (1 + (1 + (1)))
→ (1 + (1 + 1))
→ (1 + (2))
→ (1 + 2)
→ (3)
→ 3

()が付くのがコール,外れるのがリターンです。
カウントしている値は関数の中に格納されていると言えなくもない。
    • good
    • 0
この回答へのお礼

ありがとうございました。
初心者の私にも大変わかりやすい説明でした。

お礼日時:2004/09/28 19:13

問題の関数は


int rstrlen(char *p){ ・・・ }
と定義されていますよね。
強いて言うならば、値はこの「int」の部分に格納されています。
関数は、void定義されているのでなければ、戻り値を格納するための
領域を一つ持っています。この関数の場合は「int」つまり整数値を
格納するための領域を一つ持っているわけです。具体的にどこに
置かれるかは処理系に依存します。
関数が別の関数を呼ぶ場合、この値はスタックと呼ばれる領域に
退避されます。(最初からスタックに置かれている場合もあります。)
関数から戻った時は、その関数の戻り値領域の値と、スタックに退避
されていた値とから、あらためて変数や戻り値の値を格納し直します。
そのようにして、最終的にmainにまで値が返されるわけです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!