【初心者歓迎】C/C++室 Ver.19【環境依存OK】

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/07/17(日) 12:09:03
>>951
どーいうときに使うのか分かんなくて読み飛ばしてたところに思いっきり書かれてました。
早い返答ありがとうございます。
クソなのは昨日から勉強始めたばかりなので目瞑っておいてください…。
953デフォルトの名無しさん:2005/07/17(日) 12:26:08
>>945
malloc()の速度は基本的には実装依存なので、ライブラリのソースを見
るか計ってみないとわからない。

でも、速度が大きさに依存する実装方法はちょっと思い浮かばない。ヒー
プのフラグメントっぷりに依存することは多いかも。
954デフォルトの名無しさん:2005/07/17(日) 13:44:16
>>949
scanf("%s",x);    //間違い。xはポインターじゃない。
scanf("%c", &x);

もしxを文字型配列にするんならscanfじゃなくてfgetsにしたほうがいい。
955952:2005/07/17(日) 14:05:20
>>954
ご飯食べてさぁ続き、と思ったら更に質問するようなことが起きたのですが、
おもいっきしその解答が先出しされててびっくりしました。
本当にありがとうございまっす。
956デフォルトの名無しさん:2005/07/17(日) 14:08:42
>>927
なんでdouble *SI = si;なんて冗長な事してるの?
バグとは関係ないけど見辛いから質問するときは止めとけ。
あと、*Lも
957デフォルトの名無しさん:2005/07/17(日) 14:11:47
g++(gcc) 3.3.3 を使っているのですが、標準で使える class の一覧って
どこかにあるのでしょうか?ヘッダファイル(?)をあさるしかないのでしょうか?
例えばファイルの ctime が知りたいと思ったときどのような手順で調べるのが
普通なのでしょうか?
google で検索しようとしてキーワードに標準と入れると STLの説明ばかり
ひっかかってしまいます。タコで申し訳ありません。
958デフォルトの名無しさん:2005/07/17(日) 15:06:30
公式サイト
マニュアル
書籍
ヘッダーファイル
959デフォルトの名無しさん:2005/07/17(日) 15:37:26
自分でも驚いているのですが・・・
float x;
x = 1/4;
printf("%f\n",x);
わ、割り算が出来ません...orz
960デフォルトの名無しさん:2005/07/17(日) 15:38:20
>>959
1.0/4.0
961デフォルトの名無しさん:2005/07/17(日) 15:45:07
>>959
割り算はできてる。int / int で切り捨てられて 0 になっている

>>960 は 80点

x = 1.0f / 4.0f;
962デフォルトの名無しさん:2005/07/17(日) 15:46:40
>>961
なんでわざわざ単精度で割算するんだ?
963961:2005/07/17(日) 15:49:39
>>962
俺に聞かないでくれ

x が float型だからそうしたんだよ
(まぁ printf に渡されるのは double になっちまうけどな)
964デフォルトの名無しさん:2005/07/17(日) 15:55:27
x が float型だったらfで計算しなくちゃならんのか?それが100点?
965961:2005/07/17(日) 15:59:09
>>964
規格を額面通り受け取って
コンパイラによる最適化を考えなければ
よりよいコードだと思ったのだが。

何か問題でも?具体的に頼む
なんか自信なくなってきた
966デフォルトの名無しさん:2005/07/17(日) 16:01:18
>>965
まずはあなたが何故そう書いたのか説明してくれよ
967デフォルトの名無しさん:2005/07/17(日) 16:11:08
>>965
「よりよいコード」とか考えるんだったら x を double にするのが正解だろ。
968デフォルトの名無しさん:2005/07/17(日) 16:12:53
それは流石に965に言うことじゃないと思うが
969961:2005/07/17(日) 16:31:21
>>966
ゴメソ。じゃ説明する

>>960のコードは次のコードと同じようなことをしている

    int i = 1L + 4L;

わざわざ大きい型を使っている
最終的に小さい型へ型変換される

>>967 禿同
970デフォルトの名無しさん:2005/07/17(日) 16:37:23
>>969
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html
計算精度を落とし、速度も落とし、それでもfloatで計算する事が20点アップするとは思えないが。
さすがに1/4の場合なら結果に違いは無いかもしれんが。
971デフォルトの名無しさん:2005/07/17(日) 16:39:11
低レベルな質問、度々申し訳ございません。
x=a+b+c;
while(x>3)
{
printf("%d",&a);
a++;
}
このループがエンドレスなのは何故でしょうか…。
972デフォルトの名無しさん:2005/07/17(日) 16:40:10
>>971
書いてある通りに動いてると思うよ
973デフォルトの名無しさん:2005/07/17(日) 16:40:24
あああ、書いたあとに自己解決。
と思ってx<3にしたら今度は何も表示されないように…。
974デフォルトの名無しさん:2005/07/17(日) 16:40:35
>>971 なんで終わると思うの?
975デフォルトの名無しさん:2005/07/17(日) 16:49:36
>>974
だよねー
976デフォルトの名無しさん:2005/07/17(日) 17:01:57
floatよりもdoubleが数倍速いってマジなのかね。
なんか年寄りの昔話にしか思えないんだけど。最近のCPUでも成り立つ話なのか・・・。
977デフォルトの名無しさん:2005/07/17(日) 17:03:43
>>973
自分で設定した条件式すらも理解できんのか?
前判定・後判定って知ってるか?
for文知ってるか?do while文知ってるか?

