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

C の超カンタンなことなら漏れに聞け

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
漏れは27才、、、今まで1ヶ月一生懸命Cを勉強してきた、、、
他の言語はHTMLしかできないが、例のスレがウイルスに犯されているのをみかねて、立ち上がった。
変数宣言、入力、出力、演算、条件文、繰り返し文、関数、ファイル処理、ポインタ、構造体、と入門レベルなら一通りできる。
あと構造体のチェイン、関数のポインタ、ビットシフト、共用体がわからんが、これもあと一ヶ月くらい勉強すればわかるだろう。
このスレでは、漏れが基礎レベルの質問に答える。しかし、俺様が5分以上考え込む難問は禁止だ。
0153デフォルトの名無しさんNGNG
NULL==0 は、NULLのビットパターンにかかわらず必ず成り立つから、かまわないのでわ?
0154デフォルトの名無しさんNGNG
>>153
整数定数0 と、ビットパターン0は別じゃない?
NULL == 0 が必ず成立することを規格は保証しているけど、
NULL == *(void*) &memset_zero_area は保証あるの?
# 超カンタンな問題ではなくてゴメン
0155デフォルトの名無しさんNGNG
>154
>NULL == 0 が必ず成立することを規格は保証しているけど
そうなの?
Cって実装依存じゃないの?
0156デフォルトの名無しさんNGNG
ポインタの文脈で 0 が使われると NULL と解釈されるだけで、
NULL = 0 ではない。
0157153NGNG
NULL==0 っていう式の値は1ってことは保証されてるよ。
==は必ずしもビットパターンの一致を検査するわけじゃないからね。
ただし、共用体やポインタのキャストを使ってNULLを整数だってコンパイラだまして整数定数0と比較する式は0になることもあるよ。
0158デフォルトの名無しさんNGNG
>>154
memset_zero_area ってのがなんなのか知らないからわかんない。
memset_zero_area ってなに? おせーて
0159デフォルトの名無しさんNGNG
char memset_zero_area[sizeof(void *)];
memset(memset_zero_area, 0, sizeof memset_zero_area);
ということだろう。
0160デフォルトの名無しさんNGNG
>>154
つーか NULL == *(void**) &memset_zero_area だな。
0161デフォルトの名無しさんNGNG
たとえば、NULLのビットパターンが0xa0000だとして、 NULL==(void *)0xa000は真かどうかってことかな?
0162Kusakabe YouichiNGNG
In article >>152, デフォルトの名無しさん/sage/152 wrote:

> NULLポインターが
> 内部では『0』じゃない場合がある
> って聞いたんだけど

「NULLが0なんじゃなくって、0がNULLなんです」! (定型)
0163Kusakabe YouichiNGNG
In article >>155, デフォルトの名無しさん/155 wrote:

> >154
> >NULL == 0 が必ず成立することを規格は保証しているけど
> そうなの?
> Cって実装依存じゃないの?

質問する前に規格書か文法書ぐらい読みましょう。
0164Kusakabe YouichiNGNG
In article >>157, 153/157 wrote:

> NULL==0 っていう式の値は1ってことは保証されてるよ。
> ==は必ずしもビットパターンの一致を検査するわけじゃないからね。

1行めはいいのですが、2行めは適切な教え方ではないですね。
0165157NGNG
>>164
>1行めはいいのですが、2行めは適切な教え方ではないですね。
ご指摘、感謝します。
0166162NGNG
>163
古い「ANSIC言語大辞典」という本を読んだが
「NULL == 0 が必ず成立することを保証」
という意味には取れんのだが..
C++に関してはNULLポインタの定義がしっかりしているが。
0167デフォルトの名無しさんNGNG
浮動小数点って何?
0168BCC32.141516NGNG
JPGの画像のwidthはどうやって得るの?
0169デフォルトの名無しさんNGNG
>>168
オフセット14バイト目からビッグエンディアン2バイト
0170デフォルトの名無しさんNGNG
>>166
void* p; において
p = 0; と p = NULL; は C++ では等価だか、Cでは等価を保証しない
(p == 0) と (p == NULL) は C++ でも C でも等価、つーことでしょ
0171デフォルトの名無しさんNGNG
>>127
ありがというございます。試してみます。
0172デフォルトの名無しさんNGNG
>>170
保証されるってば。保証されないのは、たとえsizeof(int) == sizeof(void *)
であっても*(int *)&p = 0 と p = 0が等価ではないということ。

