C言語のことは漏れに聞け!!<41>

このエントリーをはてなブックマークに追加
C言語ならオレに聞け。

問題をちゃんと切り分けて、Cの話かそうでないか洗ってから質問してくれ。
というより、聞く前に一応 Web で検索しろ。
コンパイラを探してるなら >>2 を見ろ。

GUIとか、C標準でできない事の質問は使ってる開発環境のスレに逝ってくれ。
ソース丸投げ、宿題、書籍 は専門の別スレがあるからそこへ逝ってくれ。

上記を守らない書き込みをした場合、その結果は禿しく未定義とする。


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/
推薦図書/必読書のためのスレッド PART6
http://pc3.2ch.net/test/read.cgi/tech/1033207156/


前スレ <40>
http://pc3.2ch.net/test/read.cgi/tech/1036673739/
前々スレ<39>
http://pc3.2ch.net/test/read.cgi/tech/1036409391/
>>1
おつ!
32:02/11/10 06:21
やっべ!
2はコンパイラ用だった、、スマソ
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
>>1
聞けを訊けにしろとあれほど......
        まもなくここは 乂1000取り合戦場乂 となります。

      \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
     /三/| ゚U゚|\      ,,、,、,,,                       ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \オーーーーーーーッ!!/
      //三/|三|\     ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ∪  ∪       (    )    (     )   (    )    )
 ,,、,、,,,       ,,、,、,,,  ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ,,、,、,,,       (    )    (    )    (    )    (    )

http://big.freett.com/scheme_a/num1000.swf
>>2
ワラタ
1000!
91:02/11/10 06:23
>>5
前スレの >>990 に「訊け」を「聞け」にしてくれと
言われたからそうしたんだが。
>>8
二進数かよ!
111:02/11/10 06:26

誰か過去スレ一覧を取得できる人がいたら載せてちょ。
>>9=1
なにぃっ!おいっ、責任者(前スレ990)出てこいっ!
誰だよ前スレの 990 は・・・。
1 も、漢字の意味を考えてくれ。

つーか、前スレを凄い勢いで終了させたのは誰だ。
142:02/11/10 06:27
>>12-13
なぁに?
訊←この漢字が格好悪いから。
次からスレ立てる人は、>>6 の AA デフォな。
>>14=2
ばかもんがぁ!しかも2getするという失態までおかしおって!
そろそろC言語の話題をしよう。
>>14 は、死ね・くたばれ・消えろ・失せろ・潰れろ・馬鹿・あほ・間抜け・ドジ。
ポンコツ・トンチキ・ガラクタ・クズ・ゴミ・カス・最低以下の下劣・下等種族。
劣等種族・下衆野郎・腐れ外道・邪道・外道・非道・ウジ虫・害虫・ガン細胞。
ウィルス・ばい菌・疫病神・病原体・汚染源・公害・ダイオキシン・有毒物質。
廃棄物・発ガン物質・猛毒・毒物・アメーバ・ダニ・ゴキブリ・シラミ・ノミ。
毛虫・蠅・蚊・ボウフラ・芋虫・掃き溜め・汚物・糞・ゲロ・糞虫野郎・ほら吹き。
基地外・デタラメ・ハッタリ・穀潰し・ろくでなし・ごろつき・ヤクザ者。
社会の敵・犯罪者・反乱者・前科者・インチキ・エロ・痴漢・ゴミ・シデムシ。
ゴミ虫・毒虫・便所コオロギ・詐欺師・ペテン師・道化師・危険分子・痴呆・白痴。
魔物・妖怪・悪霊・怨霊・死神・貧乏神・奇天烈・奇人・変人・毒ガス・サリン。
ソマン・マスタードガス・イペリット・クソブタ・ブタ野郎・畜生・鬼畜・悪鬼。
邪気・邪鬼・ストーカー・クレイジー・ファッキン・サノバビッチ・シット・ガッデム。
小便・便所の落書き・不要物・障害物・邪魔者・除け者・不良品・カビ・腐ったミカン。
土左衛門・腐乱・腐臭・落伍者・犯人・ならず者・チンカス・膿・垢・フケ・化膿菌。
放射能・放射線・鬼っ子・異端者・妄想・邪宗・異教徒・恥垢・陰毛・白ブタ。
ケダモノ・ボッコ・ろくでなし・VXガス・ヒ素・青酸・監獄・獄門・さらし首。
打ち首・市中引きずり回し・戦犯・絞首刑・斬首・乞食・浮浪者・ルンペン・物乞い。
放射性廃棄物・余命1年・アク・割れたコップ・精神年齢7歳・3審は必要なし。
不良品、規格外、欠陥品、不要物、埃、掃き溜め、吹き溜まり、塵埃、インチキ、居直り。
ふてぶてしい、盗人、盗賊、残忍、残酷、冷酷、非情、薄情者、ガキ、クソガキ。
ファッキン、ガッデム、サノバビッチ、シット、ブルシット、ボロ、ボッコ、妄信。
狂信者、有害物質、毒薬、猛毒、発ガン物質、誇大妄想狂。
他人の悪口は山ほどほざくが反省は一切しないガキ根性野郎、腐れ根性。
腐って歪んだプライドの持ち主、狭量、ボケ、ボケナス、アホンダラ、たわけ。
怠け者、無能、無脳、脳軟化症、思考停止、アメーバ、単細胞、蠅、蚊、カビ。
腐敗、膿、下劣、下等生物、劣等種族、クレイジー、マッド、ストーカー。
人格障害、守銭奴、見栄っ張り、ええ格好しい、粗製濫造品、偽物、似非
イカレ、乞食、浮浪者、ルンペン、狼藉者、放蕩息子、道楽息子、極道息子。
迷惑、困りもの、厄介者、村八分、異端者、アウトサイダー
大虐殺者。ナチスドイツ、731部隊、ポルポト派らと同類。

そして、こんな悪口を言うために労力を使う価値もないクズ
202:02/11/10 06:31
>>16
スマソ
リッチーとともに逝ってくる
>>20
ダイクストラによろしくな。
222:02/11/10 06:35
>>19
> ふてぶてしい、

これは正解
>>20
まさにカーニ犯
なんちゃって
2418-19:02/11/10 06:37
>>22
まあ、お約束の AA (?) という事で。
インフォシークの国語辞典を「聞く」で調べたら

 (4)(「訊く」とも書く)たずねて、答えを求める。問う。
   「名前を―・く」「自分の胸に―・く」

とあったぞ。
「訊く」ではヒットしなかったし、別にいいんでない?
262:02/11/10 06:39
>>24
分かっているよ。
随分とまた懐かしいコピペだ。
きく、なんてややこしい言葉使うからダメなんだ
次から
「C言語のことなら朕に尋ねよ」
にしよう
(・ロ・)ホ,('ロ')ホ--ッッ!!!… C言語質問スレ PartX

これがいい。
つーか周りに合わせて、「C 相談室」 でいいやん。
元々のスレタイが、ビルジョブスの好き勝手で付けたものだし。
「C (゚д゚)ウマ-」 「C (゚Д゚)ハァ?」 「C (・∀・)イイ!!」 「C ( ´,_ゝ`)フーン」 「C ヽ(´ー`)ノ ヤレヤレ」 「C (゚∀゚) アヒャ」
いっそシンプルに「C」だけでいいんじゃない?
見つけにくいだろ
C, or not C. That's the question.
「Cと、土曜深夜の愉快な仲間たち」
371:02/11/10 07:24
>>35-36
おお!どうもありがとう。
http://piza.2ch.net/tech/kako/967/967985026.html

Part1の>>1って痛いな、、、
20 名前: 名無しさん@お腹いっぱい。 投稿日: 2000/09/04(月) 00:50
悲惨な1スレの予感…
まだ起きてるのか・・・
今は何してるんだろう・・・
93 名前: ビル・ジョブス 投稿日: 2000/09/09(土) 16:17
>91
おぅ!そりゃ知ってるよ!おまえみたいなおバカなクソガキに
言われるまでもない。
ちなみに今は、CEがメインだからUnicodeオンリーだけどな!
誰か 35-36 のサマリー作る勇気のある奴いないか?
43デフォルトの名無しさん:02/11/10 09:40
アサートすると、標準出力にメッセージを出しますよね? ね?
でも、クロス環境などで、ターゲットに標準出力がないばあい、やっぱ
アサートさんを書き換えないとだめ? ですよねえ、きっと....
44Booleanなら:02/11/10 12:03
if(BOOL)、
if(!BOOL) or if(!(BOOL))
だよ!==は絶対変だよ!
またコテハン考えなきゃだめってことか・・・
>>44
一生やってろ!
47デフォルトの名無しさん:02/11/10 13:36
math.hのpow()ってどういうアルゴリズムになってるんでしょうか?
ググったんですが、いいサイトが見つからなくて…
ソース見ればよい
前スレにでてたと思うが。
50デフォルトの名無しさん:02/11/10 13:45
>>49
あ、そうなんですか。見てみます。

>>48
そう思ったんですが、どうやって見るのか分からなかったので…
すみません。
>>47
アホなりに考えてループ作ってその中でかけ算。
>>51
脳みそ入ってるか?
http://gcc.gnu.org/
gccってこっからダウンロードするの?
英語ばっかで意味わかんないんだけど・・・
だれか教えて!
>>53
glibc じゃなくって?
>>54
それは何者!?
5653:02/11/10 13:57
なんか色々やってみたら、gcc-3.2.tar.gzってファイルをダウンロードできたんだけど
これ違う?
57デフォルトの名無しさん:02/11/10 14:01
5847:02/11/10 14:04
exp(y * log(x))
って感じで計算してるみたいですね。

ソースいろいろ探してみたんですが、見つかりませんでした。
VC++のMATH.H見てみましたが、意味が分からなかったです…
59デフォルトの名無しさん:02/11/10 14:06
>>53
英語わからんのだったらbccにしとけ。
6047:02/11/10 14:07
>>57
ありがとうございます。
これだけ複雑だとやっぱりpow(x,3.0)よりもx*x*xの方がアルゴリズム的に優れてそうですかね?
>>60
アルゴリズム的に、ってのが分からんが速いのは確か
6247:02/11/10 14:19
>>61
分かりました。サンクスです!
>>60
乗算の繰り返しだと有効数字の大きい実数で桁落ち起こすんじゃないか?
log使うのは精度保つためだと思ったな。

スピード的にも3乗くらいならそれでもいいがな。
6453:02/11/10 14:33
>>59
今BCC使ってるんだけど、gccの方がいいかなあって。
学校はGCCとVC++なんだよねー。
あー・・・
今ビット演算を勉強してるんですけど、
こんなこといったいどういう時に使うんでつか?
>>65
バイトより細かいレベルでデータを処理したいとき。
67デフォルトの名無しさん:02/11/10 14:52
集合としてあつかうとき
フラグ
69デフォルトの名無しさん:02/11/10 15:04
ブラクラ
通報しますた
>>63
なんで精度が良くなるの?
詳細キボンヌ
7247:02/11/10 15:40
すみません。最後にひとつ。

pow(x,y)のyがdoubleの時はlog介してるため、powは遅くなりますが、
yがintの時ってどうなるんでしょうか?

double ipower(double x, int n)
{
int abs_n; double k = 1.0;
abs_n = abs(n);

while(abs_n != 0){
if (abs_n & 1){
k *= x;
}
x *=x;abs_n >>=1:
}
if (n>=0) return k;
else return 1/k;
}

って、感じだと思うんですが…やはり、直接やるよりはどっちにしても遅いですかね?
>>72
直接って何だ
ソースはglibcやBSDのを探して嫁
一般的なアルゴリズムの解析はKnuthの本とかにある
これ以上はアルゴリズムスレか数値計算スレにいくべし Cとは関係ない
それとアルゴリズム事典丸写ししたら、ひとことそう書け
75那由多 ◆F4E74ZBQPA :02/11/10 17:30
>65
低位レイヤーのアプリ作るとき、回線のデータから必要なデータを
取得したりするのにマスクしたビットをシフトさせて使うよ。

マジレスしてしまった。
76 :02/11/10 17:30
.NET Framework SDKをダウソしたらCコンパイラも付いてきた。
(こちらもコンパイルはコマンドラインからだが)

VB、C#しかついてこないと思っていたから、ちょっとトクした気分。

160MBのダウソはつらかったが・・・。
恐れ巣だが…
pow(x, y)がexp(y, log(x))を計算している理由は、
yが整数でない場合を考えれば明らかだろう。
78 :02/11/10 17:33
>>65
2倍、4倍、8倍などしたいときや、1/2、1/4、1/8したいとき、
通常の掛け算/割り算命令より早くできる。

