トップページ⇒tech
1001コメント273KB

C言語なら、俺に聞け! <27>

■ このスレッドは過去ログ倉庫に格納されています
0001日下部? ということにしたいのですね? :)NGNG
C言語質問スレッド Part 26

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART4
http://pc.2ch.net/test/read.cgi/tech/1022961238/l50

・前スレ

<26> http://pc3.2ch.net/test/read.cgi/tech/1026048820/
<25> http://pc.2ch.net/test/read.cgi/tech/1024918442/
<24> http://pc.2ch.net/test/read.cgi/tech/1024033400/
<23> http://pc.2ch.net/test/read.cgi/tech/1023024817/

コンパイラなどのリンクは>>2-3 あたり
void日下部氏の激動の半生は過去スレを参照
0685デフォルトの名無しさんNGNG
>>684
チョトワラターヨ
0686Rina ◆tI333vNE NGNG
>>685
デフォルトの名無しさん,の部分なら私もワラタ.
0687デフォルトの名無しさんNGNG
C machineは動作保証できません。
とでもテンプレに入れとくかぁ。
0688デフォルトの名無しさんNGNG
>>687
おれはここや宿題スレにコードを貼る前に必ずgccでチェックしてるんだけど、
こっちでうまく実行できてるのにあっち(質問者)の環境だとうまく動かないというのは
例外なくCmachineで動かしてる場合だけだったな。
「またかよ」って何度も思ったもの。

だから動作保証できないって1もしくは2あたりに入れるのは賛成だな。