なんかビットパターンが違うかもしれないということで混乱してるやつが
多いみたいだけど、sizeof(float) == sizeof(int)の場合(IA32はそうだね)に
float f = 1において*(int *)&f == 1 にはならなくてもf == (float)1になる
のと同じことだよ。
0173デフォルトの名無しさんNGNG
あー、保証されてるされてる。
なんかこの話題年に2回くらい見てる気がする。
0174デフォルトの名無しさんNGNG
#undef NULL
#define NULL "死ね"
0175166NGNG
「NULL == 0 が必ず成立することを保証」
の出典を教えてください。
保証しないと既存のプログラムが動かなくなる事はわかりますが。
0176Kusakabe YouichiNGNG
In article >>175, 166/175 wrote:

> 「NULL == 0 が必ず成立することを保証」
> の出典を教えてください。

っていうか文法書や規格書ぐらい読めば?
0177名無しさん@お腹いっぱい。NGNG
陽一コラ!!、早く寝ろよおまえ!!
こんな所で粘着してないでさっさと仕事さがせよ!!
わかったか? わかったらちょっとコーヒー買って来い!陽一!!!
0178デフォルトの名無しさんNGNG
お前ら。
臭がりすぎ〜
0179(-_-;)うぅNGNG
これ見ていただきたいんですが
やることは標準入力から数字を受け取って3乗して表示するものです。
p()のところでc=cは何を入れてるんでしょうか・・
ボーランドのだとコンパイルエラーになりませんでした。
実行すると入力した数字が表示されるみたいっす。


int main(void)
{
int a;
int (*b)(int a);

b=q;
a=atoi(gets("うんこ"));
printf("3乗は %d です\n",(*b)(a));

return(0);
}

int q(int a)
{
int c;
c=p(a);
return(c);
}

int p(int a)
{
int c=c;
printf("できるのか?→%d\n",c);
return(a * a * a);
}
0180Kusakabe YouichiNGNG
In article >>179, (-_-;)うぅ/179 wrote:
> ボーランドのだとコンパイルエラーになりませんでした。
> int c=c;

うーむ、そこも何をやりたかったか意味不明ですけど、

gets("うんこ")

ここもエラーにならなかったのですね:)

q()を介してp()を呼んでいる意味もなさそうですし、
bという関数のポインターを使う必要もないですね。
0181179NGNG
あ、ヘッダとプロトタイピング宣言は省きました。
0182デフォルトの名無しさんNGNG
>>179
c=c は、コンパイルエラーにならないとすると
正直何もしてないに等しい。

int c;
c=c;
と2行に分けて書いたのとほぼ等価行為なので
結局Cに何が入ってるかは神のみぞ知るってところ。
0183デフォルトの名無しさんNGNG

全てがスタックに取られたとしたら
スタックエリアはqが呼ばれた時に
 00 qのc
- 04 qからmainのreturnアドレス
- 08 qのa
- 0C mainのb
- 10 mainのa

となるから変ですね。 たぶん mainのa も qのcもスタックではなく
レジスタに割り付けられて、そのレジスタが同じというのが真相でしょう。

確か -S かなんかで出せる筈のアセンブラ出力してみて下さい。
0184デフォルトの名無しさんNGNG
>>176
ほんと、読解力ないね。
0185デフォルトの名無しさんNGNG
#include <stdio.h>

#undef NULL
#define NULL 1

int main( int, char** );