まだまだアドレスやらポインタやらは早いんじゃないかな?

>>976
コンパイラにマシン語吐き出させたら分かるんじゃない?
978デフォルトの名無しさん:2005/07/17(日) 17:09:35
>>977
えーと、昨日始めたばかりなので、
アドレスやらポイントやらは何言われてるのかよー分かりませんが、
先に式書いておいてもwhileの中では反映されないってことに気付きました。
これが前判定後判定ってことですよね?
979デフォルトの名無しさん:2005/07/17(日) 17:10:18
>>976
CPUって言うよりコンパイラだべ。
980デフォルトの名無しさん:2005/07/17(日) 17:12:26
前判定、後判定なんて関係ないだろこの場合は
981デフォルトの名無しさん:2005/07/17(日) 17:14:23
>>978
ループの中でxが更新されない限り、一度成り立った条件は崩れないだろ。
(他のタスクでうんちゃらかんちゃらは分かりにくくなるので省略)
だからループ抜けなかったり、入らなかったりするのは当然。
982デフォルトの名無しさん:2005/07/17(日) 17:15:05
>>977
マシン語読めないんでorz

>>979
おお、コンパイラの話なのですか。
この記事は恐らくgccだと思うので、VCなら関係ないのかな・・。
983デフォルトの名無しさん:2005/07/17(日) 17:17:05
なんでやねん
984デフォルトの名無しさん:2005/07/17(日) 17:22:40
>>978
printf("%d",&a);
&aは変数aのアドレス
985957:2005/07/17(日) 17:23:12
>>958
例えば公式サイトだと
ttp://gcc.gnu.org/onlinedocs/
だと思うのですが、そこのどの辺を見るとよいのでしょうか?
986デフォルトの名無しさん:2005/07/17(日) 17:28:52
>>984
あああ、scanf("%d",&a)とかと勘違いしてましたー。
アドレスとやらはちょこっと教科書読み進めてみたら出てきましたけど、
良く分からないので取り合えず放置しときます。

あんまり低レベルでグダグダ質問しても失礼なのでこの辺りで自習に戻ります。
ありがとうございました。
987デフォルトの名無しさん:2005/07/17(日) 17:37:29
floatとdoubleの話はコレだな
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html
988デフォルトの名無しさん:2005/07/17(日) 17:41:26
>>985
そことは別だがここはどうだ?
http://www.shibu.jp/cppreference/
989デフォルトの名無しさん:2005/07/17(日) 17:44:02
>>971
彼が何が分からないのか今分かった。
一度 x=a+b+c という等式を教えたら、その後は自動的に計算し
てくれると思ってるのか。
"="はその時点での右辺の計算値を左辺の変数に代入するとい
う意味。
下記だとaしか更新されない。ループの中でxに再代入しない限り
ループに入る前の値を保持する。
x=a+b;
while (x<3) {
    a = a+1;
}
990デフォルトの名無しさん:2005/07/17(日) 17:47:36
>>987
何の前提もなく
> C言語の浮動小数点数には、float型とdouble型がありますが、この説明からは、
> float型には何のメリットも無いようでしょう。実際、無いのです。
ならば、この文章は間違いだな。
991デフォルトの名無しさん:2005/07/17(日) 18:11:01
>>987
この部分だけ切り取って読むと、思い込みの激しい筆者に見えるな。
C言語の総論として書いているのをみると、この作者にとってはWindowsやLinux
上でのアプリ開発のためだけに、C言語は存在するのかなぁと、見えてしまう。
色々なCPUのコンパイラは昔々の話ではなく今でも立派な現役なのに。
992957:2005/07/17(日) 18:32:55
>>988
ありがとうございます。
993デフォルトの名無しさん:2005/07/17(日) 18:39:53
まあfloat型がいいかdouble型がいいかはコンパイラとCPU両方に依存するだろうな。
FPUの実装にもよるし、コンパイラがどう最適化するかにもよるし。
特にコンパイラの最適化に関しては、最近はSSEのスカラ演算レベルなら
自動でやってくれるから、全部float型の方がいいかもしれないしね。
994デフォルトの名無しさん:2005/07/17(日) 18:44:13
>>961 の、floatじゃないと80点だ、という話からこんな事になっただけだべ
次スレまだー?
995デフォルトの名無しさん:2005/07/17(日) 19:05:55
VC++2003で面白い結果になった。
float型の変数に例の結果を代入するのを書いたんだが、
1.0/4.0も1.0f/4.0fも即値でコードに3E800000が埋め込まれて
movで代入するだけになってる。
996デフォルトの名無しさん:2005/07/17(日) 19:22:45
最適化されちまってねえか
997デフォルトの名無しさん:2005/07/17(日) 19:42:39
むしろdebugビルドでそうなったんだ。
だれかgccとbccでチェック頼む。
998デフォルトの名無しさん:2005/07/17(日) 19:55:02
定数式がコンパイル時に評価されるのは最適化以前の問題だと思っていたが…
999デフォルトの名無しさん:2005/07/17(日) 20:20:44
結論、何か理由がない限りfloatよりもdoubleを使おう。
同じように、1.0f / 4.0fとしないで 1/4.0で充分だろう。
1000デフォルトの名無しさん:2005/07/17(日) 20:37:34
千昌夫
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。