- 1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ]
- C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 35 pc11.2ch.net/test/read.cgi/tech/1219761846/ 過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
- 2 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:43:24 ]
- >>2
それをその速さで貼れるってことは お前それをコピってずっと待機してたんだろ? リロードしまくって。誰かスレ立てるの待って。 まじきめーな。氏ねよハゲ。z
- 3 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:45:56 ]
- i=i++; は未定義だけど
i=++i; も未定義なの?
- 4 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:53:15 ]
- はい
- 5 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 16:21:12 ]
- >>3
二つの副作用完了点の間で同じ値(この場合i)を二度変更しようとする試みは全て未定義とされている
- 6 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 16:34:28 ]
- >>5
ってことはa = i + i++はおk?
- 7 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:24:29 ]
- >>6
あんたは、一つの法律で禁止されていないことは全て合法だとでも言い出すのか?
- 8 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:49:15 ]
- 授業で幾つかプログラムを作成しているときにa++;とa=a+1;があったのですが、両方同じ意味ですよね?
使うときはどちらが便利なのでしょうか?
- 9 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:53:17 ]
- ++a;
- 10 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:11:58 ]
- >>8
Cで、a=a+1はありえない。
- 11 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:39:58 ]
- >>8
ループなんかでカウンタとして使ってるなら++を使え。 あとで足す数が変わる可能性があるなら+を使え。
- 12 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:46:39 ]
- +=ですね。a=a+1はぜんぜんダメ。
- 13 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:51:35 ]
- わかればどれどもいいよw
- 14 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 19:57:45 ]
- いや、さすがにa=a+1はないだろ。
- 15 名前:13 mailto:sage [2008/09/15(月) 20:01:32 ]
- a=a+1
書き方をするやつにあれこれCの記述を伝授するのが面倒。 動くんだしいいよ。 +=とかおしてて「なんでなんで?」で時間食うのがもったいない。
- 16 名前:デフォルトの名無しさん [2008/09/15(月) 20:01:50 ]
- どれでもいい。
- 17 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 21:44:30 ]
- まったく同感。どれでもいい。
- 18 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 21:57:19 ]
- 文法に違反していない以上、どれを使うかは習慣の問題だね
仮に識別子の数が問題だとしても、算出元と変更先を両方同じものに書き換えるときに便利なのか、 片方だけないしそれぞれ別のものに書き換えるとき便利なのかの違いでしかない まあ俺は++使うけど
- 19 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 22:06:09 ]
- まあ、でも、a=a+1はダメだな。
++か+=かってのは、状況にもよるけど。
- 20 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 22:23:45 ]
- C++で演算子のオーバーロードも考えてコードを組むとなるとまた厄介な話になる。
- 21 名前:デフォルトの名無しさん [2008/09/15(月) 22:33:25 ]
- C++ くさい C も、Verilog-HDL くさい C も、きんもー
- 22 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 22:57:08 ]
- 文脈による。
確定的にaに1加える場所なら++を使う。 aに何か加えることが確定的で現在その値が1なら+=を使う。 単に現在aの新しい値が元のaから算出されるだけなら= +を使う。
- 23 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:10:46 ]
- C++ とか言うけど、オーバーロード的に考えて ++C の方が効率いい場合が多いんだよな。
イテレータとか。
- 24 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:20:27 ]
- a=a+1 はなぜ駄目なのでしょうか?
- 25 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:29:50 ]
- 気分的にです
- 26 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:30:48 ]
- オーバーロードされていた際にコスト高だな。→ a=a+1
- 27 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:38:57 ]
- スレ違いだし。
- 28 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 23:49:36 ]
- >>24
より良い書き方とされるa += 1、さらに良い書き方とされるa++と++aが存在するから。
- 29 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:02:03 ]
- >>24
別にダメではない 嫌う人間が多いだけ
- 30 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:08:49 ]
- 一目見てaに1を足してるって分からないから
まぁ同じ意味だし、好みの問題とは言うけど、読みやすさとか考えるとやっぱり a+=1, a++, ++a の方がいいと思う
- 31 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:12:47 ]
- タイプ数的に++aが楽でいい
それくらいの違いしか無い
- 32 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:23:31 ]
- a=a+a, a+= 1, a++の好みなんかよりもっと重要なものがある。
- 33 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:55:28 ]
- セミコロンか。
- 34 名前:24 mailto:sage [2008/09/16(火) 01:29:45 ]
- たくさんレスいただきありがとうございます。
ソースレベルでのわかりやすさ・なじみやすさ・効率が 主な理由だと理解しました。 >>26 さんの回答は、実行ファイルになった段階でも 場合によっては違いが出てくるとおっしゃっているようにも思えますが、 正直いまの私には十分には理解しきれませんでした。
- 35 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:52:25 ]
- おまえらほんとどうでもいい事だとスレ伸びるよな
- 36 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 02:15:26 ]
- 26さんの回答はC言語の範囲じゃないから気にするな
- 37 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 03:42:47 ]
- > a=a+1
ソースコードに何回も同じことが重複して登場するのは悪 だから a+=1 か a++ にしる!
- 38 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:02:53 ]
- memcpyはどうしてあんなに速いの?
- 39 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:11:49 ]
- >>38
そう作られているから。memcpy()と言う関数の振りをしているが、 その実体がCの関数かどうかは実装依存。 逆に言えば、コンパイラベンダが鎬を削るポイントでもある。
- 40 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:21:04 ]
- >>38
CPUは一発でデータをブロック転送できるから。 古いCPUだとブロック転送するよりスタックにいれられるだけいれて並べてくほうが速かったりすることもあるけど、 いまどきブロック転送の方が速い。
- 41 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:04:20 ]
- >>24
1) lpMetSect->lpSharedInfo->lAvailableCount--; 2) lpMetSect->lpSharedInfo->lAvailableCount -= 1; 3) lpMetSect->lpSharedInfo->lAvailableCount = lpMetSect->lpSharedInfo->lAvailableCount - 1; (3)は左辺と右辺を見比べて、同じ変数かどうか確認しなきゃならないだろ。
- 42 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:06:54 ]
- >>39
実装依存って言えばそうかもしれんけど、それ言ったら、標準関数全部そうだろ。
- 43 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:07:53 ]
- >>41
そんなもん間違うようなやつはそもそも1個でも間違うよ
- 44 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:16:24 ]
- >>43
読みやすさだよ。
- 45 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:49:55 ]
- 私が今作っている関数popは通常intを返すが、返すべき値が見つからない場合NULLを返します
しかし私の使っているコンパイラではNULL == 0は真になるので popの返り値がNULLであるか、0であるかを判別することができません エラーチェックのために新たに変数を設ける以外の解決法があったらぜひご教示願います それにしてもなぜこのコンパイラにはNULL == 0が真になるなどという奇怪な仕様が採用されたのでしょうか? まったくもって不愉快で、理解に苦しむ仕様です
- 46 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:56:54 ]
- 引数の一つを書き換える関数にして
戻り値のほうはリターンコードだけにすれば?
- 47 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:12:44 ]
- >>45
NULLはポインタが無効である(いかなるオブジェクトも指示していない)ことを表すために使うものだから、 そもそもintなどポインタ型と併用することを考慮されていない。コンパイルエラーになる処理系も存在する。 一般的には、>>46のいうように引数で返すか、 あるいは本来の戻り値と可否の2つを構造体でまとめるなどという方法を取るしかない。 よその言語では、こういう用途にもNULL(あるいはそれに相当するもの)が使えるものあるんだけどね。
- 48 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:21:42 ]
- >>45 NULL == 0が偽になったら、それこそ大変
- 49 名前:デフォルトの名無しさん [2008/09/17(水) 00:24:43 ]
- 可変個引数の引数リストってメモリ上にならんではいってるの?
ポインタで移動できるみたいだから、そう思うんだけど。
- 50 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:28:32 ]
- void push(int val);
int pop(void); のほうが体裁がいいんだろうな。 それだったら int isempty(void); /* 0以外: スタックが空 0:スタックが空でない */ を作ってそれでチェックするというのもあり。 if (!isempty()) { val = pop(); }
- 51 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:33:36 ]
- >>49
そうでないといけないという決まりはないが、そうなっていることが多い。 というかそういうやつでは、可変個でないやつも同じように置かれていて、 その配置を応用しているという作りになっている。
- 52 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:37:32 ]
- あるいはintより大きな整数を返す関数にして、エラー値としてintに収まらない数を返す
- 53 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:12:51 ]
- >>52 ???
- 54 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:22:17 ]
- >>53
「charより大きな整数を返す関数にして、エラー値としてcharに収まらない数を返す」 と同じ。
- 55 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:28:16 ]
- charはint幅でやりとりするけど、それと一緒にしてはいかんよ
- 56 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:30:43 ]
- >>46でいいだろ。
- 57 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:33:11 ]
- >>41
4) --lpMetSect->lpSharedInfo->lAvailableCount; これも追加しておいてくれお
- 58 名前:デフォルトの名無しさん [2008/09/17(水) 02:19:06 ]
- lpMetSect->lpSharedInfo->lAvailableCount += -1;
- 59 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 03:00:01 ]
- >>50
スタックを構造体で定義して、push, pop, isemptyの引数として渡したいな。 同時に複数のスタックが使えるようになるし。
- 60 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 10:47:38 ]
- そこまでいくと、C++でやれって感じになるが。
- 61 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:46:15 ]
- すみません、どうしても解らなくて><
#include <stdio.h> int main(void) { int c; while(c = (getchar() != EOF)) { printf("%d", c); } printf("%d", c); } このプログラムで、EOF以外を打つと「11」と、「1」二回繰り返されているようなんですが、 なんで繰り替えすのですかね? c = (getchar() != EOF)←のような条件自体初めての形ですので動きが解らなくて><
- 62 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:52:33 ]
- 改行文字だな
- 63 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:53:08 ]
- while(c = (getchar() != EOF)) {
printf("ループ内 %d", c); } printf("ループ外 %d", c); }
- 64 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:54:20 ]
- ごめん違うわ
cに名に入れたか考えてみろ
- 65 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:58:48 ]
- >>63
いや、ループは抜け出してないから、ループ内のprinftが繰り返されてるみたいなんですよ。 >>64 getcharでaを入力したとしたら、cには1が入りますよね? ってことは1を一回表示したら、またgetcharで入力待ちになると思うんですが……二回繰り返した後に入力待ちになってるんです><
- 66 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:04:22 ]
- 自分で書いた汚いCコードを読み込んで綺麗に整形して出力してくれるアプリってないの?
- 67 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:06:26 ]
- >>65
改行も1文字分
- 68 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:12:08 ]
- インデント+α程度の整形ツールならあるけど
- 69 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:13:37 ]
- >>62
>>65 なるほど、やっと理解できました! でもgetcharは一文字入力なんですよね? なんというか根本が解ってない感じだw んー、まずaでループに入り1を出力、次に改行文字でループに入り1を出力……ってことですかね?
- 70 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:02:33 ]
- まぁ、そんなとこだね。
「次に改行文字でループに入り」というよりは、 「次に得るのが改行文字なのでループから脱出せずに」だけれど。
- 71 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:13:40 ]
- 入力が行単位でバッファリングされてるとわかりにくいかも
打った文字はEnterを打つまで入力されない Enterを打つと打った文字+改行が入力されて、getcharでそれを1文字ずつ取り出せる
- 72 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:25:23 ]
- 'a'と'\n'の値が両方1ってどんな処理系だよ
- 73 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:27:06 ]
- >>72
- 74 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:28:03 ]
- >>72
- 75 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:29:13 ]
- >>72
ちゃんと元のコード読め
- 76 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:29:21 ]
- 畜生見間違えた
そこに括弧ついてんのかよ!
- 77 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:34:13 ]
- ……カッコ悪い
- 78 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:34:39 ]
- >>76
ドンマイ!
- 79 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 01:15:59 ]
- >>8
微妙に意味がちがう。 a = 1; b = ++a; b = a++; では結果がちがう。 func ( a++, a+1, ++a) のとき、funcの引数がどんなになるか挙動不明。
- 80 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 01:23:59 ]
- >>79
単体で使った場合を聞いてたのにいまさらなにをw しかも後半は引数がどうなるか不明つーより未定義動作じゃねーか
- 81 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 07:41:19 ]
- バイナリファイルを直接数字に変換する方法はどうすればいいのでしょうか?
rubyではunpack("s*")を使うのはしってるんですけど。
- 82 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 07:52:47 ]
- >>81
rubyのunpackは変換が目的だから、Cの場合はその必要が無い。 例えば、(今ぐぐって見つけた)リファレンスマニュアルの例だとこうなる。 unsigned char foo[] = {1, 2, 0376, 0375}; unsigned short * bar = (unsigned short *) foo; printf("%u, %u\n", bar[0], bar[1]);
- 83 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:27:04 ]
- www.vipper.org/vip929921.txt
すみません、なんでこのプログラムはEOFを入力すれば終了するのでしょうか?><
- 84 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:35:22 ]
- >>83
!= EOF が偽になって getline が 0 を返すから > 0 が偽になって main を抜けるのでは?
- 85 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:36:33 ]
- Cでは0xffのように16進数を使用できますが、2進数は使えますか?
- 86 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:44:22 ]
- >>85
使えません
- 87 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:46:51 ]
- あたかも2進数記述しているようにみえるマクロならある
- 88 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:48:51 ]
- >>86-87
ありがとうございました
- 89 名前:デフォルトの名無しさん [2008/09/18(木) 19:09:38 ]
- インクルードについて教えてください。
あるサンプルソースコードを入手して、 ~~.slnを実行して、デバッグしたら動きました。 ファイル入出力をしようと思って、 メイン関数が書いてある.cファイルで#include <iostream>とすると、 1>c:\program files\microsoft visual studio 8\vc\include\cstdio(35) : error C2059: 構文エラー : ':' 1>c:\program files\microsoft visual studio 8\vc\include\cstdio(36) : error C2143: 構文エラー : '{' が ':' の前にありません。 が大量に出てきてしまいました。 インクルードしただけです。 何がいけなかったのでしょうか?
- 90 名前:デフォルトの名無しさん [2008/09/18(木) 19:11:44 ]
- すみません、上のものです。
C++なので、スレ違いでした。 去ります。すみません。
- 91 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 20:27:31 ]
- .cファイルで#include <iostream>
そりゃダメだろ
- 92 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 02:10:43 ]
- C++でコンパイルするオプション付けりゃいいんじゃん。
- 93 名前:デフォルトの名無しさん [2008/09/19(金) 16:34:15 ]
- C言語のコンパイラで質問があります。
WindowsXPで、BCC DevelopperとBorland C++ Compiler 5.5.1を使用しています。 プロジェクトを一つ作り、そのプロジェクト内で複数のC言語ファイルを作成しているのですが、 一番最初に作成したC言語のファイルしか、コンパイル、メイク、実行ができません。 どうすれば他のC言語のファイルをコンパイル、メイク、実行する事が出来るのでしょうか?
- 94 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:36:57 ]
- bcc32 main.c foo.c bar.c
- 95 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:42:27 ]
- それを言うならメイクじゃなくてリンクでは
- 96 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:45:33 ]
- それはC言語の問題でもコンパイラの問題でもなくて、
BCC Developerのプロジェクト管理機能の使い方に関する問題だよな?
- 97 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:49:56 ]
- 質問です。
… int a if(a) … この場合のifの条件aとはどういう意味ですか?
- 98 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:51:44 ]
- if(a!=0)
とまったく同じ意味
- 99 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:02:27 ]
- えー
- 100 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:06:59 ]
- えーといわれても
何が不満なんだ?
|

|