int main( int argc, char** args ) {
printf("Null is %d\n", NULL );
}
0186デフォルトの名無しさんNGNG
>176
>> 「NULL == 0 が必ず成立することを保証」
>> の出典を教えてください。
>っていうか文法書や規格書ぐらい読めば?

だから、さっさと出典だせ。
0187デフォルトの名無しさんNGNG
>>185
#include <stdio.h>
int printf(const char *format, ...) { return 0; }
int main()
{
 int c = 5;
 printf("c = %d\n", c);
 return 0;
}

何も表示されませんが、何か?
もちろん、標準ライブラリのprintf関数の動作は
規格で決まっていますが、何か?
0188デフォルトの名無しさんNGNG
そんな枝葉どうでもいいじゃん!
 おまえらpascalでもやれよ! 
0189デフォルトの名無しさんNGNG
「NULL == 0 が必ず成立することを保証」は、されていませんね。
#define NULL 0
があるから、0になってるだけで。
#define NULL 1
にすれば、「NULL == 0」は保証されません。
0190デフォルトの名無しさんNGNG
規格だと、
・ソースに現れた「0」は「ヌルポインタ」に変換される。
・NULLの定義は「0」もしくは「(void *)0」である。

この程度じゃ駄目か?
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
0191デフォルトの名無しさんNGNG
>>189
だからてめーの言う通りなら、
標準ライブラリの動作は全て「保証されていません」になるんだよ、バーカ
0192デフォルトの名無しさんNGNG
>>186
ISO/IEC 9899:1999
6.3.2.3
6.5.9
7.17
あたりかな。

ただし、NULLはstddef.hで定義されるマクロなので、明示的にも暗黙的にも
#includeしてない場合や、#undefして#defineした場合などは当然 NULL == 0
であるとは限らないけど、そんなプログラムはstrictly conforming program
じゃないから標準なんて気にするな。
0193デフォルトの名無しさんNGNG
http://members.tripod.co.jp/sweetparadise/i.index.html
0194デフォルトの名無しさんNGNG
お前ら「保証されている」って言葉の意味を考えた事ないですか?
0195デフォルトの名無しさんNGNG
ここで「保証されない」と言う人は、
「定数0」と「ビット列としての0」の区別も
「NULL」と「ヌルポインタ」の区別もしてないと思われ
0196デフォルトの名無しさんNGNG
「保証されていない」のは標準Cに準拠していないだけ。
「勝手に書き換える」のは「未定義の動作をひきおこす」だけ。
0197箱の臭いがするNGNG
気のせいか?
0198デフォルトの名無しさんNGNG
>>194
「int型はINT_MAXまでの値をとりえることが保証されている」

#undef INT_MAX
#define INT_MAX 1234567890123456789012345678901234567890

int i = INT_MAX;
printf("%d", i);