例:左に1ビットシフト:2倍
右に1ビットシフト:1/2
>>72
logはきわめて多項式で近似しやすい関数として知られている。
expもそう難しくない。
powの演算回数は、キミが書いたものより平均では少ないかも。
80JPS ◆M0LaMzf5rY :02/11/10 18:14
これ何処まちがってる?
#include <stdio.h>
#include <math.h>
int main(void)
{
unsigned x;
int s;

printf("自然数を入力してください:");
scanf("%u",&x);
printf("何ビットシフトしますか:");
scanf("%d",&s);

printf("%uを左に%dビットシフトした値は%uです。\n",x,s,x<<s);
printf("%uと2^%d乗の積は%uです。\n",x,s,x*(pow(2,s)));
printf("%uを右に%dビットシフトした値は%uです。\n",x,s,x>>s);
printf("%uを2^%d乗で割った商の整数部分は%uです。\n",x,s,x/(pow(2,s)));

return(0);
}
>>56
OS は?
Redhat 系 Linux だったら rpm でインストールすればいいし、
Windows なら mingw や cygwin が楽。
powはdoubleを返す。
printf("%uを左に%dビットシフトした値は%uです。\n",x,s,x<<s);
printf("%uと2^%d乗の積は%uです。\n",x,s,x*(1<<s)));
printf("%uを右に%dビットシフトした値は%uです。\n",x,s,x>>s);
printf("%uを2^%d乗で割った商の整数部分は%uです。\n",x,s,x/(1<<s));
>>81
cygwinはインストールしたけど
意味不明
84JPS ◆M0LaMzf5rY :02/11/10 18:19
>>82
doubleか。
そうじゃなくて、ビット演算と2のべき乗で同じ値が出ることを
確かめるプログラムを作ろうとしてた
>>80
> printf("%uと2^%d乗の積は%uです。\n",x,s,x*(pow(2,s)));
> printf("%uを2^%d乗で割った商の整数部分は%uです。\n",x,s,x/(pow(2,s)));
%uじゃdoubleを正しく表示できないダロー
printf("%uと2^%d乗の積は%uです。\n",x,s,x*(int)(pow(2,s)));
printf("%uを2^%d乗で割った商の整数部分は%uです。\n",x,s,x/(int)(pow(2,s)));
87JPS ◆M0LaMzf5rY :02/11/10 18:21
>>85
知らんかったから。doubleは%fだべ。
またひとつ賢くなった
>>83
インストーラ(setup.exe)に devel というカテゴリがあるので、
そこにあるのを全部選択してインストールすべし。
>>88
なんかさ、DOS窓見たいのが出てきたんだけど
それ使う?
90デフォルトの名無しさん:02/11/10 18:24
同じC言語をやっている仲間としてお願いがあります。
構文解析木について教えてください。出来ればサンプルプログラムと簡単な解説もお願いします。
よろしく。
ぐぐって自分で有益な情報を探そう。
ビットシフトが2のべき乗倍になるのはあたりまえだよね。
n進法で1桁ずらせばn倍(n分の1)したことになる。
x桁ずらせばnのx乗倍(nの-x乗倍)したことになる。
10進で考えてわからんならくそして寝たほうが良い。
>>90
教科書1章分の内容をここに書けってか?
>>89
そ。Cygwin Bash Shell というタイトルのウインドウで作業をする。
gcc -v と打ってみな。
9590:02/11/10 18:31
>>93
同じ仲間じゃあないですか。
ここに書いておけば次に同じ質問がきたらここをみろ、っていえるし。
よろしくブラザー。
96デフォルトの名無しさん:02/11/10 18:32
>>92
(病理学的なぐらい)厳密には、C89 の規格ではそうとは限らない。
>>95
やったら荒らしに近い行為になるぞ。
98JPS ◆M0LaMzf5rY :02/11/10 18:35
>>92
わからないとでも思ってんのか?
本に載ってたのをpow()を使ってやってるだけだよ
分からないやつがいるかもって思うお前のほうが寝たほうがいいよw
>>98
やってみないとわからないようなやつはくしして寝たほうが良い
すまんな、s++もわからん人が多いもんでな。
>>98
すぐ煽りにつられるようなアフォは糞して…
C++はわからない
構文解析木とは、構文を解析した結果できる木構造のこと。
これで良いだろ。
>>102
あれは覚えようとする気力をなくす言語だ。
C言語やってるだけでブラザー呼ばわりされても…
106JPS ◆M0LaMzf5rY :02/11/10 18:45
>>99
日本語理解できない香具師は死んだほうが(・∀・)イイ!
>本に載ってたのをpow()を使ってやってるだけ
>>106
DQNなプログラムをコテハンでさらす厨房のくせに態度でかいよ(w
108JPS ◆M0LaMzf5rY :02/11/10 18:47
>>107
お前も昔はこうだったんだろうが。
態度のでかさに経験なんか関係ないよ。
才能だけ。さ・い・の・う。わかる?
で、>>80のプログラムはちゃんと動くようになったのか?
コテハンのネタレスと厨房の煽りのみで続いてるスレはここですか?
>>108
たしかにその態度のでかさは才能だろうがウザイ。
少なくとも漏れはお前みたいな間違いをして、人に聞かないとわからない
なんて間抜けな経験はない。
>>111
ネタですた。
次のDQNなプログラムはまだかい?
次はどんな恥さらしプログラムの相談かな?
115JPS ◆M0LaMzf5rY :02/11/10 18:51
>>109
なったよ。doubleだって知らんかったけど%fで解決した。
まあ>>111みたいな中途半端な煽りはつまんねーけど
またここに来てやるよ。お前らを使ってやってるんだから
ありがたく思え。
>>115
こっちがありがたく思うんかい。
               ,,,,,,,,,,,,_,, ,,,,
            ,,、‐'"~    'i.゙i''i,ヽ...,
          ,.r'''       i''゙ノ ゙゙,ニ''く
         /         r‐'''''i i, (" ヾ,
         ,'       ,   ゙~´゙ー ゙´  .',
        ,'  ,: _,/,,_:;.;l ,l i   .!.l.l',.i.l:.. , l ,i,l
        i l l .::/.,rツ=リ,ji'!;|:.:j;rl≦ト、;' j:. lj'
        l,. l.l.::/-'〃i'''i, ',ソ!ンシr'i.゙'リ|/://:リ    異議あり!
        ,' 'ivl/" lゝ'l  '"'゙ l'r'! ィンシ /'
       ,'  :::{ r,  ''゙‐゙   ..iソ {ノ"             ,、‐''""''、
        /  .:::゙'‐-、.   --    ノ           ,、‐゙     ',
.      /,r''''''ー‐--、:'i‐ 、、,,,,,.、 -''゙ ゙、         ,、-'"       j
      //   、 ,,,_ヾ、    ト、;;;;;::. ゙、、-'" ̄~~~゙゙゙"          /
    //   、` ~  ~゙''''''''''"~´  ゙'ソ.      ',        ....::::::::::::/
.    //   ... ´        .::::;/       ゙、..... ........:::::::::::::::::::::/
   / '、:....:::::",         .:;rj゙         ゙、;;;;::::::::::::::::::;;;;、-''゙
.  /   ヽ;:::::"._      .:::i';/     ゙、      ゙、`~~~゙゙~‐- 、、、..,,_
. ,'   .:::::ヽ、;;;;;>、:::...  ::::r'        ゙、     ゙、::::::         ヽ
 i  ,: ::::::;:::::l:::',:::::::::゙i'r、;:::::::!.  ヽ      ゙、    .::〉::::::....      }
. l  i::.:::::i::::::l:::::',::  l:/;;;::゙'ーr゙、   ヽ    ゙.、.:::::;/'ー 、、;;;;____;;::、-'"
|l :!::::::i:::::::l:::::::}、 l:::::::~゙''''! i .........ヽ........:::::;r゙''"
. l l l::::::i::::;;;、、、/.  l::::::::::::::l  .〉、;;;;;;::、-'rーi''゙
 l,l l:::::l:::::i,:::::;;;;;ヽ,ri;;;;;;;;;;;;;j::::/;;;;;;;;ノ:..  |: j
ありがたく思うからさっさとDQNプログラムで笑わしてくれ。
119JPS ◆M0LaMzf5rY :02/11/10 18:55
ていうかよ、malloc()の仕様がよくわかんねーんだよ。
先頭のアドレスを返すってことはさ、
int *vc;
vc=malloc(sizeof()int*size)ってやるとさ、vcにはsizeof()int*size分の確保された
メモリの先頭アドレスが返ってくるんだろ?
したらvcは配列になるってことだろ?
これが可変長配列ってもんだろ?
120JPS ◆M0LaMzf5rY :02/11/10 18:57
あ、プログラムか。ちょっと待ってて。
>>119
違うけど、そう思ってプログラム書いても大丈夫といえば大丈夫。
122デフォルトの名無しさん:02/11/10 18:57
vc=malloc(sizeof(int)*size)
123JPS ◆M0LaMzf5rY :02/11/10 18:57
>>121
どこが違う?
124121:02/11/10 18:57
ちょっとまて、sizeof()intってなんだ?sizeof(int)だろ
125JPS ◆M0LaMzf5rY :02/11/10 18:58
>>122
( ̄□ ̄;)!!
DQNさらしちまった
126121:02/11/10 18:58
>>123
vcはあくまでもポインタ。配列じゃない。
127JPS ◆M0LaMzf5rY :02/11/10 18:58
おkおk。間違っただけだから。
で、121よ、どこが違う?
>>119
考え方としては合ってるけど、可変長配列というと
別のものと紛らわしい。
129121:02/11/10 18:59
>>128
reallocで大きさを変えられるから可変長配列でもいいんじゃない?(笑)
俺はそうは呼びたくないけど、、、
130JPS ◆M0LaMzf5rY :02/11/10 18:59
>>126
お。分かった気がする。
可変長なのはvcの先にあるものね。
vcは常に、その先にある配列の先頭のアドレスが入ってるから・・・
んー。わかったかも。
131JPS ◆M0LaMzf5rY :02/11/10 19:00
>>128
別のものってなんだあ?
ちなみに可変長配列は前橋の影響ですた。
vcの指すもの(mallocの返したメモリブロック)は
配列だといってまちがいあるまい。
前橋・・・
可変長配列って言ったら
void foo(n)
{ int a[n];
...
みたいなやつのことだろ。
>>134
最近のCだけだな。それできるの。
136121:02/11/10 19:05
可変長って途中で長さを変えられるという意味じゃないの?
137121:02/11/10 19:07
時と場合によって確保する大きさがかわる配列という意味か、、、
規格でvariable length arrayといえば>>134の指すようなものだな。
あとは、
void f(int m, int c[m][m])
みたいなのとか。
すみません、 >>1 さんに質問なのですが、
未定義と禿しく未定義の違いを教えてください。
あれ以来夜も眠れません。今朝だけど。
140121:02/11/10 19:09
>>138
OK
そういえばint a[10]は固定長配列って言われるしね。
141JPS ◆M0LaMzf5rY :02/11/10 19:11
>>134
void foo(n)って関数でしょ。
仮引数のnの型指定しは?
そんなのみたことない・・・
142JPS ◆M0LaMzf5rY :02/11/10 19:13
はっ!またDQNだったな。
void foo(int n)
{
   int vc[n],i;
   for(i=0;i<n;i++)

みたいな感じか!?
>>141
そんなとこつっこむなよ
144JPS ◆M0LaMzf5rY :02/11/10 19:14
>>143
いや、マジレスだった。なんだこれは!?って。
厨でスマソ。
145134:02/11/10 19:14
>>141
int書き忘れただけだよ。
でもちゃんとコンパイルして動かせるけどな。
146JPS ◆M0LaMzf5rY :02/11/10 19:14
>>145
マジで!?やってみる
>>146
コンパイラがC99に対応していないとだめだぞ。
VC++6.0なんかは対応していない(1998年発売だから当たり前だけど)
そうかー、昔風の
void foo(n)
int n;
{
のint n;は略してもいいんだっけ。
149JPS ◆M0LaMzf5rY :02/11/10 19:21
てゆーか、>>134ってこういう事?
#include <stdio.h>

void foo(int n)
{
int vc[n],i;

for(i=0;i<n;i++)
vc[i]=i;

for(i=0;i<n;i++)
printf("%d\n",vc[i]);
}

int main(void)
{
int n;

scanf("%d",&n);

foo(n);

return(0);
}
コンパイル不可能なんだけど。
int *ip = malloc(sizeof(int));
*ip=100;
はわかるのですが、
int *arrayp = malloc(sizeof(int)*n);
arrayp[n-1]=-1;
で、なぜipとarraypが同じ型なのかわかりません。
1つの変数も配列も同じものなんでしょうか?
>>151
なぜって同じint *で宣言しているじゃん
それと、mallocで得た領域を配列と見なすのならば、前者は要素1の配列、後者は要素nの配列
153JPS ◆M0LaMzf5rY :02/11/10 19:26
>>151
ipとarraypは両方ともintへのポインタ型だべ?
mallocは確保した領域のアドレスの先頭へのポインタを返すから
ポインタ型じゃないと代入できない。
154JPS ◆M0LaMzf5rY :02/11/10 19:28
>>150
それだけの問題なんすか。
ちなみにbcc5.5がどうかわからん?
>>152-153
「なぜ同じint *で宣言すべきなのか」が聞きたいのです。
片方は整数1個へのポインタ、
もう一方は整数の配列へのポインタなのに。
>>154
.cppという拡張子にすればコンパイルできるのでは。
>>155
一個でも配列は配列だ。
mallocはポインタを返す。だからポインタで受け取るべきだろ。
>>155
ひとつ聞くが、
int i[1];と宣言した場合、i=4;なんてできると思うか?
>>157
ipは配列へのポインタなのですか?intへのポインタだからint *だと思ってました。
>>158
いいえ。
>>155
どちらも整数配列へのポインタとみなしてかまわない。
ipの方は要素数=1 の配列(の先頭アドレス)とみなす。従って、
ip[0] = 100;
という操作も可能。
161デフォルトの名無しさん:02/11/10 19:51
>>158
なに言ってるんだ?大丈夫か?
>>161
>>155が要素数1のint配列を単なるint型変数と同じだと思っているみたいだから言ったまでですが。
なぜ「整数へのポインタ」と「整数配列へのポインタ」が
同じ型なのか、という点がまだわからないんですが…
int *ip,i,ia[1];

ip=&i;
ip[0]=10; /* OK */
ip=ia;
ip[0]=10; /* OK */

これが分かれば理解できると思う。
>>162

int i;は整数1個が入る変数で、配列ではありませんよね。
それは最初からわかってます。
>>164
整数と、整数1個の配列は同じということですか?
>>166
int iとint ia[1]は確保する領域の大きさは同じ。
int *はそのアドレスを入れる変数だから、、、
>>167
じゃあ、整数10個の配列へのポインタは別の型なんですか?
int *ip , i , ia[1];

ia = &i;
*ia = 3;
printf("%d\n",i) => 3
ってことですね。
char array[sizeof(int)];
int *ip=(int *)array;

*array=10; /* こういうのもできるはず */
171170:02/11/10 20:01
*array=10;じゃなくて、*ip=10;
>>170
コンパイラ依存(arrayがintと同じアドレス境界に整列されている保証はない)。
>>170
メリットは?
素直にmallocしろって
>>170
なんのメリットがあるか書いてください。
メリットが無いことを教えないでください。
176170:02/11/10 20:03
>>173
メリットなんかねーよ。
必要な領域さえあればそれをint型とみなして扱えると言いたいだけ。
>>172
あんた何いってんの?
「整数へのポインタ」と「整数の配列へのポインタ」に区別がないのに、
「整数の配列の配列へのポインタ」とは違う型なのはなぜですか?
>>177
170で「できる」と書いているのは嘘だということ。
「できる環境もある」が正しい。
#sizeof(int) = 4と仮定して考える。

p = malloc(sizeof(int))では
[<- 4 byte ->]
というメモリが確保されるとしよう。

p = malloc(sizeof(int)*n)では
[<- 4*n byte ->]
というメモリが確保される。Cでは、これを配列とみなして
[<- 4 byte ->][<- 4 byte ->].....[<- 4 byte ->] (=要素数n個)
という「n個の要素をもつint型の配列」として使うことができる。

で、最初の例に戻ると、p = malloc(sizeof(int))で
[<- 4*1 byte ->]
というメモリが確保され、これは
[<- 4 byte ->] (=要素数1個)
と等価なので、pを「一つの要素をもつint型の配列」として使うことができる。
>>176
そんなこたー無い。
>>175
お前さぁ、知識はあればあるほど得なんだよ。たとえどんなものでも。
情報の取捨選択も出来ずにごちゃごちゃほざいてるお前、才能無いと思う。
>>179
なんでよ!?
sizeof(int)分配列を確保すればそこにint型の値を入れられるだろ
>>183
「アドレス境界」と「アドレスの整列」という言葉を理解しているか?
>>184
配列(mallocは除く)は連続した領域だってわかっている?
>>180
最初の質問者です。なんとなくわかってきました。
区別できないから同じ型とみなすということですね。
では>>178にも書きましたが、配列の配列も同じ並びかただと思うのですが
なぜ型が違うのでしょう?













































































>>185
あたりまえのこと聞いてごまかすな。
境界と整列について知らないなら知らないといえ。
>>184の言うとおりだとしたらmemsetやmemcpyはどうやって実装すればいいんだろ(ワラ





















言い負かされたからって荒らすなよ。
小学生か(w





























>>193
誰のこと?
このDQNぶりはどうみてもJPS
配列に詰め物があるとでも言いたいのかな。
構造体じゃあるまいし・・・






















>>191
おいおい…charは整列する必要がない。
char単位でコピーなり比較なりすればよい。
たとえば1/sizeof(int)回で住むからといって
memcpyやmemchrをintを使って読み書きするように書くか?
>>197
char配列の先頭アドレスがint境界に整列してる保証があるわきゃねーだろ
ヴォケが。
自分の無知を棚に上げてよく言うよ。
暴れるなよ >>170=>>197=JPS
>>199
memcpyは複数バイト単位で転送してると思うぞ。
いつのまにか荒れてるな…
alignment bouncaryを知らない厨房が1人、大勢のふりして暴れてるのか。
204 ◆JWPaeN65Rw :02/11/10 20:18
>186
> では>>178にも書きましたが、配列の配列も同じ並びかただと思うのですが
> なぜ型が違うのでしょう?

とは・・・・

>「整数へのポインタ」と「整数の配列」
=>int a;(int a[1];)
==>int *a_p;

>「整数の配列の配列」
=>int b[10][10];
==>int **b_p;

a_pとb_pの違いのことを言っているのか??
>>202
ああ、なるほど。最初と最後の未整列のところだけcharで書けば
できるかもね。でもホントか? 
数十バイト程度だと、かえって遅くなりそうな気がするが。
>>205
memcpy(or strcpy)の実装についてつい最近この板で議論されていたと思う
のだが、どこだったか見つからない。
207JPS ◆M0LaMzf5rY :02/11/10 20:23
俺じゃねーよ。
おれはちゃんと説明したし・・・
153 :JPS ◆M0LaMzf5rY :02/11/10 19:26
>>151
ipとarraypは両方ともintへのポインタ型だべ?
mallocは確保した領域のアドレスの先頭へのポインタを返すから
ポインタ型じゃないと代入できない。

しかも今ボンバーマンやってたしw
>>170 プ
char c[sizeof(int)];
がint型として扱えるだって(w
なんちゅーDQNだ(禿藁
209JPS ◆M0LaMzf5rY :02/11/10 20:24
俺もこの論争に参加していいでつか?
>>208
なんで扱えないんだったっけ?
できるかぎりlongバイトごとコピーして、あまりを1バイトずつコピーするってものじゃなかったか?>この前のmemcpy
memcpyをインライン展開するコンパイラもあるよね。
複数バイト単位で転送してたらかなり大きいコードになりそうだが。
213JPS ◆M0LaMzf5rY :02/11/10 20:28
memcpyってなんだ?
なんてヘッダで定義されてんの?
214JPS ◆M0LaMzf5rY :02/11/10 20:29
stringか・・・
これと似たやつでさ、strなんとかってなかった?
どう違うの?
>>214
燃料注入してるつもりか?

























217JPS ◆M0LaMzf5rY :02/11/10 20:32
>>215
やべー意味わかんねーよ
どういう事?
void func(void *p1,void *p2)
{
int i;
long *lp1=p1,*lp2=lp2;
for(i=0;i<4;i++,lp1++,lp2++)
*lp1=*lp2;
}

きちんとコピーされる保証はない?
219218:02/11/10 20:36
元データ示した方がいいか。
long = 4バイトとして、
char p1[1024],p2[]="aaaaaaaaaaaaaaa";
これでfunc(p1,p2);を呼ぶ
>>218
いったい何をやりたいコードなのか?
221218:02/11/10 20:37
*lp2=lp2;のところは*lp2=p2;に修正
>>218
保証はないね。
223218:02/11/10 20:38
>>220
long=4バイトとして、p1にp2を16バイトコピー
224218:02/11/10 20:39
この前のmemcpy論争はこういうものだったはずなんだが・・・
225JPS ◆M0LaMzf5rY :02/11/10 20:39
なんでvoid*?
きゃらにしとけや
あとなんでforの条件が<4なの?
さらに*lp1++=*lp2++;
これでいいんでない?
>>222
どのあたりが?
x86のglibcのmemcpyのソースを見てみた。
32バイト以下、またはsrc, dstどちらかが4バイト境界に整列して
いないならば、バイト単位でコピーしてる。
32バイトより大きくて、両方が4バイト境界にそろっている場合のみ
ワード単位でコピーしてる。
>>226
char配列の先頭番地が、long境界に整列しているという保証はない。
アライメント違反例外が発生してもOSが対処してくれるかもしれないが、
いずれにしても処理系依存だな。
>>229
そうだね。
あと、もし1回の読み書きごとに例外が起きてOSに落ちたら、
恐ろしく遅くなるね。
>>229
そう言う処理系ではコンパイラがwarning出すと思うよ。
ととと.
つーつーつー.
ととと.

>>231
void *との間のキャストでは警告の出しようがないだろう。
>>170見て思ったけど、
char一文字の領域のアドレスが整列化で語アドレスになるのは分かるが
charの連続した領域はバイト単位で詰め込まれるんじゃないの?
(alignment restrictionがあったとしても。)
少なくとも俺の環境ではバイト毎だった。
そうならないアーキテクチャがあるってこと?
それとも全く別の理由で>>170は叩かれてるの?
ちょっと教えて欲しい。
>>236
ひとめで知ったかとわかる(w
>>236
もちろん
char array[sizeof(int)];
で、array[0], ..., array[3]は連続したアドレスに割り当てられる。
それは規格で保証されている。
問題は、たとえばintを4の倍数アドレスに置かないとロードやストアが
できないCPUで、array[0]が4の倍数アドレスに置かれる保証がないことだ。
>>238
じゃあint *ip=malloc(sizeof(int));ってやって、ipが4の倍数のアドレスじゃなかったら、*ip=1024;とかできないってこと?
そういう処理系では必ずmallocは4の倍数のアドレスを返してくれるとか?
>JPS
わからないんだったら、とりあえず、見とけ。
議論をさえぎらないでくれ。

215の「燃料注入してるつもりか?」は火に油を注ぐと言う意味だ。

#・・あとで、ゆっくりググルか、落ち着いた頃にスレを読みなおせば
#わかるはずです。


>>240
mallocは常に適切に整列された結果を返す。
そうでない処理系は規格違反。
こ、これが週末のCスレというものなのか・・・・!!
>>238
じゃあint iと宣言した領域をcharの配列として使うのはOK?
>>237
氏ね。

>>239
違うよ。

>>238
なるほど。
ということはmemcpyに与えたアドレスが4の倍数じゃなかったら、いきなりlongバイトごとコピーすることはできないってわけか。
>>244
それはOK。でないとmemcpy等にint *を渡せなくなる。
248JPS ◆M0LaMzf5rY :02/11/10 21:05
>>245
ワロタ
傍観者JPSです。すぱーーーー
>>246
できない。
x86では境界に整列していなくても読み書きできるが、激しく遅くなるので
やらないほうが良い。
volatile
大活躍。
>>249
そうか。またひとつ賢くなったよ。ありがとう。
>>170はchar配列じゃなくてchar *にmalloc(sizeof(int))を入れるようにすればOKなんだろうな。
(ちょっと見ない間にこんなにスレが伸びてしまった。)
>>204
>>「整数へのポインタ」と「整数の配列」
>=>int a;(int a[1];)
>==>int *a_p;
>
>>「整数の配列の配列」
>=>int b[10][10];
>==>int **b_p;
>
>a_pとb_pの違いのことを言っているのか??

そうです。b_pはなぜint *じゃないのでしょう?
あれ、でもint **とするとコンパイラに怒られますが。
253JPS ◆M0LaMzf5rY :02/11/10 21:15
>>252
配列は式の中ではポインタに読み替えられる!
三つの例外を除いて・・・。
254JPS ◆M0LaMzf5rY :02/11/10 21:16
でも配列とポインタは違う・・・
ここが難しい!!
くいず:
for (i=0;i<N;i++) for (j=0;j<N;j++) a[i][j]=0;
こうすると、a[i][j]の全体(N*N個の整数)がきちんとクリアされるという。
なのに、a[i][N-1]とa[i+1][0]の番地は並んでいないという。
なぜか?
>>「整数の配列の配列」
>=>int b[10][10];
>==>int **b_p;

bの型はint **じゃないだろう。
int **ってすると「int型へのポインタの配列」へのポインタになるの。
配列とは限らんが。
>>255
コンパイラが並ばないようにしたから
259JPS ◆M0LaMzf5rY :02/11/10 21:21
>>256
>>252はb_pのことを言ってるんだろ?
260デフォルトの名無しさん:02/11/10 21:21
>>258
ぶぶー、はずれ。
261JPS ◆M0LaMzf5rY :02/11/10 21:22
>>255
んなこたーない
コンパイラじゃなかったら誰がそうするんだろ・・・・
答:
int *a[N];
for (i=N-1;i>=0;i--) a[i]=calloc(N, sizeof(int));
>261
a[i]がポインタで別々のところのポインタが入っていればそうなるよ。
>>263
そのコードを実行できる形にするのはコンパイラだろ?
>>258で合っているじゃん。まともな回答じゃないが。
えーと^_^;)
指している先が「整数の箱(1つ)」でも「整数の配列」でも
int *だというのは何となくわかりました。
でも、そうすると「整数の配列の配列」も同じ理屈で
int *でよいと思うんですが、なぜ違うのでしょう?
267JPS ◆M0LaMzf5rY :02/11/10 21:27
俺の環境じゃ、配列の添え字は定数でないとだめなんだよ・・
>>263
calloc使うなら0に初期化する処理は無駄だね。
>>265
コンパイラはa[i][N-1]やa[i+1][0]のメモリを割り付けていない。
整数の配列 a[N];
って宣言するの。
>>264
a[i]がポインタじゃないときってどんな時なんですか?
272デフォルトの名無しさん:02/11/10 21:28
>>260
ただの仕様だろ。並べなきゃいけないってしちゃったら、メモリを連続させて確保するコストがかかるから。
>>268
途中でクリアすることもあるんでは?
…ってそういうことを問題にしたわけじゃない(w
>>272
ポインタ配列を用意して、そこにmalloc,callocで得た領域を入れるんだってさ・・・
>>271
int a[N][N];
この場合はa[i]は使えないのかな。
276JPS ◆M0LaMzf5rY :02/11/10 21:31
てかこんな話つまんないYO!
typedef int hoge[N];
hoge a[N];
int a[N][N];
と宣言したら、必ずa[i-1][N-1]の次にa[i][0]が並ぶ(i=1..N-2)。
int *a[N];
で、a[i]を動的に確保したら、a[i-1][N-1]とa[i][0]の間は
(重なっていないということを除いて)どういう関係があるかわからない。

ちなみに、確保するのはcalloc(またはcallocから呼び出される下位ルーチン)だ。
コンパイラじゃない。
>>278
callocのソースをコンパイルするのはコンパイラ
280279:02/11/10 21:35
まあ別にCで書かなくてもいいが
>>279
コンパイルするのはコンパイラだな。
でもコンパイラが確保するわけじゃない。
282279:02/11/10 21:36
>>281
まあいいか。
ところで、さっきのクイズはオリジナル?
283 ◆JWPaeN65Rw :02/11/10 21:38
こんな感じの説明で、どうでしょう?

「【整数 int a 】の配列」
int a[10];
int *a_p;

「【整数の配列 int b[5] 】の配列」
int b[5][10]
int *(b_p[5]);

とうぜん、b_pの型は、int *だから、

int *(*b_p);

ってなる。




く〜いず!
void mult(double a[N][N], double b[N][N], double c[N][N]) {
int i, j, k;

for (i = 0; i < N; i++) for (j = 0; j < N; j++) {
a[i][j]=0.0;
for (k = 0; k < N; k++)a[i][j] += b[i][k] * c[k][j];
}
}
これを速くしようと、
void mult(double a[N][N], double b[N][N], double c[N][N]) {
int i, j, k;

for (i = 0; i < N; i++) for (j = 0; j < N; j++) {
double sum = 0.0;
for (k = 0; k < N; k++) sum += b[i][k] * c[k][j];
a[i][j] = sum;
}
}
と書き換えたら、実行結果が変わってしまったという。なぜ?
285283 ◆JWPaeN65Rw :02/11/10 21:39
>266
です。
>>283
b_pはint [5]の大きさをもつ配列へのポインタでしょ?int **b_pにはならないでしょ。
>>283
ちょっとまて。
*b_p は整数だと思うんだが。
>>284
Nってなんだよ?マクロか?
289284:02/11/10 21:42
>>288
あー、はい。
#define N 100
くらいの適当な定数と思ってくらさい。
290デフォルトの名無しさん:02/11/10 21:42
int a[N][N];
って宣言したらスタック上に確保されるだろうが。
どうしてcallocが関係あるんだ?
int *(b_p[5]);はint型のポインタの配列じゃない?
>>289
こういうところしっかりしておかないとな。つっこみ問題は。
まあ定数じゃなかったらコンパイルエラーになるが
293292:02/11/10 21:43
つっこみ問題ってなんだよ。
引っかけ問題だな。
>>290
ネタなのか真正DQNなのかはっきりしる!
295286:02/11/10 21:44
>>291
あーint (*b_p[5])と見間違えた。
うん、ポインタ配列だね。int **にいれられる。
296295:02/11/10 21:45
ポインタ配列なら括弧をつけるなヴォケェ
まぎらわしいんじゃ!
297JPS ◆M0LaMzf5rY :02/11/10 21:45
>>286
int b[5]={1,2,3,4,5};
int *b_p=b;

この時、*b_pもb_p[0]も式の中では1となるしょ?
int **b_pになるべ。あら・・・
298295:02/11/10 21:46
s/int (*b_p[5])/int (*b_p)[5]/
299JPS ◆M0LaMzf5rY :02/11/10 21:47
>>296
わかりやすくしてんだろヴォケェ
300295:02/11/10 21:48
>>299
でも
int b[5][10]
int *(b_p[5]);
とやったら
b_p=bってのはできないよ。
>>284
mult(a, a, c);ってやってたくらいしか思いつかんな。
302266:02/11/10 21:50
よくわかりません。
int *ip, i;
int *ap, array[10];
ip = &i; ap = array;
*ipも*apも整数の値が出てきますよね。

int b[5][5];
のとき
int *bp1 = b;も int **bp2 = b;もコンパイラに怒られます。
*bp1とすると整数が取り出せるんだから、int *で良いような気がするのですが。
それとも、*bp2とすると、どこかへのポインタが得られるんでしょうか?
>>301
正解!
bかcがaと重なっていた。
>>302
hogeのポインタ = hogeの配列 はできると思ってくれ。
intの配列の配列 が b。
intのポインタ にも
intのポインタのポインタ にも 代入できない。
>>238
しかしどうしてそう言う風になってるんだろう。
くーーーいーーーーず!
あるプログラムでは、大量のunsigned longの配列を
calloc(N, sizeof(unsigned long))で確保している。

プログラマが、配列の内容は実は全てunsigned charで十分あらわせる
範囲だと気づき、unsigned longを全部unsigned charに直したが、
消費するデータ領域はちっとも減らなかったという。なぜ?
>>302
int (*bp3)[5];

一つ言えるのは、こんな重箱の隅な知識覚えても何の役にも立たないということだ。
sizeof(unsigned long) == sizeof(unsigned char)
>>305
char の配列を宣言してるからでしょ。サイズはintだけどintじゃないから
>>305
doubleとして扱われるかもしれないからって、char配列を全て
double境界に整列する仕様のほうが良いか?
「そんな使い方しないから詰めて割り当ててくれ」という人も
多いんじゃないか?
>>308
……正解。簡単すぎたか。
>>308
そんな処理系あんのか?charはちっちゃくしとけよ。
>>308
実際に存在するのか?
>>312
intは16bit以上だと規格で決まっていると言っている人が何人かいたけど、1バイト=16bitならsizeof(long)==sizeof(char)になってもおかしくはないよな。
315308:02/11/10 22:11
ないと思う。規格上は可能ってだけで。
お前らの悪いところは

規格、仕様と言いながらソースを示さないこと

だろうな。
おかげでアホな間違いとかも散見される。
TM320x0シリーズでは、メモリは32ビット単位でしかアクセスできない。
番地も32ビットごとについている。
なので、Cではsizeof(char) == sizeof(int) == sizeof(long)
>>317
それか!
以前charだろうがintだろうがみんな32bitの環境でプログラミングしていると言っている人がいた。
>>314
longは32bit以上じゃなかったっけ?
320317:02/11/10 22:15
まちがいた
×TM320x0シリーズ
○TMS320シリーズ
みんなで64bitになって幸せになろう。
322317:02/11/10 22:16
charが32ビットなら多言語対応も楽そうだ。
323デフォルトの名無しさん:02/11/10 22:23
age
>>322
当面16bitでいいじゃん。どうせUnicodeは当分BMPしかつかわんでしょ。
(゜∀゜)ビトマーップ
326デフォルトの名無しさん:02/11/10 22:27
(゜∀゜)ビトマーップ
327那由多 ◆F4E74ZBQPA :02/11/10 22:28
>302
@配列ってのは、アドレス順にあるもんが並んでいることを言います。
A[整数]の配列といったら、下のようなイメージです。
a[4]={14,15,16,17};
aのアドレス->値
100     ->14
101     ->15
102     ->16
103     ->17
B[整数の配列]の配列といったら、下のようなイメージです。
b[2][3]={{10,20}.{11,21},{12,22}};
bのアドレス->値
200     ->100
201     ->102
202     ->104
#2個飛びのアドレスが格納される。
ちなみに、次のアドレスには
100     ->10
101     ->20
102     ->11
103     ->21
104     ->12
105     ->22
Cint **というのは、ポインタの配列を表していますが、2個飛びのアドレスが
入るということまで、わからないのです。
したがって、int **bp2=bとするエラーになる。
D>307のように書けば、いくつ飛びのアドレスが入るかが、わかるので、
うまくいくはず。
#手元にコンパイラが無いので、確認できん、スマソ。
>>327
まて、多次元配列はメモリー上に直行的に並ぶはずだぞ。
>>327
そんな無茶な。
いつから勝手にポインタ配列にしてくれるようになった?
なぜコテハンに限ってDQNなんだろう…
331那由多 ◆F4E74ZBQPA :02/11/10 22:41
スマン、逝ってくる。
>319
そだな。
charは8bit
intは16bit
longは32bit
が最低保証されているから CHAR_BIT = 16ならば
sizeof(char) = sizeof(int) までだな。

ちなみに、charは参照可能な最小単位を定義しているので、sizeof(char)は必ず1を返す。
他の型のsizeofはcharの何倍かを返すんだとさ。
> charは8bit
ダウト。
>>333
じゃあ正解は?
335デフォルトの名無しさん:02/11/10 22:50
sizeof(char)=1って事だけだろ。
char:1バイト
>>335
SCHAR_MINは-127以下SCHAR_MAXは127以上が保証されているハズだぞ。
他の型も同様にビット数ではなくて値の範囲で定義されているのだが。
-側が128でないのは1の補数マシンへの配慮だと思われる。
338デフォルトの名無しさん:02/11/10 23:10
すいませんがちょっと教えてください。
見ていたPGの中にこのような処理があったのですが、これはどのくらい値に差があるときに成り立つのでしょうか?
10倍ぐらいでしょうか?

if(num >> 4) {
}
2^4=16
num >> 4 は右シフト
num / 16 16以上ってこと。
>>338

>>が何の演算子かまず調べたまえ。
比較演算子ではないぞ。
342338:02/11/10 23:20
>>340 , 341
>>は16以上のときなのでしょうか?
300 >> 4
だったらTRUEで、

15 >> 4
だったらFALSEと考えていいのでしょうか?
>>342
だから、比較じゃないって。数学の>>とは別の意味。
手元の参考書に載ってなければ、すぐさま別の本を買ってきて読め。
>>342
比較じゃないってば。
300 >> 4 は 30/16 で
15 >> 4 は 15/16 だ。
>>338

「>>」は超比較演算子と言って上級者でも殆ど使わない演算子だから
覚えなくても良いよ。
実は2chで相手の番号をレス番号を指す時の「>>」も、この演算子が由来なんだよ。
346デフォルトの名無しさん:02/11/10 23:28
338はnetaっぽいな.
処理系依存をうるさく言うやつがいるけどさ、
コンパイラが規格に準拠しているかどうかということ自体、処理系依存だよな。
348338:02/11/10 23:47
>>343 , 344
わかりました。割り算ということですか?
300 >> 4 => 30 /16
15 >> 4 => 15/16

左辺は2乗したもので割ればいいのでしょうか?
右辺の法則がちょっとわからないのですが。
349JPS ◆M0LaMzf5rY :02/11/10 23:48
>>344
300>>4
300/2^4ではないんでつか?
ビットをシフトさせるの。
11110000 >> 4 だったら
00001111 になる。
00001111 >> 4 だったら
00000000 になる。
>>348
4ビット右シフトは1/2^4
2進の環境下で4桁右にずらすんだからね。
あ、アンダーフローは考えないで

352351:02/11/10 23:51
違う違う、、、
あ、アンダーフローは考えないで ←これは間違いだ
多分、348は 2進数を知らないんだと思う。
354338:02/11/10 23:52
>>350 , 351
わかってきました。
右にビットをずらしていくのですね。ぜんぜんイメージと違っていました。
一番左のビットには必ず0がくると考えていいのでしょうか?
355351:02/11/10 23:53
>>354
論理シフトなら0で埋められる。
算術シフトの場合は符号ビットとおなじもので埋められる
356JPS ◆M0LaMzf5rY :02/11/10 23:55
>>355
その二つで決定的な違いってある?
実際プログラムつくるときに
論理シフトって繰り返しやれば最終的に元の値は必ず0になるよね?
bit数やればなるんじゃない?
>>358
さんきゅ

>>356
例えばwhile(a<<=1) ;とかwhile(a>>=1) ;なんてやった場合、論理シフトじゃないと無限ループになる可能性がある
360338:02/11/11 00:05
>>355
算術シフトと論理シフトの違いってなんでしょうか?
算術シフトが符号で埋められるというのは、
10001001 >> 2 => 11100010
00001001 >> 2 => 00000010
ってことでしょうか?
signedの右シフトは処理系定義。
算術シフトって「1の補数」をと取るんでしょ。
>>360
そう。
算術左シフトは符号ビットは変わらず他のビットが左にずれる。空いたところには0が入る。
論理左シフトは全ビット左にずれる。空いた領域には0が。
>>361
そうだね。算術シフトになるか論理シフトになるかは処理系による。
Javaだとそれぞれ別の演算子がある。
>>361
論理シフトや算術左シフトは?
366365:02/11/11 00:11
なんか変だな。
unsignedのシフトや、signedの左シフトは?
>>362 ネタか?突っ込んでやらない。

>>365 左シフトに論理も算術もない。
368デフォルトの名無しさん:02/11/11 00:12
ビットソートについて教えてください。
>>367
> 左シフトに論理も算術もない。

???
左シフトは2の羃乗の乗算に等しい。
オーバーフローは無視。
>>369
初心者か? ならわかりやすく説明しよう。
左シフトだと右から新たなビットが入ってくる。
論理シフトだと考えれば0が入ってくる。
算術シフト(2倍)だと考えれば、正負によらず常に0が入ってくる。
どちらでも同じ。
372363:02/11/11 00:14
もしかして>>363は間違っているのか?
373363:02/11/11 00:15
>>371
入るのは0だが、算術か論理によって符号ビットがずれるかずれないか変わると思っていたんだけど。
>>363
やってみれば。
そういう動作は聞いたことがない。
実際、javaには>>>(算術右シフト)はあっても<<<は存在しない。
signedかつnegativeな整数に対する左シフトの振る舞いは未定義。
signedかつnegativeな整数に対する右シフトの振る舞いは実装定義。
377376:02/11/11 00:32
あ、上の一行は間違い。失礼。
378デフォルトの名無しさん:02/11/11 00:33
算術シフトは最上位ビットが1のとき、右シフトすると1が入ってくるよ。
#include <stdio.h>
void main() {
int n = 0x80ffffff;
printf("%d\n", n);
printf("%x\n", n);
printf("%d\n", n << 4);
printf("%x\n", n << 4);
printf("%d\n", n >> 4);
printf("%x\n", n >> 4);
}
381デフォルトの名無しさん:02/11/11 00:40
>>377
signedつーか負数だろ
だからnegativeって書いてあるだろ。
383もまずにパピコ:02/11/11 00:42
>>379
その算術左シフトおかしいぞ。
8ビットの-128(10000000B)を左シフトしたら、その説明では-128のままになってしまう。
384デフォルトの名無しさん:02/11/11 00:42
ああ、nativeと読み間違えてた。スマソ
>>383
0をいくらシフトしても変わらないのと同じじゃないの?
int i, a1[10], a2[10][5];

int へのポインター
*(&i) = 1;
*(&a1[0]) = 1;
*(&a2[0][0]) = 1;

int[] へのポインター
*(&a1) = 1; → NG:配列に整数は代入できない
*(&a2[0]) = 1; → NG:配列に整数は代入できない

int[][5] へのポインター
*(&a2) = 1; → NG:5つの要素を持つ配列の配列に整数は代入できない

関数呼び出しの引数に現れた場合
a2 == &a2[0][0] 
a1 == &a1[0]
nを4bit左シフトしたらnはn*2^4になるんだよね?
負の数の場合、符号ビットが変わったらまずいと思うんだけど。
負の数に正の数をかけても負の数のままのはずなのに、符号ビットまでうごいたら正の数になってしまう
>>363
やってみろよ?

11111111 << 1 = 1111110 だな。論理シフトでも同じだな。
10000001 << 1 = 1000010 になるとしたらこれは算術的に正しいのか?

因みにx86のアセンブラレベルでも論理左シフトと算術右シフトは同じものだぞ。
389JPS ◆M0LaMzf5rY :02/11/11 00:47
要するに負の整数にはビット演算するなって事だよね。
自分の処理系が論理か算術か確かめる方法ある?
スマン。
算術左シフトな。
391JPS ◆M0LaMzf5rY :02/11/11 00:47
あ、やってみりゃいいんだw
>>383
それが算術シフトだろ。
393387:02/11/11 00:49
正の数になってしまう"ことがある"
394JPS ◆M0LaMzf5rY :02/11/11 00:50
今日で前橋歴10日だよ・・・
ぜんぜんわかんないけどさ。
皆さんすみません、何度か質問させていただいているものですが、
またひとつ質問させてください。
変数の宣言はコードブロックの先頭でできますから、たとえば
int main(void) {
int i;
for (i = 0; i < 100; i++)
{
int k; <--これ
処理〜;
}
return 0;
}
なんて書き方や、
int main(void) {
int i;
処理〜
{
int k; <--これ
処理〜
}
return 0;
}
なんて書き方ができますよね。
これって、そもそも一般に通用するものなのでしょうか?
通用するとしたら、「良い書き方」「悪い書き方」なのでしょうか?教えてください。
396JPS ◆M0LaMzf5rY :02/11/11 00:53
そういやさ、Cで8進表記は012とか0をつけるんだよね?
O(オウ)じゃないよね?
でもprintfの型指定市は%oだよね?
ちがったけ?
>>397
O12とやったら変数などと見分けがつかなくなるだろ。
398397:02/11/11 00:54
レス先間違えた
>>396
399JPS ◆M0LaMzf5rY :02/11/11 00:55
>>395
余裕で通用する。でも俺はあんましない。宣言はとりあえず関数の直後でやっちゃう。
でもたとえばwhileの2重ループとかで、毎回値を初期化する必要があるときとかはやるかな。
まあそれもfor使えばいいし。
悪い書き方でしょ。
for(〜){int k;〜}for(〜){int k;〜}
とプログラム書いてみ。エラー出すこともある。
401JPS ◆M0LaMzf5rY :02/11/11 00:56
>>397
そうだね。サンクス
>>400
なんで?
403JPS ◆M0LaMzf5rY :02/11/11 00:56
>>400
エラー出すことあんの!?
算術シフトと論理シフトの勉強し直した方が良いよ!
405JPS ◆M0LaMzf5rY :02/11/11 00:57
>>404
俺にいってるんでつか?
>>396
8進数→octal
>>395
そんなに悪いとも思わないけど。
範囲がわかるし。長いんなら別関数にすれば?
408JPS ◆M0LaMzf5rY :02/11/11 00:59
>>406
そうだったのか!なにげに英語分かったら覚えやすいよね。
おれなんかstdio.hのことステディオとか言ってたから・・・
スタンダードインプットアウトプットだよね?
基本情報処理試験のCASLIIには左シフトにも論理と算術があるな。
左シフトについて、規格を確かめたら:
E1 << E2でE1がunsigned typeなら、
シフトの結果は(E1 * (2のE2乗)) mod (E1が表せる最大の値 + 1)

E1がsignedかつ非負かつE1 * (2のE2乗)が元の型で表現できるならこの値。

それいがいの場合は(なんと)未定義動作だと。

よって、負の数を左シフトしたら間違い。
>>408
え?ストゥドゥアイオーじゃないの?
Standard I(input)/O(output).
Octopus.(image)
413JPS ◆M0LaMzf5rY :02/11/11 01:00
>>409
まじ!?俺春受けるんだけど・・・
でも選択でCとればいいよね?
てかさ、秋用の参考書買ったんだけど、これ来春にも通用する?
>>410
>>376で既出
すまん、やっぱこれで良い。
signed_negative左シフトは未定義
signed_negative右シフトは処理系定義

>>408
日本語では標準入出力
417JPS ◆M0LaMzf5rY :02/11/11 01:02
>>411
( ̄□ ̄;)!!
俺は「スタンダード・アイ・オー」って言ってる・・・
はずかちい・・・
>>395
賛否両論あるね。というより、一長一短か。
短所は、コードを読んだ時に変数をどこで
定義しているかわかりにくい。
419JPS ◆M0LaMzf5rY :02/11/11 01:03
>>411
ていうかストゥドゥってなに?
スペルは?
>>415
> signed_negative左シフトは未定義

これホントなの?

>>410
俺も未定義って見て驚いたので間違ってないか何度も読み直したが
どうやら本当らしい。
october
>>421
どこで見たの?
424JPS ◆M0LaMzf5rY :02/11/11 01:04
>>418
でもこういう書き方しなきゃ出来ないことってある?
for使えば出来ると思うんだけど。
プログラムの中身じゃなくて、見た目の問題?
>>424
変数のスコープは最小限に絞るべきっていう考え方もあるから...
>>420
そりゃそうさ。
処理系によって
負数の表現が2の補数とは限らない。
>>423
俺はc99で見た。
白熱しておりますな
429もまずにパピコ:02/11/11 01:06
>>409
ゲーーーーーッ! ほんとだ!
さっきのページはシスアドだったからあれで合ってるんだ……

でも80x86もZ80もそんな動きしないよな…
430デフォルトの名無しさん:02/11/11 01:06
じゃあ負数へのかけ算はシフトをつかって実現してはならないの?
432JPS ◆M0LaMzf5rY :02/11/11 01:09
>>430
俺の持ってる本にはそう書いてあるぞ。
まあ、俺の場合それ以前にシフト演算なんてしないわけだが
433デフォルトの名無しさん:02/11/11 01:09
>>430それだけじゃなくsigned使うときにはsign心の注意を払わないといけない。
435JPS ◆M0LaMzf5rY :02/11/11 01:09
>>433
(゚д゚)ウマー
436デフォルトの名無しさん:02/11/11 01:10
>>432>>433
まじかよ・・・
じゃあループで足し込むしかないの?
>>431
左シフトは算術も論理も一緒になってるな。
438420:02/11/11 01:10
うひゃー、未定義知らんかった〜。
とりあえず左シフトはunsignedまたは定数
でしかやった覚えないけど。勉強になりますた。
439JPS ◆M0LaMzf5rY :02/11/11 01:11
なんだなんだ!?お勧めサイトの紹介か!
コソコソ・・http://kuroneko22.cool.ne.jp/
掛けたあとが範囲内ならシフトしていいんじゃないの?
>>437
どこに目をつけてんだYO!
442JPS ◆M0LaMzf5rY :02/11/11 01:12
>>413
誰か答えて・・・
掛け算をシフトで?
規格準拠にしたければ、絶対値を取って正の数に対してやればよいじゃん。

2の補数を仮定してよいならunsignedにキャストしてやれば良い。
>>413
スレ違い。
445JPS ◆M0LaMzf5rY :02/11/11 01:14
>>444
( ̄□ ̄;)!!
( ̄□ ̄;)!!
( ̄□ ̄;)!!
>>443
unsignedにキャストしてシフト演算したらどうなるか分かる?
>>446
倍になる。
1の補数表現の場合、8bitだと11111111は0になるの?
449395:02/11/11 01:20
皆さんレスありがとうございます。
自分もレス書きたかったのですが、
白熱した論議に割り込むこともできない未熟者ですのでご勘弁を……。

結論としては、そう書くこともできるが賛否両論(あんまりやらない)、
関数分けなどうまく使えばそうする必要もない、ということですよね?
ありがとうございました。
450443:02/11/11 01:20
>>446
わかるけど?
きのうはBOOLで、今日はシフトですか?
昨日もシフトやったよ。
>>447
2の補数で(signed int)1011111111111111
これをunsigned intにキャストして>>1してsigned intにキャストしたら?
454デフォルトの名無しさん:02/11/11 01:26
たった 1 日でレスがこんなに・・・。

でも、クイズ厨うぜぇ。
ここは基本的に質問スレなんだから別スレ立ててやってくれよ。

ところで、>>284 のコードは、前者も後者も結局何も仕事をしないと思うのだがどうよ?
455もまずにパピコ:02/11/11 01:27
>>453
おーい… 横入りするけど右シフトは別に、未定義じゃないので、キャストしなくても、いいんじゃ、ないの。
454=284
>>455
処理系依存なのだが。
458JPS ◆M0LaMzf5rY :02/11/11 01:31
>>457
コンパイラによっちゃ負の右シフトも未定義!?
右シフトが論理シフトになるか算術シフトになるか未定義なんじゃない?
>>458
未定義と処理系依存をごっちゃにするなよ。
処理系依存は、処理系が確定すれば必ず動作は一定。
未定義は、本当に何が起こるかわからない。
>>457
signed を unsigned にしたときにどうなるかも処理系依存でしょ?
>>460
本当に何が起こるのかわからないのは不定。
未定義はその名のとおり定義されていないだけ。
463462:02/11/11 01:34
規格では定義されていないという意味ね
464454:02/11/11 01:34
>>456
死ね。

どうして誰も、284 の引数が値渡しである事に気付いていないんだ。
前者と後者のコードはまったく同じ結果になるから、クイズとして成り立っていない。
>>462
もうネタはいいよ。
466JPS ◆M0LaMzf5rY :02/11/11 01:37
>>460
なるほど。あふぉですまそ。
でも右シフトの場合、論理でも算術でも結果は一緒でない?
>>459は?
>>464
了解。はいクイズの件は終了。
>>464
284は正解者いたよね。
>>462
アホ。適当な事言うな。

implementation-defined,unspecifiedは実装選択の義務がある。
undefinedは無い。
10000000 >> 4が
11111000 になるのが算術シフトで
00001000 になるのが論理シフトじゃない?
>>462
処理系依存は、動作が確かめられればいつでも用いて良い。
未定義は、絶対に用いてはならない。

>>468
クイズとして成り立っていないなら、正解もクソも無いだろうに。
http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html

>>460>>462も間違っているようだが。
473JPS ◆M0LaMzf5rY :02/11/11 01:42
>>470
ごめん。左シフトだった。
>>472
462は十分間違ってるぞ。
475474:02/11/11 01:43
ごめん、472を読み間違えてた。
476JPS ◆M0LaMzf5rY :02/11/11 01:44
>>470
ほんとだ。でもまあ>>460に近いし。
だいたい未定義なんてつくんなよ。規格できめろよANSI
>>472
Uncertain (不定) なんて言葉が規格書にあっただろうか。
未定義といっても処理系によっては定義されている可能性があるんじゃないの?
479JPS ◆M0LaMzf5rY :02/11/11 01:45
>>478
処理系によってはってとこが未定義なんだべ?
11111000 << 4 は
10000000 になればそれでいいのだが。
>>478
鼻から悪魔が出る処理系もあるので、うかつに使えませんが・・・
>>479
規格では未定義でも処理系によっては定義されていることもあるんじゃないかと
>>480
気持ちはわかるが、それは本論とは関係無い。
484474:02/11/11 01:47
>>472
460も間違ってる?
(処理系依存=処理系定義とすると)間違ってるとは思えないんだが。
485JPS ◆M0LaMzf5rY :02/11/11 01:47
っていうかさF&Aの
>未定義とは、その結果どうなるかが、言語仕様として決められていないことを意味します。
>そして、その結果がどうなっても、そのC言語の処理系はは規格に合致しているとみなされます。
ってのとさ、
>不定と未定義の最も大きな違いは、不定のコードはプログラムとしては正しいが、未定義のコードは間違いであり、
>動作する保証すらないという所にあります。
ってなんか違わない?
>>485
F&A?藤子不二雄か?
>>485
「動作する保証すらない」という結果になってもC言語処理系としては正しい
488JPS ◆M0LaMzf5rY :02/11/11 01:48
>>482
それは分かるけど。
結局移植性低いプログラムは書くなってことで。
>>485
規格にさえ反しなければ何をしようと規格に合致していると言えるだろ
ただそれでどうなってもしらないよ。と。
未定義とか処理系依存な命令なんか使わなきゃいいじゃん。使わないでいいし。
何だか、JPSっつー香具師=荒らし、っつー感じなんだが
シフトくらい使わせてくれ。
493JPS ◆M0LaMzf5rY :02/11/11 01:50
>>489
未定義のコードが間違いって言ってるのに、規格には準じてるって・・・
なんかすげー曖昧。これじゃ移植性がどうこうって話でなくない?
494JPS ◆M0LaMzf5rY :02/11/11 01:51
>>491
荒らしじゃねーよ!香具師だけど。
頭わるいけどがんばってるんだYO!
>>493
間違いってのはプログラマが使うことが間違っているという意味だろ。
規格に反するという意味ではなく。
>>493
逆だ。
昔のCは互換性がないほどバラバラだった。
それを無理矢理一つの企画に纏めたため、無理な動作が未定義となった。
>>493
プログラマーが使うかとコンパイラが実装してるかどうかは別ものだろ。
未定義は使えないが、処理系依存は使うわな。
特にその処理系に特化したカスタマイズしたい場合は。
> これじゃ移植性がどうこうって話でなくない?

未定義のコードを書くこと自体が間違ってるんだから。
Cではそういうコードを書いてはいけないのよ。
>>496
それもそうだし、あまりガチガチにすると様々な環境で使えなくなるんだろうね。
501デフォルトの名無しさん:02/11/11 01:52
プレステ2のCPUって2の補数表現じゃないって本当?
>>498
処理系依存は使えないと、Cそのものがほとんど使えないよね。
503JPS ◆M0LaMzf5rY :02/11/11 01:53
>>495
でもしたらさ、結局処理系で定義してあったってそれ使うのは違うんじゃねーの?
ってかんじだべ?
そしたら処理系ごとでそれぞれ定義する必要ゼロじゃん?
でも定義してんのは使うからでしょ?
だったら規格でちゃんと決めろや( ゚Д゚)ゴルァ!
>>490
それは間違っている。
x86 + VC++ で、ポインタや浮動小数点数の集合を ZeroMemory() を使わないで
項目事ので移入によって初期化するのは馬鹿げている。
505デフォルトの名無しさん:02/11/11 01:53
>>502
命令はいいとして、標準以外のライブラリを使えないとかなりきついね。
24時間経たずに500か・・・お前ら仕事や学校あるんだろ?
俺、今朝は5時におきなきゃならんのに、


・・・回線切らずに氏ねそうです
>>503
決められんこともあると思うが・・・
508JPS ◆M0LaMzf5rY :02/11/11 01:55
>>496
そうだったんでつか。ちょっとその辺の話はまだまだなんで・・・
ってことはやっぱ負の右シフトはすんなと?
算術で。
なんか今日は低レベルで面白くないな。
>>494
つもりが無くても荒らしは荒らしだから、そこのところ理解しておいてくれ。
ちなみに、>>491 のような煽りも荒らしに分類される。
511JPS ◆M0LaMzf5rY :02/11/11 01:57
>>506
明日は学校10時はんから・・・
今、徹夜という文字が浮かんだYO!
この論争に加わっていれてるのかな・・・おれ・・・
>>509
質問ないときはこんなもんだろ。
>>506
仕事や学校に逝かなければ良い。
>>509
昨日の方が低レベルだったけどな。
>>509
さっさと寝ろ
516JPS ◆M0LaMzf5rY :02/11/11 01:58
>>510
俺のどこが荒らしだ( ゚Д゚)ゴルァ!
>>491が荒らしなら、おめーもだろ
煽られてるぞおれはああ
一部の環境でうまく動けばそれでいいや。
あらゆる場面で動くプログラムなんて書こうとは思わないし。
>>508
ビットシフトを使う側に論理、算術の選択の余地は無いんだよ。
>>503
なるべく処理系を殺さないという C の設計思想を理解しろ。
そうでなければ自分で言語を定義せよ。 
>>516
もう寝とけ。
明日、またここに来たときには、すでに今の議論は忘れ去れているだろうから。



・・・そしてまた同じことが一から議論されているという罠
C言語って未定義の命令を使えてしかも警告すら出ないのな。
いやC言語というか処理系の問題か。ろくな処理系がないな。
>>516
516 のどこが荒らしじゃないのか説明してもらおうか。
523JPS ◆M0LaMzf5rY :02/11/11 02:00
>>518
そうだね。じゃあ負の数自体やんなってことか・・・

>>517
俺は学校でやるからそういうわけにはいかないんだYO!
>>519
激しく同意。
未定義や不定が気に入らないなら、JavaかC#を使うがいいさ。
>>516
荒らしだよ。もう寝るよおれは。おやすみ。
昨日何を議論したのかなあ。
忘れてしもうた。
527JPS ◆M0LaMzf5rY :02/11/11 02:01
>>516は荒らしですた。すまそ。
>>454
ところで>>284が「値渡し」ってどういう意味だ?
(またDQN登場か?)
>>517
こうやって糞プログラマーが大量生産されます。
>>526
NULL, bool(_Bool), 未定義, ... 最近はこのどれかだな。
531デフォルトの名無しさん:02/11/11 02:02
intを文字列にしたいのですが、どうしたらいいか
分かりません。簡単にできる関数はないのでしょうか?
>>284の引数は3つともポインタだよな。
533JPS ◆M0LaMzf5rY :02/11/11 02:02
俺にはCしかないんだが・・・
未定義はだめだとして、不定を使う可能性は?
あり?
>>531
sprintf
>>528
ポインタが渡されることを知らんのだろう。
>>528
試してみればわかるよ。
呼び出し元の配列は、決して変更されない。
>>533
int i;
printf("%d\n",i);

不定ってこういうのだろ?
>>521
それを言ったらアセンブラの立場はどうなる。
それだけ自由度が高くて実装する側に委ねられている
言語っちゅーこった。

>>533
使わざるをえない状況になってから考えろ。
>>531
sprintf()
ポインタの値渡しじゃん(笑)
Cには参照渡しなんてないでしょ
>>536
呼び出してみたし、ちゃんと変わるが?
(ネタだとしたら地味すぎるな…)
543デフォルトの名無しさん:02/11/11 02:04
香具師って何.
544JPS ◆M0LaMzf5rY :02/11/11 02:04
>>539
わかりますた。そしたらまたここでレスします。

おい、お前ら!不定と未定義って(略
545JPS ◆M0LaMzf5rY :02/11/11 02:05
>>543
俺のことですが、何か?
>>528
454はどう見てもネタだろ。
Q.C言語の好きな所はなんですか?


A.未定義や不定であることを知らなくても自由に使えるところです。


>>543
***すれ立てるまでもない質問はここで 第25刷***
http://pc3.2ch.net/test/read.cgi/tech/1036597434/l50

いや、むしろイタ違い・・・サイト違い・・・2ちゃん語辞書引け
549JPS ◆M0LaMzf5rY :02/11/11 02:06
でも>>537とか絶対やらんよな。
普通に書こう、ごく普通に・・・

そうして未定義を使う罠
2ちゃん語なんて恥ずかしいから使うなよ。
>>547 そしてはまると。
まあ、そういうアドベンチャーゲームも子供の遊びとしてならいいけドナー
大人ならドキュメントちゃんと読もうや。
>>549
i = i++;
お前はこれでもやっとけ。
553デフォルトの名無しさん:02/11/11 02:07
宿題専門のスレってどこにあるんすか
>>551
あなたはドキュメントを全部読んで理解してから使っているのかと小(略
558デフォルトの名無しさん:02/11/11 02:09
>>554
その手のスレッド、初心者板以外にもあるのか
559デフォルトの名無しさん:02/11/11 02:09
香具師ってやしって読むのか.かぐしでも変換できるよ.今までかぐしって呼んでたよ.
561JPS ◆M0LaMzf5rY :02/11/11 02:11
>>552
i=i++ってさ、i=i=i++ってなって
i=iってなって、結局i++ってことで、
それが何か?


11.35:
i = i++の動作が未定義だとうるさくいう人がいるけれどANSI準拠のコンパイラで試して私
が思うとおりの結果を得た。
A:
未定義の動作に出くわしたらコンパイラは好きなように振る舞う(実装が定義した動作、
あるいは未規定の振る舞いに出くわしたときにもある程度好きなように振る舞う)。その中
にはあなたが期待した結果も含む。こんなことに頼るのは馬鹿げている。質問11.32と
11.33と11.34を参照のこと。

>>552 あれほどknkタンは持ち出すなと、
>>561
アフォ。それは典型的な未定義動作の例だ。
1つの式の中で同じlvalueを何回も変更したら、結果は未定義。
>>561
それ昨日もやったな。
評価の順番が関係する。
>>561
i++はiに1を足して、足す前の値を返すだろ。
それをiに入れたらどうなるかわからない。
1が足されているかもしれないし足されていないかもしれない。
でもi=i++なんてなんのためにやるのかわからないよね(笑)
>>566
そんな浅はかなことは言ってはいけない。
俺はi=i++を実行したため、FreeB○D-MLから迫害された。



・・・ってなことも起きます。
569JPS ◆M0LaMzf5rY :02/11/11 02:14
>>566
そうか!後置++は評価したあとインクリメント!
じゃあi=++iは?おk?
>>569
C FAQくらい自分で読めよ。
>>568
殺されてもCに対しては文句は言えません。
ってゆうか
i=i++
でいったい何がしたいのか理解できないのだが。
他の手段はいくらもあるだろうし
こんな記述に固執する必要性は全くない。
573JPS ◆M0LaMzf5rY :02/11/11 02:15
>>564の、1つの式の中で同じlvalueを何回も変更したら
ってとこがどういうことかわからんのだが。。
>>573
今もっている参考書に書いてなかったら、本屋へ行って買って来い
575JPS ◆M0LaMzf5rY :02/11/11 02:17
>>570
書いてる?
>>571
信者だからですか(藁
>>577 ブラクラ
>>577
また引っかかった漏れは一体・・・これで7度目だよ・・・
>>572
書ける(文法違反にならない)ってだけだろうね。
i=i+2=i+3なんてやるとi+2は左辺にならないって言われるだろうし。
581JPS ◆M0LaMzf5rY :02/11/11 02:20
>>577
あぶねー578と579のおかげだ・・・

>>574
おなじlvalueってiのこと?
たとえばA=B=3はいいけどA=A=3は無理ってこと?

なんかfjに似てきたね、ここ。
っていうか式の中で++とか使うなよ。
他の手段はいくらもあるだろうし
こんな記述に固執する必要性は全くない。
使うときは i++; というふうに単独で。
>>580
1 行目と 2 行目が全然繋がっててないよ。
>>580
そんなん素直に
i+=2;
i+=3;
でいいだろ。
586JPS ◆M0LaMzf5rY :02/11/11 02:21
だとしたら>>569はぜんぜんだめってことで
香具師扱いをうけたわけか
>>579
もう定番だから、「pa_003_a」 と出てきた時点で事前回避してくれ。
>>585
そんなん素直に
i += 2 + 3;
でいいだろ。
589JPS ◆M0LaMzf5rY :02/11/11 02:24
>>581は・・・?
>>588
そんなん素直に
i += 5;
でいいだろ。
>>589
お前いい加減しつこいな。
C FAQくらい自分で読めっていってるんだよ。
>>584
そこまで禁止するのは早計。
単に、インクリメント/デクリメントを使った識別子は、副作用完了点までに
複数回使わなければいいだけ。
*p++ = ' '; とか、p[i++] = 123; とかもダメなのかい?
func(i++,i++);
こういうのもどうなるかわからないんだよね。
>>590
どっちでもいいだろ。
そんなのコンパイラが最適化する。
i++;i++;i++;i++;i++;
これが最強
>>593
未定義。
597JPS ◆M0LaMzf5rY :02/11/11 02:28
>>591
読んでものってねーんだよ。
だいたいそんなレスつけるヒマあったら質問に答えろや。
YesかNOでいいんだからYO!
>>597
くまなく探した?
ブラウザの検索機能を使えばみつけやすいと思うんだけど
要するに同じ変数を何度も変更するなってことだ。
600598:02/11/11 02:30
>>597
http://www.catnet.ne.jp/kouno/c_faq/c3.html
これの3.3にあるじゃん
>>597
載ってるから言ってるんだよ。
お前の目は節穴か、ボケ!

答えは「無理ではない」
602JPS ◆M0LaMzf5rY :02/11/11 02:31
>>591
ありますた。すまそ。

http://www.catnet.ne.jp/kouno/c_faq/c3.html#0
3.2
これでつね?
603598:02/11/11 02:32
ん?
i=i++のことじゃなかったか。
604JPS ◆M0LaMzf5rY :02/11/11 02:33
>>602は違った。前置を探してたのに・・・

>>601
無理ではないってことはなんか違うってこと?
とりあえずi=++iはだめだよね?
ひとつの式で2回値を変更してるから。
a=b=3はa=(b=3)だからぜんぜんおkだべ?
>>603
581の質問のことだよ。
>>601
どこに載ってる?
A=A=3 は、A に対する副作用がいつ発生するか決まってるの?
607デフォルトの名無しさん:02/11/11 02:35
int型の変数10個,a[0]〜a[9]を作ります
これをそれぞれ1から10まで変化させます

このとき,a[i]=a[j] (i≠j) の時を除外して
考えたいのですがどう表現すればいいでしょうか?

思いつくのはif文で || でひたすら結んでいくことですが
これだとこの場合10個中2個を選ぶので
10C2=45 個も書かないといけないのは面倒です

よろしくお願いします
えーと、関数の仮引数として書いたとき、
typedef double p[N]; とすると、
double a[N][N]とdouble a[][N]とp *aが全部同じだというのは
わかってる?
609JPS ◆M0LaMzf5rY :02/11/11 02:36
>>606
俺が読んだ感じだと決まってないって。
だからだめなんだって。これが未定義ってやつ!?
610市外局番-111:02/11/11 02:37
>>607
if (a[i] == a[j]) break;とか
if (a[i] != a[j]) で処理を書くとか。
>>610
だよなあ?

わざわざ質問するということはもっと複雑なのか、、、
612JPS ◆M0LaMzf5rY :02/11/11 02:38
>>608
ぜんぜんわかんない・・・
>>606
>>609
お前ら何言ってんだ。
> A=A=3
どの辺のオブジェクトを変更してんだ?
607 は、漏れも知りたい。
前に SEND MORE MONEY を解いた時、バカなコードしか書けなかった。
615613:02/11/11 02:39
スマン。勘違いだYO。
616JPS ◆M0LaMzf5rY :02/11/11 02:39
>>613
Aを二回変更してるんでないの?
>>608
何を唐突に・・・
618デフォルトの名無しさん:02/11/11 02:41
>607
よく分からん.等しくなるようなpairが1つでもあったらすべての処理をShinainoka?
きっと、「10個のうちどの2個をとっても互いに異なっている」ように
したいのだと思われる。

いろんなやり方があるが、10個くらいなら
int a[10], flag[10], i;
for (i = 0; i < 10; i++) {
flag[10] = 0;
}
for (i = 0; i < 10; i++) {
if (flag[a[i]-1]) { 重なっている }
else flag[a[i]-1] = 1;
}
とやればよいのでは。
620デフォルトの名無しさん:02/11/11 02:42
>>610
>>611

馬鹿でした.すいません
実はわかりやすくするために配列で変数を書いたのですが
実際にはわかりやすいように変数ごとに違う英単語を
使ってたので話がややこしくなってました

コード func(i++,i++); は、func() に何が渡るかわからないが i は確実に 2 つ
増分されるという事でよろしいか?
>>621
それはいいだろ?
623デフォルトの名無しさん:02/11/11 02:43
>>619
あ,そういうことです
まったく解決してませんでした(;´Д`)

今から解読してみます
>>622
よくねーよ(藁
>>621
未定義だって言ってるだろが。
>>624
そうか?
どちらのi++が先に実行されるかわからないけど、確実に二回i++を行うだろ?
>>619
それ、バブルソートよりももっと無駄な比較が発生しないか?
それなら素直に if をずらっと並べた方がマシだ。
>>626
もうネタは結構です。
>>626
C FAQくらい自分で読め。
>>626
もっぺんC-FAQの11.33読み直せや。
>>622
カンマで副作用完了点が発生するという考えは間違っているのか?
>>623
int *ipa[10]にその変数たちのアドレスをひとつずつ入れてゆけば?
633631:02/11/11 02:47
間違い。宛先は >>625
>>631
カンマ演算子と関数のパラメータ区切りのカンマは違うぞ。
635632:02/11/11 02:48
それよりも
enumで名前をつらねていって、それをintの配列の添え字にした方がいいか。
比較するときは裸の数字を使って。それ以外はenumで定義した名前を使って。
おまえら、本当はCの仕様ちゃんと理解して無いだろ。
>>635
607 は、0 〜 9 の順列を取りたいんじゃないのか?
>>636
理解していなくてもi=i++やfunc(i++,i++)なんてコードは書きませんから。
>>636
あなたが C の仕様ちゃんと理解してるのはわかったから、早く >>631
答えてくれ。
640デフォルトの名無しさん:02/11/11 02:51
>>619

それで比較されていますか?
a[i]とa[j] i≠j の比較なんですが・・
よくわからないです

>>632
アドレスを入れるとどうなるのですか?

>>635

よくわからないです
実際には誰も書かないような糞式をいちいち未定義ネタとして
挙げんなっつーの。
いちおう初心者スレなので理解していないヤシばかりなのだが。
>>639がCの仕様を理解していないのが分かってしまったわけだが。
>>637
>>619には全ての数字が異なっているようにしたいと書いてあるけど
>>644
そういうのを、0、1、2、3、4、5、6、7、8、9 の順列って言わないか?
だから関数の引数のカンマはsequence pointじゃないって。
0,4,22,2,-5,.....,1000

これでもいいんだろ?順列といえる?
>>641
誰も書かないような分かりにくい書き方を好んで書くのが真のC使いだろ(藁
650648:02/11/11 02:54
ん?
0から9までだっけ?
じゃあループして入れればいいじゃん(笑)
651デフォルトの名無しさん:02/11/11 02:55
>>644
そうです

例えば変数3個で i,j,k だとすると

for (i=0 ; i<=10 ;i++){
for (j=0 ; j<=10 ;j++){
for (k=0 ; k<=10 ;k++){

でまわして,このなかでも i≠j i≠k j≠k
の場合を考えたいのです

変数が10個だと 10C2通り必要なので
いちいち全部書くのは面倒なのです

おバカな煽り厨が1人混ざってんな。
sequence pointのカンマなんかいらんだろ。他の書き方をすれば良い訳で使う必要性なし。
654648:02/11/11 02:56
えっと、配列じゃなかったんだっけ?(汗
じゃあa=0;b=1;c=2とかいちゃえ。
>>649
そう思っているのは未熟なおまえだけ。
とっとと消えろ。カス。
早く寝ろよガキども。
int strcmp(const char *p, const char *q)
{
if (*p != *q) return *p - *q;
else if (! *p) return 0;
else return strcmp(++p, ++q);
}
これはOK?
658614:02/11/11 02:57
漏れが SEND MORE MONEY を書いた時は、

for (i=0 ; i<=10 ;i++){
for (j=0 ; j<=10 ;j++){
if(j == i) continue;
for (k=0 ; k<=10 ;k++){
if(k == i || k == j) continue;

と書いた。
もっとマシな方法があったらキボンヌ。
>>653
誰もそんな話はしていない。
>>652
お前の事か。
俺がしている。
>>657
お。なんかカッコいいね。実用性はともかく。
663614:02/11/11 02:59
>>660
お前のことだボケ。
>>651, >>658
奥村本を嫁。
順列のとこ。
665663:02/11/11 03:00
名前間違えた。
>>662
実用性って…
whileで書いてもまったく同じコードが出るが?
667658:02/11/11 03:01
>>664
本を買う金が無い。
>>667
          ,. -───-: 、
          /::::::::::::::::::::::::::::::::\
          / '':::::::::::::::::::::::::::::::''''' ヽ
         !::::::::::ィ::ハ:::;::::::::::::::::::::::::::!
       i::|:::i::/l/  i;::ト、:、:::i:::::::::::::::i
       |::i/レ'-i''  'ヽi-ヾ,ヽ!:::::::::::::l
       |::ハ -‐-   -─- i::::::::::::::l
       |::::::l|  |     |  | |::::::::::::::!
       |::::::ヽ | r---、! l,.!::::::::::::::l
       l::::::::::::`;'-'=,‐,='r''i~!:::::::::::::::|
         !:::::::l、::r'"´'. ' l ' i::::::::iヽ:::l
       i:l、:::|./、_____,l::::;l:/‐'ヽ!
        '!ヽ;i'>l____,.//-‐'''"ヽ
            !/ |.VVVVVVVV.lV\!. i
         |  |        |    l
大阪?
670デフォルトの名無しさん:02/11/11 03:03
>>667
貧乏人は低レベルなところでちょこちょこやってろ。
672662:02/11/11 03:03
>>666
はあ?意味わからんよ。
コンパイラがまったく同じコードを吐くってこと?
>>657
>>649をみろ。
>>672
そう。
こういう再帰はループとまったく同じコードになる。
>>657
わかりやすいコードだね。
やはり再帰はエレガントで良い
しかしなぜに前置++?
677662:02/11/11 03:06
>>674
そうなんか。
ごめん。知らんかった。ちょっと自分でも試してみるわ。
ばかばっか
真のC使いは再帰とループの両方で書けるとき再帰を選びます。

難しそうに見えてかっこいいから(藁
680651:02/11/11 03:08
>>657
これは俺へのレスですか?
考えてみます
>>675
二分木扱うときは再帰使うと実にうまく書けると思ったけど、strcmpは・・・
>>675
真のC使いハケーン(藁
>>680
全然違うだろ(ワラ
さっきからの未定義論争だよ
684531:02/11/11 03:08
激しくサンクス
再帰のほうがやさしいだろ。
qsortとか2分探索とか…
再帰は未定義です
>>685
二つしかあげられませんでした。
memcpyを再帰で書くとどうなりますか?
>>685
クイックソートは分かるが、二分探索(二分木じゃないよな?)はループの方がわかりやすくないか?
678 は昨日も同じことを言ってたバカ
再帰が得意で好きな人は再帰の方がやさしいだろ。だから再帰がやさしいんだ。
まあループをわざわざ再帰にする奴はDQNってこった。
>>670 の URL のコードは、変数名が短かったりグローバル使ってたりして素敵だな。
void *bsearch(const void *key, const void *base, size_t nmembers,
       size_t size, int (*compar)(const void *, const void *))
{
 if (nmembers == 0) {
  return NULL;
 } else {
  size_t half = nmembers / 2;
  void *mid = (char *)base + size * half;
  int r = compar(key, mid);

  if (r == 0) {
   return mid;
  } else if (r < 0) {
   return bsearch(key, base, half, size, compar);
  } else {
   return bsearch(key, mid + size, nmembers - half - 1, size, compar);
  }
 }
}
>>693
> free((char *)c)

これ変だよね。freeはvoid *を受け取るのにわざわざキャストしている。
真中より小さければ左半分を、
大きければ右半分を探す。

わかりやすいじゃないか。
俺が書いたコードなんで結構無駄なことやっているとおもう。

void *bsearch(const void *key,const void *base,size_t nmemb,size_t size,int (*compar)(const void *,const void *))
{
const unsigned char *left,*middle,*right;
int result;

left=(const unsigned char *)base;
right=left+(nmemb*size-size);

while(left<=right){
middle=left+((right-left)/size/2*size);
result=(*compar)(key,middle);
if(result==0)
return (void *)key;
else if(result<0)
right=middle-size;
else
left=middle+size;
}

return NULL;
}
memcpyは末尾再帰じゃ書きにくい。返す値がアレだから。
699662:02/11/11 03:19
>>674
試してみたけど、BCC(標準設定)では最適化されず、
再帰のままのコードを吐いたよ。
VC++(Releaseモード)では確かにループに展開された。

というわけで、再帰がループと同じになるとは
決め付けない方がいいね。
700651:02/11/11 03:19
>>651 は結局良い方法はないのでしょうか・・
701694:02/11/11 03:20
>>694の再帰呼び出しは、
引数の代入+gotoと思って読んでね。
実際、気の利いたコンパイラならそういうコードを吐く。
もちろん再帰がいつでもループに変わるという保証はない。

ループで書くとややこしいアルゴリズムはまず再帰で書いてみる。
それで十分効率の良いコードになったなら、わざわざわかりにくいループに
書き直す必要はない。
>>699
それは最適化オプションの有無で違うんじゃないのかい?
>>700
簡単な方法では >>658
気の利いた方法では >>664>>670
705651:02/11/11 03:28
>>704
なるほど
読んでみます
706662:02/11/11 03:28
>>702
それなら納得。

>>703
標準設定で試しただけだから何とも言えんが、どちらにしても
666の
> 実用性って…
> whileで書いてもまったく同じコードが出るが?
のように処理系に依存する話をそのように決め付けるのは
ヤバいね。
2進→10進変換も再帰で書いたほうが
簡潔だった気がする。
そう言えば、シフトの話って決着した?
>>708
とうの昔に。
そう言えば、配列の値渡しの話って決着した?
(なんでこのスレの住人は過去ログを読まないんだろう…。)
(なんでこのスレの住人は過去ログを読ますんだろう…。)
そう言えば、func(++i, ++i) の話って決着した?
714662:02/11/11 03:42
>>703
引き続き最適化オプションを色々指定して試したけど、
BCCではやっぱり無理みたい。
勝手にやってろ!
俺はもう寝る。
716デフォルトの名無しさん:02/11/11 03:46
結論書いとくか。
負の数をシフトしたら結果は未定義。
符号付の数を左シフトしてあふれても結果は未定義。

配列の内容をそのままコピーして関数の引数に入れるような機能は
Cにはない。そういうことをしたければ、構造体で囲うなどしなければならない。
そうでもしない限り、配列の先頭アドレスのポインタ値が仮引数に(値渡しで)
渡される。

関数呼び出しの実引数を区切るカンマは、カンマ演算子ではない。
sequence pointではない。
>>716
疑問 2 点。
「負の数をシフトしたら結果は未定義」 という事は、(signed)i >> c; は OK?
「カンマ演算子ではない」 = 「sequence pointではない」 の根拠は?
718717:02/11/11 03:50
失礼。
(unsigned)i >> c;、(unsigned)i << c;
>>718
unsignedにキャストすれば結果は決まっている。

「カンマ演算子でないから」というわけじゃない。
「カンマ演算子ではなく、sequence pointでもない」
ちなみに、負の数をunsignedにキャストするとどうなるかは
処理系定義。
サンクス。

で、これで済む話を、みんな延々と何やってたのだろうか。
>>716
> 「カンマ演算子ではない」 = 「sequence pointではない」 の根拠は?

719が模範解答だけど、別の答えとしては
副作用完了点の定義に含まれるのはカンマ演算子で、
関数の実引数の区切りは含まれていない。
この場合に副作用が完了するのは、実引数の評価が
すべて完了した後となる。
>>717
ちなみに負の数の右シフトは未定義ではなく、処理系定義だよ。
>>607
C++ だと、こんなに簡単なのな。

vector<int> v;
for(int i = 0; i <= 9; i++)
  v.push_back(i);
while (next_permutation(v.begin(), v.end()))
{
  ...
}
725724:02/11/11 05:04
do while じゃないとダメな事に気付いた。
726デフォルトの名無しさん:02/11/11 05:37
一日で700
一晩で、だろ。
sage

#include <stdio.h>
#define first(n) ((unsigned) ((1U << (n)) - 1U))
enum{N=5,K=2};/* 0-NからK個選ぶ各組み合わせに対する全順列を表示 */
int basicnum[K];
void show_perm(int *bn){
  int i,k=1,t,c[K+1];
  for(i=1;i<=K;i++)c[i]=i;
  while(k<K){
    if(k&1) i=c[k]; else i=0; t=bn[k];bn[k]=bn[i];bn[i]=t;
    for(k=0;k<K;k++)printf("%d ",bn[k]); /* ここで各場合(bn)に対する処理 */
    printf("\n"); k=1; while(c[k]==0){c[k]=k;k++;} c[k]--;
  }
}
unsigned nextset(unsigned x){
  unsigned smallest, ripple, new_smallest, ones;
  smallest = x & -x; ripple = x+smallest; new_smallest = ripple & -ripple;
  ones = ((new_smallest/smallest)>>1)-1;
  return ripple|ones;
}
void setbasicnum(unsigned s)
{int i,j=0; for (i=1; i<=N; i++) { if (s&1) basicnum[j++]=i-1; s>>=1; }}
int main(void){
  int i=1; unsigned x=first(K);
  while(!(x&~first(N))){setbasicnum(x);show_perm(basicnum);x=nextset(x);i++;}
  return 0;
}
かき回した奴寝る→話まとまる→ログ流れる→かき回した奴起きる
の繰り返しだな
731729:02/11/11 08:42
アルゴリズム事典からパクって組み合わせてみました。
N(アルゴリズムの関係上sizeof(int)*8ビット以下の数),K(<N)を適当にいじって
みてください。
ex.(N=5,K=2:0-4の内の2つを選んだ時の順列)
$ hoge
0 1
1 0
0 2
2 0
1 2
2 1
0 3
3 0
1 3
3 1
2 3
3 2
0 4
4 0
1 4
4 1
2 4
4 2
3 4
4 3
732デフォルトの名無しさん:02/11/11 11:23
お前等、いつまでくだらない無いことやってんだ?
おまえらが馬鹿なのか? それともC言語の仕様が難しいのか?
中傷をすることでしか自分を保てない哀れな 732 の登場
擁護することでしか自分を保てない哀れな 733 の登場
各処理系についているヘルプが貧弱なんだろ。
まともに解説しているヘルプや本がない。
コピペでしか煽りすらできない無能な 734 の登場

>>735
それは確かに。
VC++ とかも 「ANSI 準準拠」 とか言われたら大体信じちゃうよなあ。
煽りすらまともな日本語で書けない無能な 736 の登場
いいからお前ら >>577 を読め。
736 の文章がコンパイルエラーになってしまう貧弱な日本語エンジンを持つ 737
740デフォルトの名無しさん:02/11/11 12:43
線形リストは、ノードが増えるたびにmallocないしnewで領域を確保しますよね。
そしてプログラム終了時はfreeかdeleteをつかうわけですが、
ただ単にfree(node)やdelete nodeとするようにポインタ名に対して1回だけ
やってやればいいのでしょうか?
それとも領域を確保したすべてのポインタを指定して開放しないと
いけないんでしょうか?
>>740
確保したすべてのポインタに対して開放処理が必要。
>>740
> プログラム終了時はfreeかdeleteをつかうわけですが
いいえ、まともなOSや処理系ならば、
プログラム終了時にはfreeかdeleteをつかう必要はありません。
>>740
ワラタ
>>742
またその話ですか?
745743:02/11/11 13:09
スマソ、宛先は 742

>>744
メ(以下略)
>>740「プログラム終了時」かどうかは置いといて、
とにかくfreeとかdeleteしたいときにどうするか
ということなら、malloc or newした回数だけ
free or deleteする必要がある。

HeapDestroy() で一発
exitで一発
749720:02/11/11 13:25
>>742
プログラム側で開放しなくても終了時にOSがかってに開放してくれるんですか?
C++始めたばかりでよくしらんのですが、それはメモリリークを引き起こすんでは
ないでしょうか?

>>741、746
助言ありがとう御座いました
>>749
引き起こさない。
スタック領域やグローバル変数領域がちゃんと解放されるのと同じこと。
>>749
引き起こす環境もあるかもしれんが、
そういう環境ではどうせまともにプログラミングなんかできない
から、解放しようとしても無駄。
>>749
少なくともUnix系OSやWindowsやMax OS Xでは大丈夫だよ。
デストラクタ呼び出されないからちゃんとdeleteしろ。
環境依存なプログラミングはできるだけするな。
754720:02/11/11 13:33
だいぶ理解できました
>>751
MacOS9以下はまともにプログラミングできてましたが?
>>750
> スタック領域やグローバル変数領域がちゃんと解放されるのと同じこと。
C/C++でちゃんとやると決まっていることとOSがやってくれるに違いないは違う。
>753
プログラム終了時はデストラクタが呼ばれるんじゃないか?
742 は、メ(以下略) からしてネタなのに、何でみんなこんなに熱くなるんだ・・・。
面白すぎるぞ。
>>757
new したものを自動で解放してくれる処理系があったら知りたい。
で、スレ違い。
終了時に解放するのがめんどくさいならJavaとかC#使えよ。
>>757
簡単に試験できるんだから、まず試してみろ。
関係無いけど、メモリリークはgc持ってても起きる可能性があるよ
>>762
スレ違いだが興味ある。
GC 管轄外のメモリ機能を使う以外に、どんな可能性がある?
>>762
具体例プリーズ
具体例レリーズ
( ',_`)グプ
出任せか ヽ(´ー`)ノ
762じゃないけど、たとえばリングバッファを使ってFIFOを実装したとき、dequeしたときにポインタを進めるだけじゃなくて、ちゃんと参照を消さ
ないとリークする。

CやC++のプログラムを機械的にGCmalloc()を使うように書き換えたりする
ときに、こういう事が起きる。
C/C++ のニセ GC を GC と言うな。
保守的GCは立派なGCだと思うが...
それに、参照を消し忘れるとリークするのは
どんなGCでも同じ。
>>770
VB は?
772770:02/11/11 15:27
VBが何?
VB.NETにはまともなGCが入っている。
それより前のVBは、Perlとかと同じ参照カウント方式の疑似GC。
参照カウンタ方式は擬似なのか。方式の違い程度のことだと思うのだが。
参照カウンタだと循環参照は回収できない。
双方向リスト作ったりすると即リーク。
776デフォルトの名無しさん:02/11/11 17:39
mallocして得た領域を開放せずに終了した場合、大抵は解放されると思うけど、それってCの規格で保証されている?
開けっ放しのストリームは閉じられることが保証されていたと思うけど。
777JPS ◆M0LaMzf5rY :02/11/11 17:43
>>776
保障されてない。でも実際は開放されてるっぽい。
俺は絶対free()する派
778デフォルトの名無しさん:02/11/11 18:10
>>776
終了したプロセスの資源を解放するのはOSのお仕事。言語仕様で規定しても意
味がない。
free()はメモリを「開放」する関数ではない。
メモリを「解放」する関数だ。
さっきから開放と言ってる馬鹿共はCを使う資格はない。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/free.3.html
2chで誤変換をいちいち指摘するバカは2chを使う資格は無い。
>>779
たかが漢字間違いぐらいで鬼の首を取ったようなことを言うなよ
※ここから10レスくらいは罵り合いで消費されるので見なくてOK※※
>>780 >>781
うるせー。馬鹿共。
>>783
(・∀・)ニヤニヤ
>>778
意味あるだろ。
>>778
それを言ったらストリームを閉じることだってOSの仕事になるんじゃ・・・
>>786
> >>778
> それを言ったらストリームを閉じることだってOSの仕事になるんじゃ・・・
ちがう。Cで規定されているのは単にストリームを閉じるためでなく、ファイ
ル構造体のバッファをフラッシュするため。ユーザプロセスに割り当てたメモ
リにはそんな話はあてはまらない。
昔、「解放」って書いてたんだけど、
「開放」と書く人が多いんで、最近はそうするようにしてた。
結局どっちが正しいの?

ぐぐってみました。
「free 解放」 約15100件
「free 開放」 約19000件
意味考えりゃ「解放」に決まってると思うが
>>787
>>778には資源を解放って書いてあるじゃん。資源はメモリだけのことじゃないぞ。
>>787
いみわからん
>>788
> 結局どっちが正しいの?
「free 解放 C言語」 約1,970件
「free 開放 C言語」 約1,240件
ですが何か?
790はバッファの「フラッシュ」と「開放」の違いも理解できないと思われ。
「開放」だってよ。 >>793必死です(w
規格書:JIS X 3010-1993 7.10.3.2 free関数の引用
  free関数はptrが指す領域を解放し、その後の割付けに使用できるようにする。ptrが空ポインタ
  の場合、何も動作しない。それ以外の場合、実引数がcalloc関数、malloc関数若しくはrealloc関数によっ
  て以前に返されたポインタと一致しないとき、又はその領域がfree若しくはreallocの呼出しによって解放
  されているとき、その動作は未定義とする。
ですが何か?
796788:02/11/11 19:25
>>795
規格書は「解放」ですか。
それに習うことにします。
797788:02/11/11 19:27
間違えました…
×習う
○倣う
やれやれ、またこの話題かYO!別のスレ立てろや、うぜーから。

何も分かってないJPSは黙ってろ。
799798:02/11/11 19:59
まぁ開放だけどね
800デフォルトの名無しさん:02/11/11 21:23
800age
801デフォルトの名無しさん:02/11/11 21:26
char hoge[32] = "";
なんつーふうにやった場合、
最初の\0の後は0で埋められるんでしたっけ?
グローバルなら。
803デフォルトの名無しさん:02/11/11 21:29
質問です。
int hairetu[MAXSIZE];
について、main()の中で宣言するよか外で宣言するほうが
MAXSIZEを大きくできるのはなんでなんですか?
>>803
一般にスタックのサイズは小さいから。
関数内でもstaticつければ多く取れるけど
グローバルかどうかは関係なく0で埋まります。
806801:02/11/11 21:34
ありがとさんdeath
>>806
釣られるな
808801:02/11/11 21:38
俺は釣られたの?
いいや、自分で調べま。
>>805
あーすまんそうだ。
初期値を全く与えないときは何が入るかわからないんだった。
810デフォルトの名無しさん:02/11/11 21:49
すみませんが教えてください。
以下はどのようなときに成り立つのでしょうか?
aが4よりとても小さいときだとは思うのですがどうなのでしょうか?

if(a << 4) {
}
もうネタはいいよ…
812デフォルトの名無しさん:02/11/11 21:54
int Get_FileSize(char const *file)
{
int size = 0;
struct stat st;
if(!stat("file.txt",&st)) size = (int)st.st_size;
return size;
}

は正常に値が返ってくるんですが、
"file.txt"を"../file.txt"という風に相対パスにすると、
stat("file.txt",&st)が-1になります。
ちなみに、ファイルはちゃんとあります。
どうすればいいんでしょうか?
813デフォルトの名無しさん:02/11/11 21:59
>>812
もうネタはいいよ・・・
814812:02/11/11 22:23
>>813
ネタじゃないんですけど、、
初心者ですみません。。
815813:02/11/11 22:26
>>812
struct statってなんだ?
stat("file.txt" , &st)
ってなんだ?
関数なのか構造体なのかさっぱりわからん。
これがネタでなくてなんだというんだ。
817デフォルトの名無しさん:02/11/11 22:28
"./file.txt"
815は構造体のタグ名と関数名が同じものになってはならないとでも思っているのか?(ワラ
"file.txt"も相対パスだと思うのだけど
初心者は>>815だったということで
>>812
../file.txtは親ディレクトリにあるfile.txtを指す
./file.txtでしょ
>>820
うるせーな。ネタだよネタ。おまえらは釣られたんだよ(w
>>822
それもネタですか?
824デフォルトの名無しさん:02/11/11 22:35
>>813-824
それはともかく
825 :02/11/12 00:19
826デフォルトの名無しさん:02/11/12 00:30
>>825
これ何?
>>826
ドラえもんの一場面
stat() って非標準だろ。
ここで POSIX システムコールを扱っていいなら、Win32 API も扱っていい事に
なるわけだが・・・。
829デフォルトの名無しさん:02/11/12 02:06
ファイル名に変数を入れたいときってどう表記すればいいんですか?

  A=5;
  strcpy(file,"NoA.txt",A)

"No5.txt"を読み込みたいのですが、↑のように書くと
"NoA.txt"は見つかりません。というふうなエラーが出ます。
代入の仕方を教えてください。
>>829
sprintf()

つーか strcpy() の機能をもっとよく理解すれ。
>>829
つーか <string.h> しろ。

いや、入門書から読みなおせ。
今まで見てきたネタの中でも一番すごい
833831:02/11/12 02:19
#include <string.h> しろ、だった・・・鬱
>>828
あの質問はstatがどんなものかなんて関係ないだろ。fopenでも同じことが起きるんだし。
プログラム以前の問題だからスレ違いといえばスレ違いだが。
>>829
A=5;
strcpy (file, &(((char*)"NoA.txt")[2]=A+'0')-2);

処理系によってはクラッシュします。
gccの場合は-fwritable-stringsオプションを指定する必要があります。
>>835
文字列定数を書き換えるのか(^_^;)
gccって書き換えられる領域に置くように指定することもできるんだな。
>>835
またそういうネタを・・・

そういえば、文字列リテラルって const char * なのか?
キャスト入ってるけど・・・
>>837
文字列スレッドで誰かが特に決まっていないんだねって言っていたけどどうなんだろう。
VC++6.0やBCCはchar *だけど。
char file[] = "No5.txt"; でいいじゃん。
0,1,2,3,4はどうする?
>>840
file[2]='0';とか
829 は 5 しか呈示してないから。
やるとしたら、
char *file[]= { "No1.txt", "No1.txt", "No2.txt", "No3.txt", "No4.txt", "No5.txt" };

つーか 830-831 でマジレス出てるし。
>>831は解決法じゃない。
>>843
<string.h> がインクルードされてれば、829 のコードはそもそもコンパイル
通らないわけだが。
それで間違ってるって気付けるだろうに。
つーか 842 のどこに 「解決法」 って書いてある?
ようするに、あれだ。
ネタに飢えてるわけだな。
遅レスだが >>782-784 ワラタ
847デフォルトの名無しさん:02/11/12 04:07
>>844
>>843のどこに>>842へのレスだと書いてある?
>>847 アザワラタ
>>847
だからどうしたの?
>>849
お前こそどうしたんだ?
>>850
お前は誰だ?
お前はオレだ。
853829:02/11/12 06:09
イパーイ釣れた (・∀・)
ヽ(´ー`)ノ
855デフォルトの名無しさん:02/11/12 07:44
お勧めの高橋麻奈タンの「やさしいC」について出版社から連絡ありました。Linuxでも使えないことはないし、この本をLinux用として使っている人もいるが、基本的にはWindows向きだって。
僕はVineのemacsでCをやりたいから教えてください、って言ったらこの本紹介されたのに・・・・・嘘吐き!!もうキャンセルできないよう。。。。。
856デフォルトの名無しさん:02/11/12 07:52
from >>1
> ソース丸投げ、宿題、書籍 は専門の別スレがあるからそこへ逝ってくれ。
>
> 上記を守らない書き込みをした場合、その結果は禿しく未定義とする。
857デフォルトの名無しさん:02/11/12 07:56
>>855です。実は今日買わなきゃなんです。使える本であることを希望します。
858デフォルトの名無しさん:02/11/12 07:57
でもここの人っていい人ばかりですね。
もうすぐ次スレの季節だが、気が向いたら >>35-36 を拾ってくれ。
をを。

