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

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

■ このスレッドは過去ログ倉庫に格納されています
0001きょうはいいテンキーです。日下部陽一NGNG
漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことならぜんてわかるから、疑問な点があったら漏れに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

Cプログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するような救いがたいやつはこれでも読め
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/249-4698746-2014711

推薦図書/必読書のためのスレッド PART3
http://pc.2ch.net/test/read.cgi/tech/1016722820/

・前スレ C言語なら、俺に聞け! <17>
http://pc.2ch.net/test/read.cgi/tech/1019372139/l50
0175デフォルトの名無しさんNGNG
>>174
分かっていると思うけど、voidとNULLは違うから。
NULLを渡すということは0を渡すことと同じ。
0176デフォルトの名無しさんNGNG
voidってANSIが追加したキーワードですよね?
それまではvoidの代わりになんて書いていたのですか?
void型の関数とかvoid *とか。
0177デフォルトの名無しさんNGNG
あ、sageちゃった・・・
0178デフォルトの名無しさんNGNG
voidはANSI以前からあったよ。BSDのpccの拡張。
void *みたいなのはchar *で代用してた。
0179デフォルトの名無しさんNGNG
>>178
ありがとうございます。
enumみたいに以前からあったんですか。

> void *みたいなのはchar *で代用してた。
なるほど。キャストすればchar *もint *とかになるからね。
0180デフォルトの名無しさんNGNG
>>175
バカ。NULL を必要とするところに NULL 渡すことと 0 を渡すことは同じだけ
ど、int が要求されているところに NULL を渡すことと 0 を渡すことは同じで
ないことがあるぞ。
0181デフォルトの名無しさんNGNG
>>180
ん?NULLって
#define NULL 0
か
#define NULL (void *)0
じゃないの?
0182デフォルトの名無しさんNGNG
>>181
180が言いたいのはたぶん、ポインタとして「0」と書くとnull pointerを表す
約束になっているのでオーケーだが、逆にポインタを整数に変換して特定の値
(例えばゼロ)になるという保証はない、ということだろう。
0183デフォルトの名無しさんNGNG
>>182
そうか・・・・
まあ>>175で言いたかったのはNULLはvoidと違って値のあるものだということだから。
0184180NGNG
>>182 ありがとう。
>>183
NULL は void と違ってって、あんた exit() に float 渡しても平気 ?
それぐらい変なことだよ。exit(NULL) って。
0185デフォルトの名無しさんNGNG
>>184
だーかーらー
あの人はNULLとvoidを混同しているようだから言ったんだってば!
exitにfloat?NULL?そんなもん渡すか!
0186デフォルトの名無しさんNGNG
C FAQ嫁
つーか>>1のリンクくらい嫁。
0187デフォルトの名無しさんNGNG
>>185
> NULLを渡すということは0を渡すことと同じ。
先ずは、この発言撤回しろよ。
0188デフォルトの名無しさんNGNG
粘着の予感・・・
0189デフォルトの名無しさんNGNG
EXIT_SUCCESS (#`Д´)y-~~
0190 NGNG
>>189
ワラタ
0191デフォルトの名無しさんNGNG
EXIT_FAILED ・゚・(ノД`)・゚・。
0192デフォルトの名無しさんNGNG
EXIT_FAILURE ヽ(゚∀゚)ノ デシタ!
0193manko chinkoNGNG
最強のmankoプログラムを組んでみました。
#include <stdio.h>
main(){printf("manko daisuki");}
0194デフォルトの名無しさんNGNG
sizeof(NULL)≠sizeof(0)の可能性は別として、
数値を期待するところにNULLを渡せばそれは0を渡したのと同じことになる。

コンパイラによってはNULLを汎用ポインタ型の0として明示的に定義してる場合もあるが
これはよけいなお世話とも言うべきで、ANSIでいうところのヌルを表す数値定数は0で
あって、それ以外の何者でもない。

実装によってはヌルポインタのビットパターンが0じゃないものもあるが、
それはコンパイラが0から正規のヌルポインタに翻訳する。

sizeof(NULL)がsizeof(0)と等しくない環境は多い。
可変長引数やプロトタイプ宣言されていない関数への引数としてヌルポインタを
渡したい場合は、明示的にポインタ型へのキャストを行う必要がある。

結論としてだね、引数を含んだプロトタイプ宣言がなされているであろう関数
exit()に引数としてNULLを渡すのは合法で、結果として0を渡したのと同じことになる。

型検査が行われて、ポインタ型を整数引数に渡したとかいう警告がでるかもしれんが。

0195デフォルトの名無しさんNGNG
exit(NULL);
って、ゼロになる保証がないだけだから
mainがvoidの時は、それほど影響はないかと
と言っても、たまに勘違いしてる人がいるから問題と言えば問題だけど…
0196デフォルトの名無しさんNGNG
だがこれが文芸的プログラミングという考え方から行くと、
ヌルポインタと整数の0は別物であって、
そのどちらかをコードに書く場合、ポインタを期待するところにはNULLを
整数を期待するところには0を書くべきである。

memsetの第三引数に渡す数値も同じ。
exitに渡す数値も同じ。

exitの場合、明示的にEXIT_SUCCESS, EXIT_FAILUREが定義されているので
それを使う方が好ましいとはいえる。
0197デフォルトの名無しさんNGNG
>ANSIでいうところのヌルを表す数値定数は0であって、それ以外の何者でもない。
それはC++の話であって、Cだとその限りではない
0198デフォルトの名無しさんNGNG
>>197
Cだって同じだよ。
つーか、C++がCのヌルポインタを引き継いだだけだ。
意味は変わっていない。
0199デフォルトの名無しさんNGNG
つーか、なんで偉そうに嘘はくの?ここの連中。
0200玉三郎NGNG
キタ━━(゚∀゚)━━ァ!
俺の出番か
0201デフォルトの名無しさんNGNG
>>199 話についていけない漏れに、どれが正しいのか教えてクリ
0202デフォルトの名無しさんNGNG
>>200
先生出番です
0203デフォルトの名無しさんNGNG
K&RもC FAQも読んだことのない痛い>>194がいるスレはここですか?
0204デフォルトの名無しさんNGNG
>>194
C でも C++ でもいいから、
> 数値を期待するところにNULLを渡せばそれは0を渡したのと同じことになる。
が常に正しいことの根拠を示せよ、バカ。
0205玉三郎NGNG
ごめんなさい、早すぎました。
0206デフォルトの名無しさんNGNG
char* p = NULL;
if (p) {
} else {
}
でpは常に偽だけど、定数NULLが0とは限らないっていうんじゃないのか?
0207デフォルトの名無しさんNGNG
>>204
ネタニマジレスカコワルイ…
0208デフォルトの名無しさんNGNG
180=204はバカが口癖らしい
0209困っていますNGNG
C言語の標準ライブラリの一覧しりませんか?
0210デフォルトの名無しさんNGNG
>>206
NULLは0です。
というより、0をわかりやすいようにNULLにしてるだけ。
FAQ読むよろし。
0211デフォルトの名無しさんNGNG
ル━━(゚∀゚)━━プ!
0212デフォルトの名無しさんNGNG
漏れは>>196に賛成。NULLはヌルポインタ派。
0213180NGNG
>>208
バカばっかしだから、口癖になっちまったよ。言ってるそばから >>210
かよ...、当分直らねーな。
0214デフォルトの名無しさんNGNG
>>209
どうぞ。
http://www.google.com/search?hl=ja&q=C%8C%BE%8C%EA+%95W%8F%80%83%89%83C%83u%83%89%83%8A%88%EA%97%97&lr=lang_ja
0215デフォルトの名無しさんNGNG
さあ、やってまいりました輪廻転生のごとく蘇るNULL論争!
0216210NGNG
>>213
俺はちょっとスレ見たらNULL!=0とか書いてるバカがいたから書いただけ。
NULL!=0と#defineすることは可能だよ、別に。
そんな処理系も(そんなことしてるやつすら)みたことないけど。
0217デフォルトの名無しさんNGNG
#define NULL !0
やってみますた
0218デフォルトの名無しさんNGNG
http://www.catnet.ne.jp/kouno/c_faq/c5.html
0219デフォルトの名無しさんNGNG
#undef >>217
0220!206NGNG
>>210
それは逆
定数の0がポインタとして比較される時にNULLになる事が保証されているので、
time(0);
は
time(NULL);
になる事が保証されているが
exit(NULL);
が
exit(0);
になる事は保証されていない
0221デフォルトの名無しさんNGNG
#ifdef __2CH_CC__
#タイーホ >>217
#endif
0222180NGNG
>>216
あのね。C++ なら、#define NULL 0 って定義されてていいの。
問題はそうじゃなくて、

void *p = 0;
int n = (int)p;

って、やった時に n が 0 になるかどうかが問題なんだよ。

やっぱりわかってなかったか...。
0223デフォルトの名無しさんNGNG
>>220
定数の0がポインタとして評価されるときに”ナルポインタに”評価されることが保証されてるだけでしょ。
定数NULLがこの0と同様に振舞うならば、仕様の範囲でとりうる値は0くらいしかないと思うけど。
0224デフォルトの名無しさんNGNG
>>222
180のどこにそんなことが書かれているのか子一時間(以下略
0225デフォルトの名無しさんNGNG
ナルポインタ・・・・・(*´Д`)
0226デフォルトの名無しさんNGNG
>>223
NULLはポインタだから
eixt((void *)0);
になって、それが暗黙的に整数に変換された時に0を示すとは限らない
0227デフォルトの名無しさんNGNG
ただ今の戦況:両者膠着状態。ややバカ側が不利か。
0228デフォルトの名無しさんNGNG
>>227
ナル萌え派の勢力はどうなんだ?
0229180NGNG
>>224
バカはでてくんなよ。int n = (int)p; と
> int が要求されているところに NULL を渡すこと
の関連ぐらいはわからんか ? まあ、わかんねーから書いてんだろうけど。
0230デフォルトの名無しさんNGNG
ものすごい勘違いをしてるようなので指摘。

コンパイラが扱うヌルポインタとNULLは別物。
NULLはヌルポインタに変換されることが保証された定数値のdefineにすぎない。

#undefして再定義したとしても、それがヌルポインタに自動変換される値で有れば
規格外だが合法。

問題はヌルポインタを整数型に変換した場合の動作であって、
NULLが0と交換可能かどうかではない、というわけだね。
0231194-196NGNG
ごめんなちいこうさんしる。
0232デフォルトの名無しさんNGNG
>>230
#define NULL ((void*) 0)
の場合は「定数値のdefine」ではないね
0233デフォルトの名無しさんNGNG
>>232
型が違うだけで定数値でしょ
0234デフォルトの名無しさんNGNG
問題は、規格や動作じゃなくて、
exit(NULL);
とするのが、常識的なのかってことじゃないの?
0235デフォルトの名無しさんNGNG
>>234
俺は異常だと思う。
ところでintを引数にとるはずのexitでexit(NULL)の記述が出来ることが問題になる処理系では、
NULLは
#define NULL ((void*)0)
じゃなくて
#define NULL 0
とされているとみてかまわないのでは?
0236180NGNG
>>231
>>195-196 は、別に降参せんでもいいと思うが。

>>230
マッ、そう言うこっちゃ。大体、C++ にした時に Null とか言う定数を定義しち
まえば良かったのに、#define NULL 0 なんかでごまかそうとするからこんなこ
とになるんだよ。この点については Pascal がうらやましいよ。

>>207
ネタの割には、しつこいんだが。
0237デフォルトの名無しさんNGNG
null pointerが0じゃなくて特別な予約語(nullとかnilとか)
で表されていれば話が簡単だったのにね。
0238デフォルトの名無しさんNGNG
というわけでNULLは0という結論でよろしいか?
0239自作自演NGNG
>>226
eixtってなんやー
0240デフォルトの名無しさんNGNG
つまり、リッチータンのいけずぅ。
0241デフォルトの名無しさんNGNG
   _____
 /::\_____\
 |: ̄\∩`_´) \ 終わった?
 |:   :| ̄ ̄U ̄:|
0242デフォルトの名無しさんNGNG
さらば180。
0243デフォルトの名無しさんNGNG
0はいつでもNULLとみなせるが、
NULLを0とみなせるとは限らない。
0244180NGNG
>>234
議論するまでもないと思うが...。

>>238
C++ なら、それで OK。C なら、やっぱ ((void *)0) でしょ。

>>239
細けぇとこに突っ込むなよ。小姑みたいだぞ。
0245デフォルトの名無しさんNGNG
>>244
exit(NULL);だよね?
この状態ではNULLはintに暗黙に変換できなきゃ値の問題以前にコンパイルすら出来ないはず。
0246デフォルトの名無しさんNGNG
>>243
0がヌルポインタとして見なされるのは
ポインタが記述されるべきところに記述された場合のみ。
0247デフォルトの名無しさんNGNG
 __________________ 続いてたか
 |: ̄\     \★パタン
 |:   :| ̄ ̄ ̄ ̄:|
0248デフォルトの名無しさんNGNG
>>247
おいでよ、一緒に遊ぼうよ。
0249デフォルトの名無しさんNGNG
 __________________ 
 |: ̄\     \
 |:   :| ̄ ̄ ̄ ̄:| < 全然わからんもん
0250デフォルトの名無しさんNGNG
>>249
とりあえず適当なこと言えば親切な人が突っ込んでくれるから。
さ、出ておいで〜
0251デフォルトの名無しさんNGNG
      ,, ,=、  ,, , =、
     ff | }!、,、〃 / ″いやあぁぁぁぁぁ!!
      ,リ/ .ノ*´jコ`)'〃
    {{ { ′   v' 《
     ヾ.\.   \ヾ
     _,,二、》   ;  \. 三,_
  (( ゙ー=、`″〃 \. \-‐' ,))
        ゙ー=″     ゙' 一' 
0252デフォルトの名無しさんNGNG
型がどうであろうと全てのbitが0なら0になるんじゃないのか?
キャストで大きさは変わっても、bitの並びが変わることはないだろ?
0253デフォルトの名無しさんNGNG
ル━━(゚∀゚)━━プ! か?
0254デフォルトの名無しさんNGNG
>>252
((void*)0)のすべてのbitが0とは限らないよ。
0255180NGNG
>>245
それ以前に、exit(NULL) って書くか普通 ? 多くのコンパイラで、警告出しなが
らコンパイルはできるけど、コンパイルできりゃ良いって話じゃねーだろ。
0256デフォルトの名無しさんNGNG
>>254
なぜ!?
((void *)0)は0番地を指す値だろ?
0257デフォルトの名無しさんNGNG
>>255
NULLとvoidを混同していただけだろ・・・
0258デフォルトの名無しさんNGNG
NULLはポインタ型で使え
整数型んとこでNULLはいやん?
0259デフォルトの名無しさんNGNG
ループキタ━━━━━━(゚∀゚)━━━━━━ !!
0260デフォルトの名無しさんNGNG
>>256
コンパイラは0をポインタにキャストするとき適切な内部形式に変換する。
多くの実装では0なだけで、そうでないのも昔はあったそうだ。
0261デフォルトの名無しさんNGNG
>>256
だからそこが違うんだって。
たいていbit patternは0になるだろうけど、
そんな保証はないって話。
0262デフォルトの名無しさんNGNG
C言語を独学で習得しようと思うのですが
みなさんはどういう風に勉強しましたか?
私はC++Builderの使い方があまりよくわかりません
あれってやっぱり慣れなんでしょか?
それとも本を読んだりして勉強したのですか?
0263デフォルトの名無しさんNGNG
>>260
じゃあ条件式でNULLを偽とみるのは間違い?
0264デフォルトの名無しさんNGNG
とりあえずexit(NULL)はキチガイってことでよろしいか?
NULLが0とかどうかは実装依存なので無意味かと。
0265デフォルトの名無しさんNGNG
>>257
NULLとvoidをどう混同すればexit(NULL)と書けるのか
激しく問い詰めたい。

void main(){}だからreturn 〜;は使えない
↓
voidの値でexit()すれば(・∀・)イイ!

って論理か??
0266デフォルトの名無しさんNGNG
>>263
NULLは偽だよ。
0267デフォルトの名無しさんNGNG
以前ここでナルポインタは0であると保証されているわけではないと言ったら思いっきり叩かれたんだけど・・・・
C FAQ見ろとかいわれて・・・
0268デフォルトの名無しさんNGNG
NULLが偽になるのは規格で保証されている
0269デフォルトの名無しさんNGNG
>>267
ナルポインタとNULLを混同していたからでは?
0270257NGNG
>>265
きっとそうだろ。
・・・って言ったのは俺じゃないぞ!
0271デフォルトの名無しさんNGNG
例えばnull pointerがJavaみたいにnullという予約語で
表されるとしよう。

そのbit pattern(プログラマにとってはどうでも良い)が0
だとか、0番地を指しているとかいう保証は何もないよね。
実際のCでも同じ。nilのかわりに0と書くけど。
0272265NGNG
>>270書き方悪かったスマソ
0273デフォルトの名無しさんNGNG
そもそもナルポインタを作るために0を使うC言語の構文はどうかしてる。
C++の純粋仮想関数の = 0 もどうかしてる。
予約語作れよ。
0274デフォルトの名無しさんNGNG
>>264>>268
0じゃなくても偽になるの?
■ このスレッドは過去ログ倉庫に格納されています