あれー?「保証されている」ってかいてあるのに、嘘じゃん。
0199デフォルトの名無しさんNGNG
結局「NULL は、プリプロセッサによってどんなコードに置き換わるかは不明だが、
NULL == 0であることは保証されている」ってことだな?
0200俺もそう思ったNGNG
>>197
気にするな。
0201デフォルトの名無しさんNGNG
mallocしたらexitするまでの間に必ず(以下略
0202デフォルトの名無しさんNGNG
>>201
お前の感じている感情は精神的疾患の一種だ
開放する方法は OS が知ってる OS に任せろ
0203デフォルトの名無しさんNGNG
すみません。ふと思いついて、

int n[1][1][1][1][1];

こういう配列を作ってみたんですが、
実際のメモリ上ではどういう構造になっているのか全く分かりません。

int n[5] とも違うようだし、
sizeof の値も sizeof(n) == sizeof(int) だし、
どなたかご教授願えませんでしょうか。
0204Kusakabe YouichiNGNG
In article >>203, デフォルトの名無しさん/sage/203 wrote:
> int n[1][1][1][1][1];
> こういう配列を作ってみたんですが、
> 実際のメモリ上ではどういう構造になっているのか全く分かりません。
int×2×2×2×2×2でしょ?

> int n[5] とも違うようだし、

どこから5がでてくるのでしょう?
0205デフォルトの名無しさんNGNG
>>204
> > int n[1][1][1][1][1];
> > こういう配列を作ってみたんですが、
> > 実際のメモリ上ではどういう構造になっているのか全く分かりません。
> int×2×2×2×2×2でしょ?
( ゚Д゚)ハア?
0206デフォルトの名無しさんNGNG
君ねー見た目が命だよ。
0207デフォルトの名無しさんNGNG
>>203
面白い。

>sizeof の値も sizeof(n) == sizeof(int) だし、
1x1x1x1x1で要素一つだから当然。
0208デフォルトの名無しさんNGNG
>203
その多次元配列のメモリレイアウトのこと?
0209デフォルトの名無しさんNGNG
基本的に下から順番に固まりになってる絵を想像すれば問題ない
0210デフォルトの名無しさんNGNG
>>204 pacalじゃないんだから配列指定は 最大じゃなくて サイズを示す
サイズは1だから メモリは 単なるintの変数と同じ
0211Kusakabe YouichiNGNG
>>207
たしかに、×2->×1ですね。(^^;

> > sizeof の値も sizeof(n) == sizeof(int) だし、
> 1x1x1x1x1で要素一つだから当然

というかもとの発言のひとは、何を確認したかったのだろう?
0212210NGNG
ただ、cの配列はサイズを越えたからといって叱ってくれる訳ではないので

n[x1][x2][x3][x4][x5] というように x1,x2,x3,x4,x5に 0以外を指定しても怒られない
0213Kusakabe YouichiNGNG
In article >>209, デフォルトの名無しさん/209 wrote:

> 基本的に下から順番に固まりになってる絵を想像すれば問題ない

下ってどっちですか?
0214デフォルトの名無しさんNGNG
>>213
ビルの窓から踏み出したら移動して逝く方向。
ご自身で確かめるよろし。
0215Kusakabe YouichiNGNG
In article >>210, デフォルトの名無しさん/sage/210 wrote:
> 配列指定は 最大じゃなくて サイズを示す
> サイズは1だから メモリは 単なるintの変数と同じ

そういえば、2ch.comp.programmerほうで、
「関数の引数に渡すときに&をつけるのがいやなので)」とかいう
だけの理由で、int a[1];みたいに書くとか言ってる人がいましたね:)
(それって、つまり代入や比較はその宣言したところではほとんどしなくて、
関数の引数に渡すばかりなんだろうか)
0216210NGNG
>215 スマン 判るように言ってくれ
 引数の宣言と 代入や比較とは?
0217Kusakabe YouichiNGNG
In article >>212, 210/sage/212 wrote:
> n[x1][x2][x3][x4][x5] というように x1,x2,x3,x4,x5に 0以外を指定しても怒られない

負の数は? > 0以外
0218210NGNG
>217 試してみなさい。
  たいていの環境では叱られないだろう
0219Kusakabe YouichiNGNG
In article >>214, デフォルトの名無しさん/sage/214 wrote:
> ビルの窓から踏み出したら移動して逝く方向。
> ご自身で確かめるよろし。

添字の小さいほうがどっちになるの?
0220デフォルトの名無しさんNGNG
>218
VC6.0でコンパイル。
警告、エラー
ともになし。
0221Kusakabe YouichiNGNG
In article >>216, 210/sage/216 wrote:
int a[10]; と宣言しておいて、

a[20] = 0; と代入してもコンパイル時に警告だしてくれるコンパイラーは
あまりないっていう程度の意味では?

# でも「0以外」ってのがよくわからん。そっちに関しては宣言時の話?
0222デフォルトの名無しさんNGNG
>>219
移動して逝きついた先で添え字を調べてみろ。
0223210NGNG
ええと、>>215の前半は
int func(int a[1])
{ なんとかかんとか
}

みたいに参照代わりに配列を使うという話と読んだ。

 がその話と後半 括弧内が繋がらない ので判らんと聞いた
