[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:45 / Filesize : 237 KB / Number-of Response : 985
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 23



1 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 12:49:22 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 22
pc11.2ch.net/test/read.cgi/tech/1196489491/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 101
pc11.2ch.net/test/read.cgi/tech/1197132472/

369 名前:デフォルトの名無しさん [2007/12/30(日) 00:30:44 ]
>>366
本気で言ってるんすか?
知人の凄い人でもATMなのに人工衛星とかの制御プログラムとか次元が違いすぎる

370 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:32:40 ]
最近、どっかの団体のコーディングルールとか見ると、ポインタの演算禁止とか、
ポインタのポインタらしい使いかたはしないって流れになってきてるな。
じゃPascalでも使ってればいいのにって気がするけど。

371 名前:デフォルトの名無しさん [2007/12/30(日) 00:32:54 ]
ポインタがどうでも良くなってきたんで。
早くファイル操作などの場所をやりたいんですが、ページを飛ばすと複雑な気持ちになるので
ポインタのページと関数のページを仕方なくやりますか

372 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:33:22 ]
>>369
よく嫁
支援ツールだ
つまりだたの社内ツール

373 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:34:43 ]
実用的なのは作ったこと無いな、所詮娯楽用品止まり。

374 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:35:23 ]
私の書いたコードなら、世に出回っているフラッシュメモリのシェアの多くを生み出す装置の検査に使われているぜw

375 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:35:35 ]
まぁ日曜プログラマならそれでいいんじゃね?
自分の腕を仕事に活かしたいと思ったら、それはそれで地獄をみることになるし

376 名前:デフォルトの名無しさん [2007/12/30(日) 00:35:54 ]
>>372
でもすごいっすよ
C言語を始める時期が悪かったですかね
ガキの頃に手をつけとけば良かったと後悔しますよ
Cをマスターしたら次はperlかjavaやろうかと思ってるんすよ

377 名前:374 mailto:sage [2007/12/30(日) 00:36:39 ]
もっと身近なところでは、某駅ビルの駐車券発行機に使われているとか(ぉぃ



378 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:40:35 ]
去年一年くらいCの仕事をやって、医療関係のシステムだったけど、ありえないくらいコードの質が
低かったから、そのシステムを導入してる病院には行かないことにしてる。怖い。

379 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:40:58 ]
>>376
始めるのに早いも遅いもない
逆にガキのころはガキのころにすべき勉強なり体験なりをしなくちゃいけない
Cなんてただの道具にすぎんのですよ、偉い人にはそれがわからんのです

380 名前:デフォルトの名無しさん [2007/12/30(日) 00:41:44 ]
>>374
まじすか?
凄過ぎますよ、是非そういう人に基礎から教えてもらいたいんですが
まぁ無理なんでしょう、自力でやらないと意味がないし
そういうコードを書くにはCを学んでいたときに1日どのくらい書いてましたか?
あとは1日3個適当にプログラムを作るとかそういう目標とかってありましたか?

>>2373
私もそんな感じっすよ
暗号化できたーやーいって(自己満)すよね

>>375
プログラマーになったら大変そうすよね
それで食ってくのは難しいすよね

381 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:44:56 ]
プログラミングの仕事は中国やらインド勢力に取られていくし、
自動生成の流れが盛んになってきているから、
プログラミングの仕事はどんどん減っていくだろうね
現に、カードにパンチしていた時代はコーディングが開発工程の8割を占めていたのに、今では2割程度

382 名前:374 mailto:sage [2007/12/30(日) 00:46:50 ]
そう言えば某社のFAXに……あれはアセンブラだったな。
某社の検査装置に使われているのは……basicか。

てな具合にいろんな時期にいろんなことをやっていたから「Cを学んでいた(だけの)とき」なんてないよ。

