質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

455閲覧

このc言語プログラムの動作の仕組みについて

begginer_prog

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2021/07/18 07:13

編集2021/07/18 07:18

疑問点

初学者です。c言語の簡単なコードなのですが、動作がいまいちよく理解できません。出力結果のstartが表示される前半部分はわかるのです、後半のendの部分がなぜ、0から5まで増えていくのでしょうか? サンドイッチにように外側から内側に向けて出力されていくからだと思っているのですが、合っているでしょうか?

該当のソースコード

c

1#include <stdio.h> 2#include <stdlib.h> 3 4void func(int n,int arg) 5{ 6 printf("func(%d,%d): start\n",n,arg); 7 if (n > 0){ 8 func(n-1,arg); 9 } 10 printf("func(%d,%d): end\n",n,arg); 11} 12int main(int argc, char **argv) 13{ 14 int arg; 15 if (argc < 2) 16 return 1; 17 arg = atoi(argv[1]); 18 func(5,arg); 19 return 0; 20}

試したこと

func(5,1): start
func(4,1): start
func(3,1): start
func(2,1): start
func(1,1): start
func(0,1): start
func(0,1): end
func(1,1): end
func(2,1): end
func(3,1): end
func(4,1): end
func(5,1): end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javahack

2021/07/18 07:17

後半のendの部分は0から5まで"増えていく"の間違いでは?
begginer_prog

2021/07/18 07:18

ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

後半のendの部分がなぜ、0から5まで増えていくのでしょうか

start と end の表示は func の最初と最後にありますが、間に func の(再帰)呼び出しがあります。
ということは、end は その(再帰)呼び出しから戻ってからでないと表示されません。
start が 5→0 となるということは、 func の(再帰)呼び出しが戻る順番は 0→5 です。
ですので end の表示はそのようになります。

その確認には、例えば次のように再帰する関数をコピペで必要なだけ並べ、それぞれ別の関数を呼ぶようにします。この場合は func→funcA→funcB→… ですね。
表示にも ABC を付けて置けば、どのような動作になるかが分かり易いかと思います。

c

1void funcE(int n,int arg) 2{ 3 printf("funcE(%d,%d): start\n",n,arg); 4 if (n > 0){ 5 //funcE(n-1,arg); 6 } 7 printf("funcE(%d,%d): end\n",n,arg); 8} 9void funcD(int n,int arg) 10{ 11 printf("funcD(%d,%d): start\n",n,arg); 12 if (n > 0){ 13 funcE(n-1,arg); 14 } 15 printf("funcD(%d,%d): end\n",n,arg); 16} 17void funcC(int n,int arg) 18{ 19 printf("funcC(%d,%d): start\n",n,arg); 20 if (n > 0){ 21 funcD(n-1,arg); 22 } 23 printf("funcC(%d,%d): end\n",n,arg); 24} 25void funcB(int n,int arg) 26{ 27 printf("funcB(%d,%d): start\n",n,arg); 28 if (n > 0){ 29 funcC(n-1,arg); 30 } 31 printf("funcB(%d,%d): end\n",n,arg); 32} 33void funcA(int n,int arg) 34{ 35 printf("funcA(%d,%d): start\n",n,arg); 36 if (n > 0){ 37 funcB(n-1,arg); 38 } 39 printf("funcA(%d,%d): end\n",n,arg); 40} 41void func(int n,int arg) 42{ 43 printf("func(%d,%d): start\n",n,arg); 44 if (n > 0){ 45 funcA(n-1,arg); 46 } 47 printf("func(%d,%d): end\n",n,arg); 48}

投稿2021/07/18 07:36

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

begginer_prog

2021/07/18 07:49

理解できました!!詳しい説明でわかりやすかったです。お手数おかけしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問