0224デフォルトの名無しさんNGNG
間違ってオタオタ中ですか?
0225デフォルトの名無しさんNGNG
へー、素直に訂正することもあるんだー
0226デフォルトの名無しさんNGNG
>>225

間違いもあるさ。あんまり突っ込まないでやってくれ。
0227Kusakabe YouichiNGNG
In article >>224, デフォルトの名無しさん/sage/224 wrote:
> 間違ってオタオタ中ですか?
そういうことにしたいのですね:)
0228デフォルトの名無しさんNGNG
なんか必死だな。
0229デフォルトの名無しさんNGNG
>>223
どっちかというとこういうことじゃないか?

int func(int *);

int a[1];
func(a); /* &をつけない */
0230210NGNG
>>229 ああなるほど どうせそう書くなら
int func(int a[]); も一緒だし、そう書いた方がなんかいいと思えるよう
になったのは最近delphi漬だからかなあ
0231デフォルトの名無しさんNGNG
>>213
一番右の添え字。
配列のイメージってわかりますか?
0232203NGNG
レスありがとうございました。

n のひとつ分が多次元になるわけじゃなくて、
単なる n だったんですね。

勉強になりました。
0233デフォルトの名無しさんNGNG
そんな君に
「C言語ポインタ完全制覇」
をすすめる
0234デフォルトの名無しさんNGNG
うむむ、どう理解したんだか全然分からん。
0235デフォルトの名無しさんNGNG
>>232

次はジャパン言語を勉強してください。
0236デフォルトの名無しさんNGNG
int n[1][1][1][1] = {{{{1}}}};
0237デフォルトの名無しさんNGNG
n[0][0][0][0] = 1;
0238デフォルトの名無しさんNGNG
for (n[0][0][0][0] = 0; n[0][0][0][0] < 10; n[0][0][0][0]++)
 printf("%d\n", n[0][0][0][0]);
0239デフォルトの名無しさんNGNG
>238
メモリリークおめでとう
0240デフォルトの名無しさんNGNG
>>239 ハァ?
0241デフォルトの名無しさんNGNG
int n[1][1][1][1][1];
int i,j,k,l,m;
/* 初期化 */
for(i=0;i<1;i++){
  for(j=0;j<1;j++){
    for(k=0;k<1;k++){
      for(l=0;l<1;l++){
        for(m=0;m<1;l++){
          n[i][j][k][l][m]=0;
        }
      }
    }
  }
}
0242デフォルトの名無しさんNGNG
>>233
>「C言語ポインタ完全制覇」
これ(・∀・)イイ!
この本の著者さん、今度はJava本出したんだよね。
0243デフォルトの名無しさんNGNG
Javaでは何を完全制覇するの?
0244242NGNG
>>243
完全制覇じゃないけど、謎と落とし穴と解明するらしいよ。
0245デフォルトの名無しさんNGNG
そかそか。
0246242NGNG
ごめん…。
sage進行だったんだね…。
0247Kusakabe YouichiNGNG
In article >>227, Kusakabe Youichi/227 <[email protected]> wrote:

> In article >>224, デフォルトの名無しさん/sage/224 wrote:
> > 間違ってオタオタ中ですか?
> そういうことにしたいのですね:)

ほんものだったら「ということに」では? :)
0248Kusakabe YouichiNGNG
In article >>228, デフォルトの名無しさん/sage/228 wrote:

> なんか必死だな。

ということにしたいわけですか? :)

# えさやりすぎか?:)
0249デフォルトの名無しさん NGNG
>248
ふーん、で? 何怒ってるの?
0250デフォルトの名無しさんNGNG
糞壁改め餌壁
0251Kusakabe YouichiNGNG
In article >>249, デフォルトの名無しさん /sage/249 wrote:
> ふーん、で? 何怒ってるの?

おこってるっていうことにしてしまうと、何か安心するわけですね? :)
0252デフォルトの名無しさんNGNG
>>251
彼は質問してますね;)
■ このスレッドは過去ログ倉庫に格納されています