- 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/
- 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と戻ると?
- 470 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:03:02 ]
- >>440
test は、9 から i までを出力する関数。 引数が 10 未満の時は、まず test(i + 1); とすることで 9 から i + 1 までを出力してから、その次に i を出力してるっしょ? そういうわけで、9 から i までが出力される。 んで、10 以上の数を渡すと、if に引っかかって何も出力されない。 だまされた気分になっても気にしない。
- 471 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:07:15 ]
- test(10)は何も表示しない。
test(9)はtest(9+1)を実行してから9を表示する。つまり、9を表示する。 test(8)はtest(8+1)を実行してから8を表示する。つまり、98を表示する。 test(7)はtest(7+1)を実行してから7を表示する。つまり、987を表示する。 …中略… test(1)はtest(1+1)を実行してから1を表示する。つまり、987654321を表示する。 test(0)はtest(0+1)を実行してから0を表示する。つまり、9876543210を表示する。
- 472 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:13:23 ]
- 再帰関数を展開して1つ1つ理解しようとしても混乱するだけだよ。
例えば 9 から i までを出力する関数 hoge があるとするだろ? それを使って test を実装しようとすると、一番簡単なのは hoge をそのまま呼ぶだけだけど、 それじゃ面白くないので 9 から i + 1 までを hoge に出力させて、 それから i だけを test 内で出力するという風にしてみよう。 そうすると void test(int i) { if(i < 10) { hoge(i + 1); printf("%d", i); } } となるわけよ。これは分かるっしょ? んで、この test っつー関数は 9 から i までを出力する関数になったわけだから、 hoge としてこの test が使えることになる。 というわけで、 void test(int i) { if(i < 10) { test(i + 1); printf("%d", i); } } としても同じ結果が得られるって寸法だ。
- 473 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:14:17 ]
- >>459とほとんど一緒だけど
int main(void) { /* test(0)開始 */ if(0<2){ /* test(1)開始 */ if(1<2){ /* test(2)開始 */ if(2<2){ /* ここは実行されない */ } /* test(2)終了*/ printf("%d",1); } /* test(1)終了*/ printf("%d",0); } /* test(0)終了*/ return 0; }
- 474 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:18:46 ]
- _beginthreadexでウィンドウハンドルを渡したいんですが、
どうすればいいですかね?
- 475 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:19:25 ]
- スレ違い
- 476 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:19:57 ]
- 第3引数から渡すれ
- 477 名前:440 [2007/12/31(月) 23:21:05 ]
- なんとか理解しました
>>460さんのが分かりやすかったです まだ完全理解したという訳ではないので勉強してみます 回答してくれた皆様ありがとうございました。
- 478 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:23:03 ]
- おそらくスタックがどんな感じなのかわかっていないかな?
iがスタック上に積まれる他に関数呼び出しによる復帰情報(ここだとtest()関数な)がスタック上に積まれるんよ 復帰情報は関数が何処に戻れば良いかを示すリターンアドレスが格納されている ここではまだ実行されていないprintf()の直前 つまりイメージとしては 復帰←0←復帰←1←復帰←3←復帰…8→復帰←9←復帰 と積まれる(push) でループから抜けると 今度は 復帰情報→0→復帰→1→復帰→3→復帰…8→復帰→9→復帰 と逆に飛び出してくる(pop) つまりLIFO(Last In First Out)な訳 良くコインの入れ物として説明されている有名アレ
- 479 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:46:46 ]
- ああなんか色々間違ってるなゴメン
正しくは push時 main復帰←0←復帰←1←復帰←2←復帰…8←復帰←9←復帰 pop時 main復帰→0→復帰→1→復帰→2→復帰…8→復帰→9→復帰
- 480 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:55:51 ]
- スタック云々言って理解できるなら、
再帰ぐらいで悩まないと思う…。
- 481 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:16:15 ]
- うぬ、そうか、、、スタック説明しないと無理か 大変だな
えーっとスタックはローカル変数を格納する為のメモリ領域で・・・ ってスレ違いだなこりゃ スマン調べてくれとしか言いようが無い 頑張ってくれ
- 482 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:18:39 ]
- 同じ関数だから混乱する。
引数が関数名だと思ってたどってみ test(1)は test1(1)だと
- 483 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 00:23:13 ]
- 年越し勉強会になっててワロタ
- 484 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:18:13 ]
- printf("あけおめ");
- 485 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:18:53 ]
- puts("ことよろ");
- 486 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:35:47 ]
- scanf("%d", &otoshidama);
- 487 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:39:34 ]
- ^D
- 488 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:42:40 ]
- !#include <stadio.h>
int mein() { fprint("間違えを見つけた数×100000円お都市玉をもらえます"); } return 0; あけましておめでとうございます
- 489 名前: 【4円】 mailto:sage [2008/01/01(火) 01:49:08 ]
- 600000GET
- 490 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 01:52:21 ]
- 600000円が最高金額か
ダンヒルの最高値福袋2個分かよw
- 491 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 06:18:41 ]
- Max \700,0000- ?
- 492 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 06:19:18 ]
- \700,000-
- 493 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:25:28 ]
- \nが無いのを間違いと見るなら800000円かな?
- 494 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:42:07 ]
- >>474
4番目のvoid *arglistを使って渡すべし。
- 495 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:06:42 ]
- 函数の()の中にvoidとかを書かないのは間違い?
- 496 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:11:54 ]
- 函数の()って何だよ。
もうちょっと人に伝わる言葉で表現しろよ。
- 497 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:13:29 ]
- さーせん。
「mein()」の()の事
- 498 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:14:36 ]
- mein って何だよ
- 499 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:15:15 ]
- こっちのセリフです><
- 500 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:17:14 ]
- main
- 501 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:17:39 ]
- >>497
それだけじゃ、宣言か定義か呼び出しかすら分からないわけだが・
- 502 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:19:24 ]
- いえ、>>488のことですが・・・
- 503 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:21:26 ]
- 別に何の間違いでもないだろ
- 504 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:22:46 ]
- ( ) 内に何も書かなかった場合
○ プロトタイプ宣言 引数がどうなっているか不明であることを表す。 その後具体的な引数を指定した宣言や定義が現れない限り、 この関数を呼び出す時、実引数は可変長引数の時と同じように扱われる。 ○ 関数定義 規格上は void であると見なされることになっている。 ただし、上記に書いた通りの動作を起こすコンパイラもある。 ○ 関数呼び出し そもそも ( ) 内に void と書いて呼んではならない。
- 505 名前:440 [2008/01/01(火) 16:48:42 ]
- また質問っす
#include <stdio.h> #include <string.h> int ko(char *p); int main(void) { char str[80]; gets(str); printf("%d\n",ko(str)); return 0; } int ko(char *p) { int a; a=0; while(*p){ a++; p++; } return a; } なんですが while(*p)なんですが str[80]に入力した文字をどのように繰り返してるんでしょうか? while(*p)だと全然理解ができません 入力した文字列の\0(ヌル文字まで繰り返すんでしょうか?)
- 506 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 16:57:16 ]
- while(*p != '\0') { } と同じ。
- 507 名前:440 [2008/01/01(火) 17:00:23 ]
- ありがとうございます
*pとかよくわかりずらくて参考書にそんなようなこと書いてなくて 次はforでやってみようかと思います
- 508 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:00:32 ]
- >>505
・C言語では偽が0、真が0以外 ・whileは条件が真(つまり0以外)の間、ループを続ける ・C言語の文字列(char配列)はヌルターミネートといって最後にヌル文字('\0')が入っている ・ヌル文字の文字コードは0 ・*は間接参照演算子 つまり >入力した文字列の\0(ヌル文字)まで繰り返す で正しい。 ヌル文字ではなかったらaをインクリメントし、ついでにpを進める、ということを繰り返す まあ(半角)文字数を調べる関数だね
- 509 名前:440 [2008/01/01(火) 17:06:50 ]
- >>508
あ!だからヌル文字で終わるんですね ヌル文字=0って事を・・・ 文字列とかが入るとややこしくなるんで これを使えば特定の文字の数を数える関数とかへっちゃらっすね
- 510 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:25:47 ]
- でも、ちゃんと '\0' と比較した方が読みやすいから比較しようぜ
- 511 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:35:04 ]
- そうだね。
こんな読みにくいコード書いても、読みやすいコードに比べて実行速度が速くなる訳じゃないもんね。
- 512 名前:440 [2008/01/01(火) 17:42:21 ]
- 実行速度ってどうなんすか?
僕が作るプログラムではそこまでイライラするほどかからないんすが
- 513 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:54:41 ]
- 全く変わらん。
- 514 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:16:56 ]
- #include <stdio.h>
int main(void) { while(1) { printf("おまいら\n"); printf("あけましておめでとう!\n"); } return 0; }
- 515 名前:440 [2008/01/01(火) 19:18:16 ]
- ネットワークプログラム作りたいんすよね
どんな過程でネットワーク系に入りますか? まずC言語の文法など覚えてたらすぐネットワーク系のプログラムとかやりますかね?
- 516 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:27:54 ]
- ネットワークプログラムは結構めんどくさい。文法覚えただけでは苦戦する。
でも、目的を持って難題に立ち向かうのが上達の秘訣だとおもう。 コードを書いていれば、何が必要かだんだんとわかってくる。 すぐに作れなくてもあきらめないことが重要だよ。
- 517 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:47:55 ]
- #if
#else if #end if の使い方がわかりません! どういうときに使うんですか!
- 518 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:51:35 ]
- 以下の★1と★2のやり方で結果が同じになるのはどうしてなんでしょうか?
有識者の方ご教授をお願いします。 #include<stdio.h> void * func(void *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",(int)p); (int)p += 100; printf("p = %d\n",(int)p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func((void *)number);★1 return 0; }
- 519 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:52:05 ]
- #include<stdio.h>
void * func(int *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",*p); *p += 100; printf("p = %d\n",*p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func(&number);★2 return 0; }
- 520 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:58:22 ]
- >>517
#define VER 2 #if VER < 2 //古いコード #else //新しいコード #endif みたいにソースを丸ごと切り替えるときに使ったりする 慣れると便利。
- 521 名前:440 [2008/01/01(火) 19:59:01 ]
- >>514
それは、おまいら あけましておめでとうを無限ループですね? while(1)なので
- 522 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:59:45 ]
- >>518
1はちゃんと動くのか?
- 523 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:03:15 ]
- >>522
*(int*)p += 100; とすると、同じ結果が出るね。
- 524 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:05:54 ]
- >>517
デバッグ時にコードを一時的に無効化したり有効化するのに便利だね。 /* */とは違って、入れ子にできるから楽 #if 0 hoge(); hoge2(); #endif
- 525 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:07:40 ]
- >>523
ほんとに func((void *)number);★1 こうなのか?
- 526 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:11:00 ]
- >>525
たしかに。&がないと通らないね。
- 527 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:12:32 ]
- >>523
怒られるんだけどw
- 528 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:25:21 ]
- >>520 >>524
ありがとうございます! ということは int VER みたいなフラグを作っておいて使うんですね! #if 0 とか参考にしてたソースに出てきてわからなかったです ありがとうございました!
- 529 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:42:21 ]
- >>528
>int VER みたいなフラグ 駄目です、それじゃ使えません
- 530 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:46:59 ]
- >>523
*(int*)p それは参照先がアレじゃないか?
- 531 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:52:07 ]
- >>518
そのこぴぺされたコードで、コンパイルして実行できるか、もう一度確認してみてくれないか? ちなみにWindows?もしかしてDOS?
- 532 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:53:06 ]
- >>529
orz 使い方おしえてくだしあ
- 533 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:55:26 ]
- >>532
>>520 ただの置換だと思えばいい
- 534 名前:440 [2008/01/01(火) 21:01:52 ]
- viみたいなエディタ作るには
1人じゃ無理すかね?
- 535 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:03:12 ]
- >>532
プリプロセッサと呼ばれる機能なのだ。 #defineはマクロで、文字列の置き換え #define VAR 2 と書くと、今後ソースのVARは2という文字に置き換えられる。 #ifは条件付コンパイル。式が0でなければ有効となる。 #if VAR>1 と書くと、以下と同意になる。 #if 2>1 となって、式の結果は、1なので、有効となる。
- 536 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:03:21 ]
- viみたいなエディタなら無理じゃない
- 537 名前:440 [2008/01/01(火) 21:05:24 ]
- 画面上に色とかつけたりしてるのは、あれはC言語でやってるんすかね?
viで色とかが使えるすがスキームなど色文字を表示することは可?
- 538 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:06:45 ]
- >>537
DOSなら、エスケープシーケンスじゃないか?
- 539 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:14:13 ]
- WindowsならコンソールAPI
- 540 名前:440 [2008/01/01(火) 21:15:29 ]
- Linuxじゃ無理すか?
たしかにwindowsだと猫でもわかるC言語に書いてありましたが
- 541 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:18:55 ]
- 猫か…
- 542 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:21:45 ]
- >>540
linux エスケープシーケンス使えるよ printf("\033[31mhogehoge\n"); って感じで
- 543 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:25:50 ]
- VT100か
- 544 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:25:59 ]
- >440
ちょっとは自分の頭を使って集中して物を考えたり調べも伸したりする習慣をつけろよ
- 545 名前:440 [2008/01/01(火) 21:47:36 ]
- >>542
すげーっすね! できましたよ エスケープシーケンスで調べてきます >>544 以後気をつけます
- 546 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 00:02:28 ]
- >>523
左辺値にキャストはできないだろ?
- 547 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 09:04:56 ]
- >>546
これを実行してみてほしい #include<stdio.h> int main(void){ long num=1234; *((char*)&num)+=65536+256; printf("%ld\n", num); *((short*)&num)+=65536+256; printf("%ld\n", num); return 0; }
- 548 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 09:59:34 ]
- キャストしたものは左辺値じゃないけど、* をつけたから左辺値で通るんだよ。
- 549 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:28:47 ]
- #include <stdio.h>
#include <malloc.h> main(togo,toog) int togo; char *toog[]; {char *ogto, tgoo[80];FILE *ogot; int oogt=0, ootg, otog=79, ottg=1;if ( togo== ottg) goto gogo; goto goog; ggot: if ( fgets( tgoo, otog, ogot)) goto gtgo; goto gott; gtot: exit(); ogtg: ++oogt; goto ogoo; togg: if ( ootg > 0) goto oggt; goto ggot; ogog: if ( !ogot) goto gogo; goto ggto; gtto: printf( "%d goto \'s\n", oogt); goto gtot; oggt: if ( !memcmp( ogto, "goto", 4)) goto otgg; goto gooo; gogo: exit( ottg); tggo: ootg= strlen(tgoo); goto tgog; oogo: --ootg; goto togg; gooo: ++ogto; goto oogo; gott: fclose( ogot); goto gtto; otgg: ogto= ogto +3; goto ogtg; tgog: ootg-=4;goto togg; gtgo: ogto= tgoo; goto tggo; ogoo: ootg-=3;goto gooo; goog: ogot= fopen( toog[ ottg], "r"); goto ogog; ggto: ogto= tgoo; goto ggot;} これは何ですか?
- 550 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:13:44 ]
- たしかIOCCCのプログラム。別に何ってわけじゃない。
- 551 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:00:33 ]
- 頭が物故割れた
- 552 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:24:50 ]
- #include <stdio.h>
#include <string.h> int main(int argc, char *argv[]) { char *position, line[80]; FILE *fp; int counter=0, num, maxbuf=79; if ( argc == 1) {return 1;} fp= fopen(argv[ 1], "r"); if ( !fp) {return 1;} position= line; while ( fgets( line, maxbuf, fp)) { position= line; num= strlen(line); num-=4; while (( num > 0) && ( !memcmp( position, "goto", 4))) { position= position +3; ++counter; num-=3; ++position; --num; } } fclose( fp); printf( "%d goto \'s\n", counter); return 0; } たぶんこういうこと
|

|