C言語なら俺に聞け(入門編)Part 104
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/07/15(日) 10:28:33.18★前スレ
C言語なら俺に聞け(入門編)Part 103
http://toro.2ch.net/test/read.cgi/tech/1341059858/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 158代目
http://toro.2ch.net/test/read.cgi/tech/1339338438/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
# サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0655デフォルトの名無しさん
2012/08/02(木) 22:38:28.18printf("%f\n", 1.0F);
printf("%f\n", 1.0);
printf("%f\n", (int)1.0);
0.000000
1.000000
1.000000
1.000000
0656デフォルトの名無しさん
2012/08/02(木) 22:39:54.68j = 1, k = 3で
i = ++j, k;
とした時の i の値
実行せずに何になるか当ててみよう
0657デフォルトの名無しさん
2012/08/02(木) 22:41:06.970658デフォルトの名無しさん
2012/08/02(木) 22:42:27.890659デフォルトの名無しさん
2012/08/02(木) 22:43:05.050660デフォルトの名無しさん
2012/08/02(木) 22:44:31.880661デフォルトの名無しさん
2012/08/02(木) 22:45:39.310662デフォルトの名無しさん
2012/08/02(木) 22:48:08.900663デフォルトの名無しさん
2012/08/02(木) 23:03:24.39ttp://ideone.com/hxdVB
4番目でちょっと悩んじゃった
可変長引数は書式関係なくint(ex:4バイト)、double(ex:8バイト)、*(ex:4バイト)
でスタックに積むからゴミが残ってたんだよね
0664デフォルトの名無しさん
2012/08/02(木) 23:09:00.690665デフォルトの名無しさん
2012/08/02(木) 23:24:42.300666デフォルトの名無しさん
2012/08/02(木) 23:27:46.580667デフォルトの名無しさん
2012/08/02(木) 23:36:19.28ちなみに問題文に誤りがあってセミコロンが足りないが、そういう問題じゃない
0668はちみつ餃子 ◆8X2XSCHEME
2012/08/02(木) 23:43:57.23うわ┗(^o^ )┓ああああ┗(^o^ )┓ああああ┗(^o^ )┓ぁぁぁぁ┗(^o^ )┓ああああ┗(^o^ )┓
「ANSI C言語辞典」では float もアリって書いてあったのでそれを信用したんだが…。
http://gazo.shitao.info/r/i/20120802234040_000.png
JIS 規格にはそんなこと書いてなかった!!!
http://gazo.shitao.info/r/i/20120802234141_000.png
でもまぁ原理としては同じなのでそこらへんは柔軟に読み替えてくだせぇ。
0669デフォルトの名無しさん
2012/08/02(木) 23:50:18.11臨機応変に対応
ですね
すばらしい文言です
あなたを師と仰ぎ どこまでも付いてゆきましょう
0670デフォルトの名無しさん
2012/08/02(木) 23:51:29.310671デフォルトの名無しさん
2012/08/02(木) 23:55:03.45おまえさ、そんなの貼って誰かありがたがるとでも思っているわけ?
仮にいたとして、おまえと同類だけだぞ
0672はちみつ餃子 ◆8X2XSCHEME
2012/08/02(木) 23:58:37.97銀英伝は二次創作をいくつかちょろっと読んだだけだが、
それは印象的な場面としてよく使われてるみたいだねぇ。
0673デフォルトの名無しさん
2012/08/03(金) 00:01:03.25見たこと無い漢字とか明らかに輪郭がくっきりしてないんですが。
何十年も昔のPCからそうだったんですか?
0674デフォルトの名無しさん
2012/08/03(金) 00:06:20.56ずいぶんと参考になりました。私はビット表現まで追いかけてなかったがばれてしまった‥‥‥。それはそれで一層いや一生の恥ですorz
それはそうと、それ、厳密な典拠は特定できていなくてちょっと困っています。
ISO/IEC 9899:1999 6.5.2.2.6
If the expression that denotes the called function has a type that does not include a
prototype, the integer promotions are performed on each argument, and arguments that
have type float are promoted to double. These are called the default argument
promotions.
で、これはプロトタイプでは ... で表現されているために「プロトタイプに含まれない式」になってしまった場合、その引数は float->double になってしまうようです。
問題は
If the function is defined with a type that includes a prototype, and
either the prototype ends with an ellipsis (, ...) or (略), the behavior is undefined.
がなんのことやらさっぱり。
0675デフォルトの名無しさん
2012/08/03(金) 00:06:29.140676デフォルトの名無しさん
2012/08/03(金) 00:09:09.640677デフォルトの名無しさん
2012/08/03(金) 00:10:45.730678デフォルトの名無しさん
2012/08/03(金) 00:25:33.780679デフォルトの名無しさん
2012/08/03(金) 00:33:35.000680デフォルトの名無しさん
2012/08/03(金) 00:44:42.570681はちみつ餃子 ◆8X2XSCHEME
2012/08/03(金) 00:59:57.45前者は省略記号 (...) とは関係ないんじゃないかな。
「プロトタイプを含まない型を持つ関数」というのは例えば
hoge();
というようなプロトタイプ宣言されている関数ということで、
これに対して
hoge(14, 1.24f);
というような呼び出しをした場合にはこの 1.24f は double に拡張されるということ。
後者については前者のようなプロトタイプ宣言があった上で
hoge(int a, double b) { /* 省略 */ }
というような定義であれば大丈夫なんだけど、
hoge(int a, ...) { /* 省略 */ }
という定義だとか
hoge(int a, float b) { /* 省略 */ }
とかだったら未定義になるということを言いたいんだと思う。
つまり前段はプロトタイプ宣言のことで後者は定義ってことで。
0682デフォルトの名無しさん
2012/08/03(金) 01:11:33.960683はちみつ餃子 ◆8X2XSCHEME
2012/08/03(金) 01:16:42.64つまりはその項目は今回の printf の件とは無関係。
float は float として渡されるのであり、
受取った方がその型を知る方法は書式指定によると理解していいと思う。
0684デフォルトの名無しさん
2012/08/03(金) 01:33:00.41規格の後段について、よく理解できました。ありがとうございます。
規格の前段の記述が hoge() のみの事情なのか printf() にも適用されるのかは、意見が相違するようですね。
>>683
ふむ。
しかしいまとなっては参考にするには古いK&R2=C89・付録A7.3.2 には次のとおりで(以下<>内はQZ)
省略形<=", ...">の場合、引数<実引数>の数はパラメータ<=関数定義やプロタイプ宣言での引数型宣言>の数と等しいかあるいはそれより多くなっている必要がある。
型が明示されているパラメータの後に続く引数は、前のパラグラフ<=K&R1の関数定義について>で述べた省略時の引数格上げの受ける。
とありC89 の場合であれば printf() のような可変長引数の、可変長部分、すなわちプロトタイプのない実引数は格上げを受ける、と読み取れます。
なお、K&R1 ではどんな float も double に変換されてしまうという(int main(); int c; char **v; だったし)事情が、
K&R2=C89 では可変長部分やプロトタイプの部分に限定されるようになったとは理解しています。
ともあれ、これに対応する C99 の記述はどこなのか、それとも C99 は自動格上げを行う範囲をさらにさらに限定したのかいまいち判然としないところです。
>受取った方がその型を知る方法は書式指定によると理解していいと思う。
これはK&R1の呪縛に囚われた身には辛い。>>639 と解釈してきた以上、printf() 第一引数の書式指定が printf() の第二引数以降の型を規定するとは考えにくいのです。
0686685
2012/08/03(金) 06:53:41.04×K&R2=C89 では可変長部分やプロトタイプの部分に限定される
○K&R2=C89 では可変長部分やプロトタイプの明示されない部分に限定される
0687デフォルトの名無しさん
2012/08/03(金) 07:17:19.710688デフォルトの名無しさん
2012/08/03(金) 07:26:00.770689デフォルトの名無しさん
2012/08/03(金) 08:28:15.320690デフォルトの名無しさん
2012/08/03(金) 08:31:35.420691デフォルトの名無しさん
2012/08/03(金) 08:36:36.280692デフォルトの名無しさん
2012/08/03(金) 08:38:08.300693デフォルトの名無しさん
2012/08/03(金) 08:40:40.74入門者なんだから
入門者だと思って太めに見てやれよ
たかが入門者だぞ
入門者に目くじら立ててどうする
入門者は入門者だと割り切って接するのが一番の方法だよ
0694デフォルトの名無しさん
2012/08/03(金) 08:45:27.000695デフォルトの名無しさん
2012/08/03(金) 09:58:20.70入門者が返答してるの?
0696デフォルトの名無しさん
2012/08/03(金) 10:02:13.47scanf使いこなせ と言ってるお方は
そういう部類のレヴェルだろ
察しろよ
0697デフォルトの名無しさん
2012/08/03(金) 10:05:54.26エラー処理が不要なら簡潔に書けるし
0698デフォルトの名無しさん
2012/08/03(金) 10:24:29.69http://quaternion.pineappledesign.org/c
0699デフォルトの名無しさん
2012/08/03(金) 12:07:05.32それはさて、引き数リストを明示していない関数宣言のことは、プロトタイプ宣言とは呼ばないんじゃないのか?
0700デフォルトの名無しさん
2012/08/03(金) 12:13:53.680701デフォルトの名無しさん
2012/08/03(金) 12:28:17.600702デフォルトの名無しさん
2012/08/03(金) 12:41:59.03printf("%f", 1.0F);
戻り値だけ宣言
int printf();
....
printf("%f", 1.0F);
引数も宣言してるけど、可変長引数でした
int printf(const char *, ...);
....
printf("%f", 1.0F);
0703はちみつ餃子 ◆8X2XSCHEME
2012/08/03(金) 12:47:10.35それもそうだな。 たぶん呼ばない。
>>701
いや、引数リストが無いのは可変長引数であることを意味しない。
0704デフォルトの名無しさん
2012/08/03(金) 12:50:30.35いい加減C++っぽく統一してほしい
0705デフォルトの名無しさん
2012/08/03(金) 12:53:57.560706デフォルトの名無しさん
2012/08/03(金) 12:54:16.15ん、「明示してない」ってのは「無い」っていう意味で言ってたの?
0707はちみつ餃子 ◆8X2XSCHEME
2012/08/03(金) 12:58:08.12俺が根拠にしてるのは JIS なんだが、そこでの記述はこうなってる。
> 呼び出される関数を表す式が、関数原型を含まない型をもつ場合、
> 各実引数に対して整数拡張を行い、型 float をもつ実引数は型 double に拡張する。
日本語でもかなりわかりにく表現だな。
... で終わる宣言がプロトタイプを含まない宣言なのであるとすれば、
void hoge(float a, ...);
という宣言に対して
hoge(1.23f, 1);
と呼び出した場合でもこの 1.23f は一旦 double に拡張されるってことにならないか?
それも変な話だと思う。
更に読み進めていくと
> 関数原型宣言子における省略記号標記は、
> 最後に宣言されている仮引数の直後から実引数の型変換を止める。
> 残りの実引数に対しては、規定の実引数拡張を行う。
とあるので printf に渡した第二引数以降は型変換しないということだでいいんじゃないかな。
0708デフォルトの名無しさん
2012/08/03(金) 13:55:03.44原因はオーバーフローなのか
どうなのか仕組みから説明しないと・・・
そこが肝要だと思うのです。
0709デフォルトの名無しさん
2012/08/03(金) 14:24:31.25ならない。aという引数はプロトタイプを持つのだから。
プロトタイプを持たないのは...の部分。
>とあるので printf に渡した第二引数以降は型変換しないということだでいいんじゃないかな。
多分理解がおかしい。一部の変換(配列→ポインタ、関数→ポインタ、LValue→RValue)もするし、拡張もする。
例えば、
char *p="ZZZ";
printf( "%p", p );
はchar*を(LValue→RValueはするけど)void*へは変換しないで積む。
これが "実引数の型変換を止める"と言うこと(というか、変換のしようがない)。
# ちなみに、これは鼻から悪魔が出るかもしれないコード。%pはvoid*を要求するから。
で、
printf( "%f", 4.2f );
は "規定の実引数拡張"が行われてdoubleな4.2がprintfに渡る。
0710はちみつ餃子 ◆8X2XSCHEME
2012/08/03(金) 14:45:28.91> ならない。aという引数はプロトタイプを持つのだから。
> プロトタイプを持たないのは...の部分。
俺もそう思うんだが、文章の曖昧さの話。
呼び出される関数が関数原型を含まない型をもつか否かで
挙動が分かれるようにも読める。
> 呼び出される関数を表す式が、関数原型を含まない型をもつ場合、
> 各実引数に対して整数拡張を行い、
> 型 float をもつ実引数は型 double に拡張する。
本当は
> 呼び出される関数を表す式が、関数原型を含まない型をもつ場合、
> (関数原型を含まない) 各実引数に対して整数拡張を行い、
> (関数原型を含まない) 型 float をもつ実引数は型 double に拡張する。
ってことでいいんかな。
0711デフォルトの名無しさん
2012/08/03(金) 14:58:07.680712はちみつ餃子 ◆8X2XSCHEME
2012/08/03(金) 15:11:29.41> 多分理解がおかしい。
> 一部の変換(配列→ポインタ、関数→ポインタ、LValue→RValue)もするし、拡張もする。
言葉が足りんかった。
元々の QZ 氏の主張を要約すると
「省略子を使った場合はプロトタイプが無いわけだから float → double への変換が行われる」
というものだったけど、それに対して「省略子で書いたことによっては変換は起こらない」という
ことを言いたかったもので、一般的な変換についてまで否定したわけじゃないよ。
0713デフォルトの名無しさん
2012/08/03(金) 15:43:07.15使わないような難しい漢字は何で輪郭がぼやけてるんでしょうか?
あれはどういうことですか?
C言語では最大何語の漢字をサポートしてますか?
0715デフォルトの名無しさん
2012/08/03(金) 16:34:13.32俺はひとりに決まってるだろ
0716デフォルトの名無しさん
2012/08/03(金) 16:50:08.880717デフォルトの名無しさん
2012/08/03(金) 16:58:35.10その質問のどこがCの質問?
それぞれGUI環境や文字コードの話だと思うのだが。
0718デフォルトの名無しさん
2012/08/03(金) 17:44:24.51でもC言語のchar a;
aが67でしょ?
対応してるじゃん。
a='2000'だと何かの漢字になったりしないの?
0719デフォルトの名無しさん
2012/08/03(金) 17:50:03.84アホ
0720デフォルトの名無しさん
2012/08/03(金) 17:53:08.180721デフォルトの名無しさん
2012/08/03(金) 17:56:17.69graph='F';
と
するとgraph=Fつまり文字を記憶する変数であり
C言語は数値だけでなく文字も記憶できるんですよね?
だから
graph='数';
みたいには出来ないのはなぜかなと。
0722デフォルトの名無しさん
2012/08/03(金) 17:57:21.45wchar_t があるだろ
0723デフォルトの名無しさん
2012/08/03(金) 17:58:47.570724デフォルトの名無しさん
2012/08/03(金) 18:04:09.600725デフォルトの名無しさん
2012/08/03(金) 18:05:59.67おまえがC言語とOSがわかっていないことは分かる
0726デフォルトの名無しさん
2012/08/03(金) 18:06:17.55stdio.h自体はC言語と関係ないもんなんですか?
0727デフォルトの名無しさん
2012/08/03(金) 18:12:03.97哲学的・形而上学的な観点から、
あなたは〈関係〉という概念を、どのように把握してらっしゃいますか?
0728デフォルトの名無しさん
2012/08/03(金) 18:12:14.150729デフォルトの名無しさん
2012/08/03(金) 18:17:43.74分からないプログラムは組めるけど機械的にやってるから
OSに命令を与えるための素材を集めてGUIによって可能にした系=C言語?
0730デフォルトの名無しさん
2012/08/03(金) 18:18:00.290731デフォルトの名無しさん
2012/08/03(金) 18:22:52.670732デフォルトの名無しさん
2012/08/03(金) 18:25:01.82気をつけましょうね プログラマのみなさん
0733デフォルトの名無しさん
2012/08/03(金) 18:25:29.37冗談抜きで、日本語の表現力を少しは身に着けたほうがいいぞ。
ついでに、パソコンの仕組みも。
0734デフォルトの名無しさん
2012/08/03(金) 18:32:48.390735デフォルトの名無しさん
2012/08/03(金) 18:36:56.000736デフォルトの名無しさん
2012/08/03(金) 18:37:22.180737デフォルトの名無しさん
2012/08/03(金) 18:40:06.08C言語以外の言語からも呼び出せますしー
0738デフォルトの名無しさん
2012/08/03(金) 18:43:12.26C使いにAPI関を連断られると厳しいものがあるなw
0739デフォルトの名無しさん
2012/08/03(金) 18:47:10.930740デフォルトの名無しさん
2012/08/03(金) 18:51:24.150741デフォルトの名無しさん
2012/08/03(金) 18:59:46.52プログラミング言語はどうやって作るのですか?
今はWindowsがあるから何でも可能ですが昔の低水準マシンにおいて
はどうやって作っていたのでしょうか?
0742デフォルトの名無しさん
2012/08/03(金) 19:00:17.680743デフォルトの名無しさん
2012/08/03(金) 19:05:44.90誰もがやりたくない事なんだ
0744デフォルトの名無しさん
2012/08/03(金) 19:07:02.780745デフォルトの名無しさん
2012/08/03(金) 19:09:12.81メタなCを喰って実行コードを吐くコンパイラをCで書いといて
アセンブラ化
それで出来あがったコンパイラを使って
複雑さを増したCで書かれたCコンパイラのソースをコンパイルして…
それで出来あがったコンパイラを使って…
ってな感じだったような
0746デフォルトの名無しさん
2012/08/03(金) 19:17:53.67プログラミング言語だよ
クソ機械語はプログラミング言語だよ
お前は情報科過程ひとおおり眺めてざっと理解してから質問しろ
時間の無駄だ
0747デフォルトの名無しさん
2012/08/03(金) 19:22:42.31初めからCやっときゃよかったわ。
構造が分からずに手を出すより、構造を知りながら覚える方がおもろいな。
0748デフォルトの名無しさん
2012/08/03(金) 19:34:24.440749デフォルトの名無しさん
2012/08/03(金) 19:36:29.660750デフォルトの名無しさん
2012/08/03(金) 19:36:33.60今でもトラウマあってPerlには手を出してない
0751デフォルトの名無しさん
2012/08/03(金) 20:09:42.58Windowsだと環境入れないとだめでしょ
0752デフォルトの名無しさん
2012/08/03(金) 20:10:06.83そうでもないね
0753デフォルトの名無しさん
2012/08/03(金) 20:16:19.57ハンドアセンブルしてた
実際、微細に渡る変換規則があれば
C言語もハンドアセンブルできる
というよりも
コンパイラの仕事は全て人力で、ノートと鉛筆ででもできる
でも 余りにも時間を喰うから *自動プログラミング* してる
0754デフォルトの名無しさん
2012/08/03(金) 20:21:42.23■ このスレッドは過去ログ倉庫に格納されています