Cmachineってそんなにいいものなんだろうか。どういったところがいいんだろう。
使ったことないし使う気もないんだけど、どうなんですか、使ってる諸氏?
0689685NGNG
>>686
それです(w
0690デフォルトの名無しさんNGNG
漏れ、Cしか使ったことがないので、
C++やC#の存在が気になります。
Cと比べて、どういった利点や欠点があるかおせーてください。
0691デフォルトの名無しさんNGNG
C#はCの子孫じゃないぞ。
0692デフォルトの名無しさんNGNG
>>690
C++はいい匂いがするよ。
0693デフォルトの名無しさんNGNG
>>688
ソースコードを書いた後スタートボタンを押すだけでコンパイルと実行を行えるところじゃない?
VC++でも似たようなことができるけれど高いし。

俺は使っていないけど・・・
0694デフォルトの名無しさんNGNG
>>693
スタートボタンを押しても、メニューしか出てこないのですが・・・?
0695デフォルトの名無しさんNGNG
>>694
つまらん逝ってよし!
0696デフォルトの名無しさんNGNG
gcc-2.95.4@Linuxな環境です。

#include<stdio.h>

int main()
{
char* p;

fgets(p, 10, stdin);
printf("p=%s\n", p);

return 0;
}

これって普通に実行できるもんでしたっけ?
segmentation fault させるつもりだったんですが普通に動いてしまって
「あれ?」という感じなんですが。
0697デフォルトの名無しさんNGNG
>>696
たまたま運がよかっただけ。
もう少し長く読み込んでみて。
期待通りに動くだろうから( ̄ー ̄)ニヤリ
0698697NGNG
長く読み込む必要はないか。
pの値は不定(なはず)なんだから。
0699デフォルトの名無しさんNGNG
>>696
> これって普通に実行できるもんでしたっけ?
「未定義」では普通に実行できても良いし、 segmentation faultしても良いし、
鼻から悪魔が出てきても良いです。
0700696NGNG
>>697-699
なるほど。ある程度長く読まないといけないんでしょうか。
fgets で読む量を増やしてみたら期待通りになりました。
ありがとうございました。
0701デフォルトの名無しさんNGNG
あんまり鼻から悪魔って言葉を使ってるとお里が知れるぞ(w
0702デフォルトの名無しさんNGNG
>>696
「未定義」の場合、ある1つを除いた、あらゆる動作に可能性があります。
「ある1つ」とは、もちろん、あなたの期待した動作です。
0703デフォルトの名無しさんNGNG
>>702
それは間違いです。
たまたま期待したように動作したとしてもいっこうにかまいません。
もちろん期待したとおりに動作しなくてもかまわないわけですが
0704デフォルトの名無しさんNGNG
まあ、パルプンテみたいナモのだと思えばいい。
0705デフォルトの名無しさんNGNG
質問です。
OSをMeから2000に変えてから
system("cls");
による画面クリアができないんですがなぜでしょう?

エスケープシーケンスでの画面クリアもできないしど
うしたらいいんでしょうか?
0706デフォルトの名無しさんNGNG
それはCの話題なのだろうか。
0707デフォルトの名無しさんNGNG
それはageるほどのことなのだろうか
0708デフォルトの名無しさんNGNG
へきへき
0709デフォルトの名無しさんNGNG
演算子の優先順位について教えてください
下記を動かすと"123"と出力されます
&&の法が優先順位が高く、||,&&とも左から結合なので、
"231"と出力されると思っていたのですが、
なにか見落としがあるのでしょうか?

printf("1")<0||printf("2")&&printf("3")<0;

環境:SunOS5.7+gcc3.0
0710デフォルトの名無しさんNGNG
<より||のほうが強いとか?
0711710NGNG
んなわきゃないね。
0712デフォルトの名無しさんNGNG
うちのmingwのgcc(3)とVC6なら123になったよ
0713デフォルトの名無しさんNGNG
>>709
ショートカット?
0714デフォルトの名無しさんNGNG
>>709
演算子の優先順位と結合方向は、評価の順番とは関係ありません。
0715デフォルトの名無しさんNGNG
>>709
適当に答えとくと、実行結果が演算されてるからなんじゃねーの?
0716709NGNG
>>714
この形で順序依存の副作用を期待する式は使用できないのですね
ありがとうございました

試しにやった四則演算も"123"となりました
printf("1")+printf("2")*printf("3");
0717709NGNG
言い訳しとくと7行スレチャレンジ厨です
フツーに使う気はありませんです
0718714NGNG
>>716
ついでにいうと、&&、||、? :は、シーケンスポイントを作り、かつ、左が先に評価されることが保障されてる。
それから a が偽なら、b、c は評価されない。
優先順位とは a || b && c が a || (b && c) と評価されるってこと。
0719デフォルトの名無しさんNGNG
コンパイル後にする「リンク」とは何者なのでしょうか…あれこれ調べましたが今ひとつよくわかりません 誰か解説していただけないでしょうか
0720718NGNG
>それから a が偽なら、b、c は評価されない。
うそかいちった。
b が偽なら、c は評価されない。
です。
0721デフォルトの名無しさんNGNG
>>718
シーケンスポイントって副作用終了点?
0722デフォルトの名無しさんNGNG
>>719
> コンパイル後にする「リンク」とは何者なのでしょうか
オブジェクトファイルをつなげて実行ファイルを作成する作業
0723デフォルトの名無しさんNGNG
>>721
これくと。
0724719NGNG
>>722
つまり、ネイティブコードの群れをまとめ上げてヘッダをくっつけて実行可能にするる作業、と考えてよいのでしょうか
0725デフォルトの名無しさんNGNG
>>719
どの辺のアドレスにどう配置するかを決定する作業。
0726デフォルトの名無しさんNGNG
>>725
それはリロケーションと呼ばれる、リンク作業の一部。
0727デフォルトの名無しさんNGNG
>>725
なんか、それだけ読むとローダーの仕事の感じもする。
0728デフォルトの名無しさんNGNG
関数へのポインタ宣言で質問です
#include <stdio.h>

int num(int,int);

int main()
{
int (*p)();
int a=1,b=2;
p=num;
a=(*p)(a,b);
}
本ではこれで成り立つはずなんですが
VC++でコンパイルするとエラーになります
変数宣言の部分で
int (*p)(int,int)
と引数の型と数を指定すればエラーにはならないのですが
これは本が間違っているのかVC++の仕様なのかわかりません
どなたか教えてください。
0729デフォルトの名無しさんNGNG
本がCとか?
0730 ◆JAPH9PWA NGNG
>>728
C++としてコンパイルしているに一票
0731デフォルトの名無しさんNGNG
>>728
正確にはVC++の仕様ではなくC++の仕様
Cの場合、func()はint func(...)と同じ意味だが、
C++の場合、func()はvoid func(void)と同じ意味
0732728NGNG
なるほどC++の仕様でコンパイルされているんですね
VC++で完全にC言語の仕様でコンパイルする方法はありますでしょうか?
0733デフォルトの名無しさんNGNG
拡張子は今cpp?
0734728NGNG
ちなみに本はC言語の本です
0735728NGNG
CPPです
0736デフォルトの名無しさんNGNG
>>735
.cにせい
0737728NGNG
ありがとうございます
コンパイルできました!!
0738 ◆JAPH9PWA NGNG
>>728
ちなみにその本の名前は?
int (*)()にint (*)(int, in)を代入するなんて事を教えるのはおかしいよ。
0739デフォルトの名無しさんNGNG
C言語の名前の由来って、ナニ?
0740デフォルトの名無しさんNGNG
B言語を知らない世代が登場!
0741デフォルトの名無しさんNGNG
>739
Computer Language
0742デフォルトの名無しさんNGNG
Assembly
B
BCPL
C
0743739NGNG
>>740-742
ホントにそうなの!?
もしかして単なる当て字!?
0744デフォルトの名無しさんNGNG
おぉ、懐かしい
BCPL = BasiC Precompile Langageのことだよね
要するにBasicのソースコードを生成するプリコンパイル言語
昔はこれであの面倒なN88-Basicの行数を意識せずにBasicを作っていたものだ
0745デフォルトの名無しさんNGNG
>>744
は?脳内プログラマ?
BCPLとBasicは別物だよ
0746!744NGNG
>>745
ネタだろ
0747739NGNG
ってか、>>740-742は鵜呑みにしていい話なの?
0748デフォルトの名無しさんNGNG
>>747
googleでも見てな!。
0749739NGNG
>>748
あ、分からない人に教えろとは言わないから
大丈夫。(プッ
0750748NGNG
面倒だな。煽りに乗ってやるか。
これでもみな。
http://www.visti.net/~dwl/ci/intro.htm
分かったか丸禿。
0751デフォルトの名無しさんNGNG
>>750
すごく分かりやすかった。
0752デフォルトの名無しさんNGNG
Введение
0753デフォルトの名無しさんNGNG
>>746
744-745メアド見てみろ
0754デフォルトの名無しさんNGNG
でもLangageまでネタかどうかは微妙
0755デフォルトの名無しさんNGNG
int a=3;
float b=3.0;
のとき、
(a == (int)b)
は常に真ですか?

さっき調べたら、0〜16777216(floatの最大)までは真
だったんだけど、どうも自信がなくて。
0756デフォルトの名無しさんNGNG
>>755
自信が無かったらやめなよ。多分大丈夫だとは思うけど保証はない。
0757デフォルトの名無しさんNGNG
マイナスはどうなる?
07581NGNG
printf("俺も最近c始めたんだけどむずいですね");
0759デフォルトの名無しさんNGNG
>>755
別に16777215がfloatの最大じゃないぞ。
たしか、そのくらいで精度が1.0f超えた気がしたが
0760755NGNG
型をdoubleにして 300 000 000 までやってみた。
全部真だった。
でもやっぱり自信がない。
0761デフォルトの名無しさんNGNG
>>755
IEEE754(現在のほとんどのCPUで採用されている浮動小数点フォーマット)
について調べてみるといいと思われ。

単精度(float)の仮数部は23bit、正規化されてるので事実上24bitあって、
2^24=1677216だから、>>759の言うとおり1677215までの整数なら
誤差なく表現できる。
0762デフォルトの名無しさんNGNG
>>760
倍精度(double)の仮数部は52bit(同様に正規化により事実上53bit)なので、
32bitの整数なら誤差なく表現可能。
0763 NGNG
>>761
正規化しただけで、1ビット増えるわけではないのだが。
0764デフォルトの名無しさんNGNG
>>763
761じゃないけど、正規化で1ビット省略されてる分
> 事実上24bit
というのは正しいと思ったんだけど違うの?
0765764NGNG
あ、意味わかりました。

         ∧_∧
         (´Д` ) 切腹しますた
         /  y/  ヽ
    Σ(m)二フ ⊂[_ノ
        (ノノノ | | | l )
    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0766755NGNG
うちの環境(x86 + gcc + linux)ではfloatは16777216が上限っぽい、
なぜだ?
0767デフォルトの名無しさんNGNG
>>766
>>761、762見た?
0768 NGNG
>>766
16777216と16777217.0Fも一致してないか?
0769デフォルトの名無しさんNGNG
すみません質問です。
ポインタのキャストの意味が良くわからないのですが、実際のプログラムでポインタのキャストなんて使うことはありますか?

int dt[10];
char *p;
p=(char *)dt;

ポインタは先頭アドレスだけを指すんですよね? だったらこんな一時的にポインタをキャストしても仕方がないと思うのですが・・・
厨房の質問ですみません。 どなたか返事をお願いします。
0770デフォルトの名無しさんNGNG
>>769
いろいろとキャストなんて使うことはあります
0771デフォルトの名無しさんNGNG
>>769
次のプログラムを試してみそ。(実行する前に結果を予想してみること。)

int dt[10];
char * p;
p = (char *)dt;

*dt = 1234;
printf("%d %d\n",*p, *(int*)p);
0772デフォルトの名無しさんNGNG
>>769
一番ポピュラーな使い方はmallocでメモリを確保するとき。
mallocはvoid*を返すので、たとえば

char *cp;
cp = (char *)malloc(16); // キャストする

というふうにキャストが必要になる。
他にも使わざるを得ない局面はあるんだけど、
説明するのが面倒なんで略する。
0773デフォルトの名無しさんNGNG
>770 >771 >772
レスありがとうございます。
>771
実行結果は -46 1234 でした。 *(int*)p の意味が良くわからなかったので
(int*)p でやって見たら -46 1245016 という良くわからない結果が出ました。 
予想と全然違いました。 もうちょっと悩んでみます。

>772
そっちも頑張ってやって見ます。 ありがとうございます。
0774¥NGNG
エディターでソースを書いた後それの
拡張子を.cにしたいのですがどうすればよいのでしょうか
0775デフォルトの名無しさんNGNG
>774
右クリックで名前の変更。
0776¥NGNG
>>775
そうやってみたんですけど
「ファイル名.c.txt」になってしまいます
0777デフォルトの名無しさんNGNG
じゃあ、Dosでやってみて。
rename file1 file2 で。
0778デフォルトの名無しさんNGNG
「"」でくくって
"test.c"
で保存してみそ
0779デフォルトの名無しさんNGNG
>>774-778
C言語と関係ない
0780デフォルトの名無しさんNGNG
#define MACRO(x) \
do { \
... \
... \
} while (0)

マクロで上のようなことをしているものを時々見るのですが、
これってどんな意味があるのですか?

マクロで関係ない変数を書き換えてしまったりするのを防ぐためなのかな、、
とか思うのですが外してるかも。
0781780NGNG
あ、すみません。ブラウザだとバッククォートが消えてしまいますね。
navi2ch だと見えるんですが。
0782780NGNG
s/バッククォート/バックスラッシュ/ (恥
0783デフォルトの名無しさんNGNG
MACROが関数のように使えて便利。
whileの後に";"が必要だったりするし。
0784デフォルトの名無しさんNGNG
>>780
if (test)
 MACRO(x);
って書いたときのことを考えてみな。
do〜whileでくくってある場合とそうじゃない場合と。
■ このスレッドは過去ログ倉庫に格納されています