しかし、dat 落ちのままのスレが 12 本って、このスレの回転が無駄に早い事が
分かるな (;´Д`)
>>861
やはり、Cの未定義の結果は多くの場合、coreを吐くからな。
(core = 煽り合い)
仕方がない
>>843-853大ワロタ
864JPS ◆M0LaMzf5rY :02/11/12 15:58
ビット演算の勉強はかどりますた。
やべー。
860 の文字列が全部、スラッシュで区切られた 「ワラタ」 に見えたYO・・・
眼科に逝くべきか、精神科に逝くべきか。
86760cm浮き上がるストレート:02/11/12 16:42
printf等で値を外からを与えることで幅を変える事は出来ますか?
うまく説明できませんが、printf("%s","%-30s","abcde");みたいに。
今は、あらかじめ幾つも作っとく方法でやっているのですが.
868デフォルトの名無しさん:02/11/12 16:45
sprintfでつくってprintfかな。
>>867
マニュアルを読め、printf/scanfは奥が深い
int a = 5;
printf("%*.*s\n", a, a, "abcdefg");
a = 20;
printf("%*.*s\n", a, a, "abcdefg");
すいませんまだCを初めて間も無い厨です
質問したいんですが
文字列と文字を一緒に出力しようとすると
なぜか文字だけ出力されません
具体的には
#include <stdio.h>
main()
{
char ch[100];
char c;
printf("文字列:"); scanf("%s", ch);
printf("文字:"); scanf("%c", &c);
printf("\"%s\"\n", ch);
printf("\'%c\'\n", c);
return 0;
}

とやるとscanf("%c", &c);を読みこんでくれないようなのです
ちなみに文字列なしで文字単体のプログラムをするとちゃんと出力されました
どなたか知恵をお借りしください
> どなたか知恵をお借りしください
ヘンナニホンゴネ
>>868->>869
お答えありがとうございました.
>>868
その方法は調べて勉強してみます.
>>869
あるだろうと思ってたんですが、あったんですね.文字列に割り込めるやつ.
1つ目の*は従来のスペース幅を替えるやつ。引数をマイナルにすれば左寄りになる.
2つ目の.*は始めて見たのですが、どうやら表示文字数を変えるやつみたいですね.
文字列が10文字でも.5なら先頭から5文字だけ表示する。
ただこれは文字列専用のようで、%ldとかだと効かないみたいです.
873870:02/11/12 17:23
>>871
お貸し下さい
でしたすいませんm(__)m
printf("文字:"); scanf("%1s", &c);
>>870
> 文字列と文字を一緒に出力しようとすると
> なぜか文字だけ出力されません
はて、ちゃんと「改行文字」が出力されているはずだけどな。

多分
> printf("文字:"); scanf("%c", &c);
printf("文字:"); scanf(" %c", &c);
こうすれば、(%cの前にスペースを入れる)君の思ったとおりの動作をするはずだ、
なんでそうなるかはマニュアルを見ろ。
>>874
%1sって\0入れない?
877870:02/11/12 18:04
みなさんありがとうございます解決しました!
いくつかやり方があるようなのでその辺の仕組みは調べてみます
>>875
まさにその通りです

文字列:hogehoge
文字:"hogehoge"
'
'
こんな感じで改行だけされてました
#include<stdio.h>
#include<search.h>
#include<string.h>
#define MAXDATAS 20
#define MAXCHARS 20

int lencmp(char **ax,char **ay)
{
if(strlen(*ax)<strlen(*ay)) return(-1);
if(strlen(*ax)>strlen(*ay)) return(1);
return(0);
}
int main(void)
{
int i,j;
char *point_date[MAXDATAS];
char buff[MAXDATAS][MAXCHARS];
for(i=0;i<MAXDATAS;++i)
{
printf("Input string[%02d]:",i+1);
point_date[i]=&buff[i][0];
gets(point_date[i]);
if(0==*point_date[i]) break;
}

qsort(point_date,i,sizeof(char *),lencmp);
printf("\n<Sorting>\n");
for(j=0;j<i;++j)
printf("%2d:%s\n",j+1,point_date[j]);
}
でコンパイルしようとしてもエラーが出てできません。エラーの内容も読みましたが知識?不足でよく分かりません
だれか教えてください!おねがいします。
>>878
qsort()の行をこうしてみれ。

qsort(point_date,i,sizeof(char *),(int (*)(const void *, const void *))lencmp);
880デフォルトの名無しさん:02/11/12 20:07
>>878
stdlib.hをインクルードしていないから

エラーじゃなくて警告じゃない?
C言語の一番大元の仕様書(ANSI?)ってどうやったら手に入れられます?
>>880
qsort()ならsearch.hをインクルードしてるから大丈夫だよ。
883880:02/11/12 20:11
あとgccなんかだとimcompatible pointer typeと警告が出るかも。
消したかったらint lencmp(char **ax,char **ay)をint lencmp(const void *ax,const void *ay)とし、中で適切にキャストするとよい。
884883:02/11/12 20:13
s/imcompatible/incompatible/

>>882
そうなの!?
search.hなんてしらねー(T_T)
>>878
エラーメッセージがわからなかったら、それをここに貼るといいよ。
>>881
> C言語の一番大元の仕様書(ANSI?)ってどうやったら手に入れられます?

ISO/IEC 9899:1999はhttp://www.ansi.org/で$225で売ってる
ISO/IEC 9899-1999はhttp://www.ansi.org/で$18で売ってる
JIS X3010‐1993:はhttp://www.jsa.or.jp/で8000円で売っている
JISのC99はまだ出てない。
887デフォルトの名無しさん:02/11/12 20:38
Cでwindows上で動くアプリって作れるんですよね?
で、今後の目標に、Cではどんなアプリが作れるのか見たいのですが
Cで作られたアプリってどんなのがありますか?
888デフォルトの名無しさん:02/11/12 20:40
http://pc3.2ch.net/test/read.cgi/tech/1037101156/

まだ早いかと思いましたが、新スレたてました。
950くらいまではこちらを使ってください。
889881:02/11/12 20:40
>>886
どうもっす。
>>887
面倒なだけでどんなアプリでも作れる。
>>887
数え切れないけど、例えばお馴染みのFFFTP
http://www2.biglobe.ne.jp/~sota/ffftp.html
>>887
普通のアプリなら、なんでも作れるよ。
ドライバとかは、もしかしたらアセンブラが必要かも知れないけど
>>887
> Cでwindows上で動くアプリって作れるんですよね?
C + Win32Apiを使えば大概のものは作れる。
894878:02/11/12 21:12
879さんのおかげで無事コンパイルできました!サンクスです!
895デフォルトの名無しさん:02/11/12 21:20
あげ
Cで子供も作れる
897デフォルトの名無しさん:02/11/12 21:39
>>896
もうネタはいいよ・・・
898JPS ◆M0LaMzf5rY :02/11/12 21:54
おいお前ら!ここは質問すれだろ!
論争するならこっちでやれ!おれがたててやったYO!
http://pc3.2ch.net/test/read.cgi/tech/1037105440/l50
>>898 厨房氏ね
900デフォルトの名無しさん:02/11/12 21:57
#include <stdio.h>

main()
{
int dec, bin=0, bit, coef=1;
char endchar;
do{
scanf("%d%c",&dec,&endchar);
printf("%3d\t",dec);
while(dec != 0){
bit = dec % 2;
dec /= 2;
bin += bit*coef;
coef *= 10;
}
printf("%10d\n", bin);
}while(endchar != '*');
}

10進数→2進数のプログラム。参考書どおりに打ったのにちゃんとでてきませぬ。
13, 10, 8, 7, 5, 3*と打つと、最初の13は正しく出るのですが、10以降はボロボロ…
「おまいのここが違ってる!!」というのがあったら教えてください。
おながいします。
901デフォルトの名無しさん:02/11/12 21:59
ちなみに動作環境はOSがXP、「Borland C++ Compiler 5.5.1」で「C言語を始めよう」を使ってます。
902デフォルトの名無しさん:02/11/12 22:07
>>900
coefがループごとに初期化されてない。
903デフォルトの名無しさん:02/11/12 22:18
char a[10] = {'\0'};

char a[10] = {0};
はどちらも全要素0で初期化されますよね?
904デフォルトの名無しさん:02/11/12 22:19
>>903
される。つーか何度もその話題は出ている
>>904
何度でたか知らんが、オレは初めて見た。
お前のために地球が回ってるんじゃねーんだよ?
>>905
いや、十分FAQだと思うよ。
>>905
それはただ単におまえが無知なだけだ
>>905
わけのわからん煽りだな。

905=903に違いない。
配列の要素a[1]を1[a]と表せると聞いたんですが1という配列のa・・・?
変数名の先頭に数字は使えないはずですよね?
>>909
a[1] == 1[a] = *(a + 1) == *(1 + a)
>>905
>>801

つい最近出たばっか。>>905は過去ログを読まないDQNの典型。
>>910
意味不明
913≠909:02/11/12 22:45
>>910
そういうのはどこで習うんすかね。
どういう本を読めばいいんですか。
910 は意味不明
a[1] == *(a + 1) == *(1 + a) == 1[a]
だろ?
>>912
お前が意味不明。
916915:02/11/12 22:47
>>915
俺が意味不明だった。
>>913=>>905の予感
回答がテンプレート化するほど既出なのはわかるが(なんせスレ41)
簡潔すぎて初心者にはわかりにくいスレになってしまったのかも
寂れたねぇ
錆レターね
だれか前40スレを読破して、FAQつくらないかなぁ。

まあFAQ作っても読まない香具師はいるだろうが、、、
俺もそういうの考えたことある。<CスレFAQ
923デフォルトの名無しさん:02/11/12 23:24
>>902
binとcoefの初期値設定の場所を変えたら成功しますた。ありがとうございます。
そうですね、どんどん大きくなりっぱなしってね
早く質問こないかな
正直言ってa[1]を1[a]なんて書く必要なんてないわけで
コンパイルエラーになってくれたほうが良い。
まーねー
x["0123456789abcdef"]
お前ら、何でCには真偽値型がないんだ。
if(flag==true)
って書くと期待通りに動かないじゃないか、この糞言語め。
>>928
何それ?文字列の中のxの位置の文字ってこと?
>>930
すぐ上の914で出たばかりですが。
932デフォルトの名無しさん:02/11/12 23:50
"0123456789abcdef"[x]
933デフォルトの名無しさん:02/11/12 23:53
>>929
> if(flag==true)

真偽値のある言語でも、こういう書き方してるのって素人くさいと思う。
"01234567[x]89abcdef"
これぐらいで文句をいってはいけない。
その昔、構造体のメンバのアクセス演算子が
! 立ったころ、 foo!bar を bar!foo と
書くことができたんだそうな。
>>930
2進16進変換で使うだろ。
>>933
真偽値のない言語を使ってるヤツからはそう見える。
いい加減釣りは余所でやってくれ。
>>936
使いません。
>>937
おまいが C 言語しか触ったことないのバレバレなんだが
>>940
何で分かったの?不思議。
> if(flag==true)

なぜ
if ((flag == true) == true)
と書かないんだ?
>>942
プ)
お前こそ C 言語しか触ったことないのバレバレ
bool 型がある言語だとこんあ漢字?

if flag = true then ...
if flag then ...

if a = b then f := true else f := false;
f := a = b;

>>942
if(flag)だけだとflagが真偽値が明確ではない。
if(flag==true)だとflag真偽値であるのが明確。
if((flag==true)==true)は既にflagが真偽値であるのが明確なので無意味。
946945:02/11/13 00:14
分かると思うけど一応訂正。
× if(flag)だけだとflagが真偽値が明確ではない。
○ if(flag)だけだとflagが真偽値であるか明確ではない。
>>945
いいから黙って if(flag) を使っとけ。これ最強。
>>947 苦し紛れだね
if文が実行されれば真、されなければ偽。これほど明確なことがあるか。
見て、勝手使って http://rec.ncos.co.jp
で診断してもらった方がいいね。
>>949 ほらね。実行しなきゃわかんないんだろ。
bool flag2 = (flag==true);
if(flag2==true) {
}

ここまでやれば完璧。誰が読んでも明白。
>>951
バカか。
if(flg==true)
と書いたって実行しなきゃわからんだろ。
#define flag true
955945:02/11/13 00:31
>>953
実行しないで(ぱっと見るだけで)分かるのはflagの型。
>>952
それは結局。if(flag==true)と同じなんだけど...
>>955
見るだけで何がわかるんだよ。
flgは真偽しか返さないのにいったい他に何がわかるんだ。
>>957
flagの型って書いてあるだろ。まあコーディング規約でflagは真偽しか
返さないと決めてあるのなら別だが。
if(flag)//flag is true or false
kanpeci
>>958
どうしても型が知りたいっていうなら別だが・・・
型を知ってどうするんだ?
そこで型がわかったところで意味ないと思うんだが。
#define isTrue(x) x!=0
>>960
可読性が上がるだろ。
if(flag)より
if(flag==true) の方が可読性で勝ると思ってる奴は初心者。
ふむ。
gcc version 2.95.4

#include <stdio.h>
#define N 4
int main(void)
{
  int j;
  char a[N] = "";

  for (j=0;j<N;j++)
    printf("%d ", (int)a[j]);
  return 0;
}
$ ./a.out
0 37 100 32
なんかゴミが入るんだよなぁ。

c99 6.7.8 12
If there are fewer initializers in a brace-enclosed list than there are
elements or members of an aggregate, or fewer characters in string literal
used to initialize an array of known size than there are elements in the
array, the remainder of the aggregate shall be initialized implicitly the
same as objects that have static storage duration.
a. 明日雨が降ったら、遊びに行くよ。
b. 明日雨が降ったら、が真なら、遊びに行くよ。
>>963
反論できないから初心者ということにして誤魔化すことしかできない程度
>>966
a. 旗だったら、遊びに行くよ。
b. 旗が立ったら、遊びに行くよ。

要はflagがbool変数かどうかを知りたいってこったな。
つまりそれがC99で書かれていることが読み取れるわけだ。
(´_ゝ`)ふーん
>>968
えらく自分の都合のいいように解釈してるな(w
>>970
そう解釈できるのだから間違ってないだろ。
俺あんな次スレやだよ。伝統守って欲しいよ。だからこれきぼん。

--------------------
C言語のことは漏れに聞け!char *c[42];

漏まえら、C言語のことなら漏れに聞け。

問題をちゃんと切り分けて、Cの話かそうでないか洗ってから質問してくれ。
というより、聞く前に一応 Web で検索しろ。
コンパイラを探してるなら >>2 を見ろ。

GUIとか、C標準でできない事の質問は使ってる開発環境のスレに逝ってくれ。
ソース丸投げ、宿題、書籍 は専門の別スレがあるからそこへ逝ってくれ。

上記を守らない書き込みをした場合、その結果は禿しく未定義とする。

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/
推薦図書/必読書のためのスレッド PART6
http://pc3.2ch.net/test/read.cgi/tech/1033207156/

前スレ
c[41] = "http://pc3.2ch.net/test/read.cgi/tech/1036876790/";
>>969
自分で何を言っているか分かっていますか?
ずいぶん新着レス数多いなと思ったら・・・・香ばしいな
975次スレの>>3:02/11/13 00:55
976次スレの>>4:02/11/13 00:56
977次スレの>>4:02/11/13 00:56
>>973
型が知りたいんだからそういうことだろ。
flag の型が知りたいから
if ( flag == true )
とするってならこんどは (flag == true) の型を知るために
if ( (flag == true) == true )
こうしなければならない。さらに ((flag == true) == true) の型を知るために(略
bool型があるならまだいいけど無いならあんまり必要性感じないなぁ<true比較
C99じゃないならflagの型を知りたいと言ってもintの可能性があるんだろ?
じゃあ型がわかったことにならないんじゃ。
むしろ
int flg;
とかやってるのに
if(flg == true)
を見ただけで「flgには0か1しか入っていないはず!」と勘違いする可能性が…
でも実はflg=5;とかできちゃうわけで。
よし。
if(!!flag == true)
これなら一石二鳥だ。

>>972
面白いね。
> C言語のことは漏れに聞け!char *c[42];
この辺まで考えてるとは。
>>982
ちょっとわかりにくいタイトルかなとは思ったんだけど、配列のインデックスが0から始まるC
だとちょうどタイトルの番号と過去スレの番号が収まっていいかなと
>>981
intとboolを比較したら普通はエラーだろ?
>>978
if(flag)だけだとflagが真偽値であるか明確ではない。
if(flag==true)だとflag真偽値であるのが明確。
if((flag==true)==true)は既にflagが真偽値であるのが明確なので無意味。
flagなんていう抽象的な名前で考えるから分らない。
たとえば具体的に
int error_occurred;
のとき
if (error_occurred == true)
なんて書いてたらただのDQNだろ。
>>942
なぜ
if (((flag == true) == true) == true)
と書かないのかと小一時間…
988デフォルトの名無しさん:02/11/13 01:15
ユーザーが指定した数をカウントする関数作り
i2=3;
j2=4;
ij=i2*j2;
if((str1=(int**)malloc(sizeof(int*)*i2))==NULL){
printf("メモリー確保の失敗:1");
exit(1);
}
for(i1=0;i1<i2;i1++)
if((str1[i1]=(int*)malloc(sizeof(int)*j2))==NULL){
printf("メモリー確保の失敗:2");
exit(1);
}


for(i1=0;i1<ij;i1+=j2){
putchar('\n');
for(j1=0;j1<j2;j1++){
printf("%c",str1[i1/j2][(len++)%i2]=('A'+i1+j1));
}
}
putchar('\n');
for(i1=0;i1<i2;i1++){
putchar('\n');
for(j1=0;j1<j2;j1++)
printf("%3d",str1[i1][j1]);
}
あのーC99より前のCにtrueやfalseという予約語ありませんよね?
>>987
だから足りない情報(boolであるか)は一つ目のtrueで補えているから二つ目以降は必要ないだろ。
>>985
if ( flag == true )
だと flag が真偽値であることは明確だが
(flag == true) が真偽値であることは明確ではない。
次はあのスレ行かなきゃダメなのか・・・鬱
>>991
(flag==true)は真偽値を返すことになっているはずだが。
994988:02/11/13 01:18
 このユーザーが、指定した数をカウントする関数を教えて・・・・
        まもなくここは 乂1000取り合戦場乂 となります。

      \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
     /三/| ゚U゚|\      ,,、,、,,,                       ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \オーーーーーーーッ!!/
      //三/|三|\     ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ∪  ∪       (    )    (     )   (    )    )
 ,,、,、,,,       ,,、,、,,,  ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ,,、,、,,,       (    )    (    )    (    )    (    )
>>994
今それどころじゃないんだ。
if ( DQN ) abone();
もし DQN なら あぼーん
if ( DQN == true ) abone();
もし DQN が 真 なら あぼーん
998982:02/11/13 01:19
>>983
今回はもう手遅れっぽいけど、次のスレでは
是非この案を採用して欲しいと願ふ。
999988:02/11/13 01:19
 おしえて
10001000:02/11/13 01:20
>>1001
んなこた〜わかってんだよ。いちいちウザイぞボケ。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。