383 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:47:00 ]
娯楽用品って言っても仕事なんだけどな (´・ω・`)

384 名前:デフォルトの名無しさん [2007/12/30(日) 00:48:11 ]
>>381
今の日本は開発よりかも指示とかプロジェクトの提案とかそんな感じすかね?
たしかにインドとか中国はすごいっすよね。
ロシアは凄いらしいですがどうなんでしょう。
生まれる場所を間違えたな・・・



385 名前:374 mailto:sage [2007/12/30(日) 00:48:52 ]
>>381
あー確かに、カードパンチの時代は「完全なる机上コーディング」をしたものを「パンチするだけ」だったな。
# 流石に学校で体験しただけだが

386 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:50:47 ]
NHKのワーキングプアの番組でやってたな。
アメリカで銀行のシステムをやって年収1000万のIT技術者が、インドに仕事とられてファーストフードの店でアルバイト。


387 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:53:08 ]
別にインドや中国が凄いってわけじゃなくて、単価が安いからそっちに簡単な仕事まわしてるだけだよ
難しい仕事は単価の高い日本で集中的にやる




388 名前:デフォルトの名無しさん [2007/12/30(日) 00:53:59 ]
やっぱ裕福な国は、それ以上求める物が無くて開発するレベルが低いんですか?
日曜プログラマが良いかな、本職は他ので。
パソコン詳しいねすごいねおっちゃんって言われればそれでいいかな

389 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:57:27 ]
>>387
これからはインド人や中国人の10倍の価値のある技術がないときびしいだろうね。

390 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:01:40 ]
>>388
日本を舐めすぎw
おまい、マスコミに変に影響されてるな
プログラミング力のあるなし以前に、視野の狭さが心配だよ

コーディングっていうのは単純作業なんだよ、単純作業
町工場で働く工員と同じ
指示されたものを淡々と作るだけ

じゃあ、それ以前に何をどう作るか、ってのを考えなきゃいけないよね
それを考えるのが日本の仕事

もちろん、今後すぐにプログラミングの仕事が無くなるわけじゃない
やっぱり言語や文化の壁があって、オフショア開発の管理って難しいくて、
リスクを極力避けるために、
現状は、仕様変更の激しい部分とか、重要な部分ってのは日本でコーディングしてる

391 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:03:10 ]
C/C++でポインタを使わないプログラミングが想像できない

>>380
1日3個も作れるならそいつは天才か、作ったものがゴミ箱行きのカスか

392 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:06:13 ]
とりあえずLinux上の適当なコマンドのソースでも読んでろ

393 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:08:05 ]
UNIXコマンドのソースは俺も読んだなあ。

394 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:10:12 ]
おまいはいいよ

395 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:14:42 ]
ライブラリの○○.aっていうファイルから
収録してある関数名を取り出すことって可能ですかね?
あったら教えてください

396 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:22:21 ]
>>395
nmコマンドでぐぐれ

397 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 02:32:38 ]
>>391
C++ならiteratorは別とすればポインタつかわないこと多くね?



398 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 04:17:57 ]
Java厨です。
Include文とかヘッダファイルの自動生成って出来ないもの?


399 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 05:06:09 ]
条件にもよるが不可能では無い
頑張って作ってみれば?

400 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 07:46:20 ]
>>396
どうもありがとうございました。

401 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:24:40 ]
#define DATA "data"
と、例えば定義してexeを作ったときバイナリエディタでみても"data"を文字列として見つけられません
これはどういう形で格納されていのでしようか?

402 名前:デフォルトの名無しさん [2007/12/30(日) 08:26:04 ]
たとえば、
#define SRAM_A (volatile unsigned char *)0x200000
こんなのもポインタを使っているといっていいですか?
SRAM.Hの中身は、こんなのだらけなんですけど。

403 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:33:50 ]
>>401
DATAを作っていなければコンパイラはobjに"data"を出力しない。
当然、出力されるEXEにも存在しない。

404 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:54:40 ]
>>402
それだと「アドレス」と言いたくなるけど、まぁポインタだね。

405 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:58:09 ]
>>402
組み込みなら普通は #pragma で section 名指定して、
リンカーで配置する。処理系によって違うけど
似たようなコードがあるはず。

絶対アドレスにポインタ使う必要なし。


406 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 13:24:24 ]
趣味でGBAやったときも402みたいなことばかりやったな。

407 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 14:42:25 ]
こんなマクロ定義してたな俺。
#define Acc08(Adr) (*(volatile unsigned char *)Adr)
#define Acc16(Adr) (*(volatile unsigned short *)Adr)
#define Acc32(Adr) (*(volatile unsigned int *)Adr)



408 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 14:50:02 ]
DOS 時代も VRAM 使う時にそういう事してたな。

409 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 17:04:38 ]
>>401
そもそも使ってなければプリプロセッサはコンパイラに"data"を出力しない

410 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:17:27 ]
void *myMalloc(int size)
{
void *p;
p = malloc(sizeof(double) * size);
if (p == NULL) ...エラー処理;
return p;
}
と言うような関数を作ったのですが、

これに、double **a の奴と、 double *b に
a = (double **)myMalloc(size);
b = (double *)myMalloc(size);
と、つなぎ合わせる事をするのですが、
特にこれで問題は起こらないものでしょうか?

411 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:32:56 ]
>>410
何かメモリがもったいないな

412 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:48:21 ]
a = (double **)myMalloc(size);
のあとは、for文回して
a[i] = (double *)myMalloc(size);
と言うふうに、2次元配列を作る予定なんですが・・・

413 名前:デフォルトの名無しさん [2007/12/30(日) 21:51:23 ]
すみません、質問させてください。
テキストファイルを作ると同時にそのファイルから文字を読み込んで出力する・・というのをやりたいのですが、なぜか開こうとしてもすぐ画面が消えます。なにがいけないんでしょうか?
別に読み込むだけでもいいのでアドバイスお願いします。コンパイラは「Bloodshed Deb-C++」です。

414 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:52:39 ]
改行が多すぎると言われたのでいくつかに分けて書きます。
#include <stdio.h>
#include <stdlib.h>
void kaku(int,int*,char*);
int main(int argc, char *argv[])
{
int ten=0;
char kekka[]="NG";
kaku(1,NULL,NULL);
kaku(2,&ten,kekka);
kaku(3,NULL,NULL);


415 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:53:27 ]

FILE *fp;
char data[256];
fp=fopen("test,txt","r");
fscanf(fp,"%s",data);
fclose(fp);
printf("%s\n",data);
system("PAUSE");
return 0;
}

void kaku(int fg,int *ten,char *kekka)
{
static FILE*f;
switch(fg){
case 1:
f=fopen("test.txt","w");
break;
case 2:
fprintf(f,"%d点,",*ten);
fprintf(f,"%s\n",kekka);
break;
case 3:
fclose(f);
break;
}
}
です。長々とすみません

416 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:59:38 ]
>>412
pointer to pointerを作るなら
a = (double**)malloc(size*sizeof(double*));
じゃないの?
まあ、メモリは余分に確保されてるからコーディング間違えなければちゃんと動くだろうけど。

>>413
意味が分からない

417 名前:416 mailto:sage [2007/12/30(日) 22:01:23 ]
ああ、>>413>>414-415



418 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:06:43 ]
>>416
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(double *));
で確認した所、 double型が8で、double *型が4でした。
ポインタだと値が違うんですね。 始めて知りましたorz

通りで動かなかったのかと・・・ 
ありがとうございました。 頑張ってみます

419 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:16:23 ]
>>413-415
13行目はtest,txtじゃなくてtest.txtだろう。
fopenしたならfpがNULLかどうか必ず確認すべきだ。
system("PAUSE")というのは俺の環境にはなかったから外したら多分期待通り動いた。

420 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:37:38 ]
>>419
できました!ありがとうございます!!

421 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:54:34 ]
>>418
ついでにcharとchar *、shortとshort *とかもsizeofして見比べて見ると良いよ
ポインタがちょっと見えて来る

422 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:55:08 ]
テキストファイルからある文字列を検索し、ヒットした文字列の直後にある数値を抜き出すコードを考えています
例えば
X= 630.20 Y= 220.20
Z= 33.25 A= 30.25
のような感じです。このうちプログラム内で定数として用いたいのが630.20や220.20、33.25に30.25です
まず1行目をfgets()でポインタ*fpに読み込んで、"X="をstrstr()で探します
その辺りまでしかぱっと思いつきません
ここから630.20を読み込もうと思うと、どのような方法があるでしょうか
宜しくお願いします

423 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:56:18 ]
scanf

424 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:01:46 ]
>>423
ありがとうございます
ですが、scanfはキーボードから入力したデータを読み込む奴ですよね?
テキストファイルに書いてあるものを読み込みたいのですが…

425 名前:デフォルトの名無しさん [2007/12/31(月) 02:15:45 ]
isdigit() 一文字ずつで調べて配列に格納して、atof() とか
トークンがスペースなら、そこまで読み込むようにして、 atof() とか

トークンをもう少し考えなおすのがいいかも、セミコロン、カンマとかにする。
strtokn()とかあった気がするが、それは調べてくれ。

426 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:22:41 ]
>>424
fscanf

427 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:24:37 ]
>>425
変なこと教えるなよ。
atofは数字以外に当たったら解析を終了するから、
> 一文字ずつで調べて
とかは不必要だろ。



428 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:29:10 ]
>>425
ありがとうございます。isdigitでチェックして配列に格納が簡単そうですね
strtokn()もありますけど、元ファイルを変換する(というより、別ファイルを作ってそこに数値同士をカンマ等で区切るようにする?)ので、あまり使いたくないところです
最悪、strtokn()で別ファイルを一時ファイルとして作成してやるという方法がありますが…
ちょっと考えてみます。ありがとうございました

>>426
fscanfにそんな機能があったのですか、もう一回調べてきます
ありがとうございました

429 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:54:39 ]
>>428
scanfはfscanfのラッパー関数みたいなもん。
scanf内でfscanfをstdinに対して処理している。
scanfでもstdinをfreopenすればファイルからの入力にできる。

430 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:13:36 ]
普通strtol(), strtod()

431 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:43:21 ]
#include<stdio.h>
int main ()
{
int a,b,c,i,f,d[50];
scanf("%d %d",&a,b);
switch(a*b){
case 0:
return 0;
defalt:
c=a/b;
printf("%d",c); /*19*/
break;
}
i=1;
while(i<=50){
c=a%b;
d[i]=c/b;
c=c%b;
printf("%d",d[i]);
if(d[i]==0)
f++;
else
f=0;
if(f>=2)
break;
i++;
}
return 0;
}
スミマセン!なんでコレダメなのデスカ?オシエテクダサイ!!!

432 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:45:12 ]
>>431
scanf("%d %d",&a,&b);
反射神経が書いてるので違うかもシレン。

433 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:26:48 ]
>>431

defalt:

↑これがだめだ。
ラベルとして認識しているはず。
default: な。


434 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:28:32 ]
>>431

ちょっとずれるが、

switch(a*b){
case 0:

↑0かどうか判断したいだけなら、if文を使うべきだ。
switchにする必要なし。


435 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:42:18 ]
スミマセンちなみにエラーの内容ハ”Ifに(がナイ”デス。
修正しまシタがダメデス。
書き方ノドンクササとかよりそっち教えてホシイデス。

436 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:03:01 ]
>>431に「エラー」は見当たらないような・・・

437 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:18:59 ]
>>435
もう一回、ifの入ってるバージョンのソース見せてくれたらなにかコメントできるかも



438 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:22:45 ]
>>431
>d[50];

>i=1;
>while(i<=50){

これも駄目だな

439 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 14:25:34 ]
437
このトウリデス
ナオラネエ!ウガァァァァァ

440 名前:デフォルトの名無しさん [2007/12/31(月) 17:09:50 ]
#include <stdio.h>
void test(int i);

itn main(void)
{
test(0);
return 0;
}

void test(int i)
{
if(i<10){
test(i+1);
printf("%d",i);
}
}

再帰なんですが
これ難しくて理解できないんすよ。
みなさん詳しく説明してくださいお願いします。

441 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:41:00 ]
test関数は引数が10未満ならもう一度test関数を引数+1の値を使って呼び出したあと引数を出力する。
出力は「9876543210」ってなるだけかな?
10を3とかにして流れをゆっくり追って行けばわかるよ。


442 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:42:04 ]
itnってなんだろうってのは置いといて、

test(0)は0+1でtest(1)を呼ぶ
test(1)は1+1でtest(2)を呼ぶ
最終的にtest(9)が9+1でtest(10)を呼ぶが、i<10じゃなくなるので何もしない
その後printfで9が印字され、8が印字され・・・最初の0が印字されて終了と
処理が戻っていく感じだな

443 名前:440 [2007/12/31(月) 18:03:00 ]
>>441 >>442
やっぱ再帰できたほうがいいすか?
ポインタよりも再帰の方が難しい・・・



444 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:04:52 ]
何が難しいのかさっぱり理解できない

445 名前:440 [2007/12/31(月) 18:11:48 ]
何故、0123456789じゃなくて
逆になるのかが、難しい


446 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:13:21 ]
>>443

感覚的に理解できないだけだと思うけど、
デバッガでステップ実行して追っていけばわかると思うよ。

ちなみに、再帰はめったに使わない。
11年ぐらい仕事でCプログラミングやってるが、
再帰を使ったのは1,2回。

447 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:23:52 ]
>>445
printfを実行するのはtestを実行した後だから

ディレクトリの走査とかそれに類似したものは再帰使うなぁ
定番というか



448 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:30:32 ]
デバッグ中に無限に再帰してスタック食いつぶしてデバッガがフリーズするのも良い思い出。

449 名前:440 [2007/12/31(月) 18:56:37 ]
再帰なんて深く理解しなくていいすか?
適当にながしちまえば?

450 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:01:59 ]
じゃあこれでどうだ

int sum(int n)
{
    int ret;
printf("enter sum(%d)\n", n);
    if(n == 1)
        ret = 1;
    else
        ret = n + sum(n - 1);
printf("leave sum(%d)=%d\n", n, ret);
    return ret;
}

int main()
{
    printf("sum(5)=%d\n", sum(5)); // print 1+2+3+4+5
    return 0;
}

enter sum(5)
enter sum(4)
enter sum(3)
enter sum(2)
enter sum(1)
leave sum(1)=1
leave sum(2)=3
leave sum(3)=6
leave sum(4)=10
leave sum(5)=15
sum(5)=15

451 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:04:18 ]
>>449
何を目的で勉強してるかによるんじゃないかな
単位のためとかであれば流しちゃっていいと思う

452 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:05:08 ]
滅多に使わないけど、再帰は階層構造を簡単に処理するには非常に便利、
この程度の基本テクニックにねを上げてるようじゃ、先は暗いよ。
諦めずに理解するべし。




453 名前:440 [2007/12/31(月) 19:11:11 ]
>>452
理解してみます
再帰はソートっぽいんすね
>>451 >>452とか
他の人たちは
socketとかネットワークプログラムとかもへっちゃらすか?


454 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 19:18:10 ]
「へっちゃら」の意味合いによる
ネットワーク関連のバグの修正とかは泣きそうになる

455 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:23:41 ]
スタックはLIFO

456 名前:440 [2007/12/31(月) 22:31:02 ]
test(0);


printf("%d",i);
tesxt(i+1);
の逆の再帰だと理解できます
先にprintfで0を表示してそのあとにtest0+1をして
1になってprintfで1を表示して
それを10まで繰り返すんですが

上の440のやり方だと
なぜtest(i+1);したあとprintfをやっているのに 9が最初にくるかがさっぱりなんですが
より詳しく教えてくれる人はいませんすか?

457 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:42:02 ]
>>456
再帰呼び出しが終わったらどこに戻るか考えてみそ。



458 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:44:11 ]
長いのでi<2でやると
test(0)→test(1)→test(2)→2は何もしないのでそのまま終了
test(1)に戻る、printf("%d",1)、test(0)に戻る→printf("%d",0)
return 0;に戻る

459 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:45:23 ]
10まであると面倒だからif(i<10)のところがif(i<2)だったものとする。

test(i+1)の所に順次、関数の中身を展開していくと、

if(0<2){
if(1<2){
if(2<2){
test(2+1); // ここは実行されない。
printf("%d",2); // ここは実行されない。
}
printf("%d",1);
}
printf("%d",0);
}

になる。で、10が表示される。これ見たら分かる?

460 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:45:46 ]
>>456
たぶん他の人と被ると思うけどw

test(0) が呼ばれるじゃん?
→ i<10 なので、test(1) が呼ばれるじゃん?
 → i<10 なので、test(2) が呼ばれるじゃん?
   : 中略するじゃん?
    → i<10 なので、test(9) が呼ばれるじゃん?
     → i<10 なので、test(10) が呼ばれるじゃん?
      → i<10 が成立しないので、何もせずに test(10)を抜けるじゃん?
     → printf("%d", 9) で 9 が出力されるじゃん? そんでtest(9)を抜けるじゃん?
   :
 → printf("%d", 2) で 2 が出力されるじゃん? そんでtest(2)を抜けるじゃん?
→ printf("%d", 1) で 1 が出力されるじゃん? そんでtest(1)を抜けるじゃん?
printf("%d", 0) で 0 が出力されるじゃん? そんでtest(0)を抜けるじゃん?
main() 終了じゃん?

さあ、何が出力されたかな?っと。

461 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:46:56 ]
3人もかぶるとはめずらしい

462 名前:460 mailto:sage [2007/12/31(月) 22:47:32 ]
ほら被ったあw

463 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:50:36 ]
おまえら大晦日なのに暇人だな



いや大晦日だから暇なのか

464 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:52:11 ]
初詣に出かけるまでの時間、暇で暇で仕方ない

465 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:53:14 ]
休みなんて、コーディングくらいしかやること無いしね

466 名前:440 [2007/12/31(月) 22:57:43 ]
おお!わかりやすいです。
ですが何故、繰り上がってる時にprintfが有効にならないのかが不思議です

i<10 test(0);

test(1)に繰り上がる時は test(i+1)とprintf("%d",i);をやるはずなんですが

何故printfが飛ばされてるんですか?

467 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:59:42 ]
test(i+1)が終わらないとprintfに進めないじゃないか。



468 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 22:59:50 ]
わかってないのにわかりやすいとはこれいかに


飛ばされてるんじゃなくて、test(i+1)で止まってると思えばいい
で、test(i+1)の処理が終わったら戻ってくる。

469 名前:440 [2007/12/31(月) 23:02:55 ]
test(i+1);で10になるまでループしてると考えれば良いんですか?
それで10になったら 987654321と戻ると?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<237KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef