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

C言語なら俺に聞け(入門編)Part 104

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/07/15(日) 10:28:33.18
C言語の入門者向け解説スレッドです。

★前スレ
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.18
printf("%f\n", 1);
printf("%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.68
意外と知られてないのが

j = 1, k = 3で

i = ++j, k;

とした時の i の値
実行せずに何になるか当ててみよう
0657デフォルトの名無しさん2012/08/02(木) 22:41:06.97
3
0658デフォルトの名無しさん2012/08/02(木) 22:42:27.89
2
0659デフォルトの名無しさん2012/08/02(木) 22:43:05.05
括弧でくくれバカ
0660デフォルトの名無しさん2012/08/02(木) 22:44:31.88
(i = ++j), (k);
0661デフォルトの名無しさん2012/08/02(木) 22:45:39.31
それ以前にこんな書き方をする意味がない。
0662デフォルトの名無しさん2012/08/02(木) 22:48:08.90
知ってる奴が知らない奴を見つけてニヤニヤする意味がある
0663デフォルトの名無しさん2012/08/02(木) 23:03:24.39
>>655
ttp://ideone.com/hxdVB
4番目でちょっと悩んじゃった
可変長引数は書式関係なくint(ex:4バイト)、double(ex:8バイト)、*(ex:4バイト)
でスタックに積むからゴミが残ってたんだよね
0664デフォルトの名無しさん2012/08/02(木) 23:09:00.69
ほんと仕様が煮詰められてない糞言語だな
0665デフォルトの名無しさん2012/08/02(木) 23:24:42.30
仕様が厳格に決まってないからこそ他言語との親和性が維持できることもあるんだよ。
0666デフォルトの名無しさん2012/08/02(木) 23:27:46.58
ないない
0667デフォルトの名無しさん2012/08/02(木) 23:36:19.28
>>656 を厳格に 2 と答えられないどあほとの親和性は維持できなくていい
ちなみに問題文に誤りがあってセミコロンが足りないが、そういう問題じゃない
0668はちみつ餃子 ◆8X2XSCHEME 2012/08/02(木) 23:43:57.23
>>654
うわ┗(^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.31
含 風呂・トイレ
0671デフォルトの名無しさん2012/08/02(木) 23:55:03.45
>>668
おまえさ、そんなの貼って誰かありがたがるとでも思っているわけ?
仮にいたとして、おまえと同類だけだぞ
0672はちみつ餃子 ◆8X2XSCHEME 2012/08/02(木) 23:58:37.97
>>669
銀英伝は二次創作をいくつかちょろっと読んだだけだが、
それは印象的な場面としてよく使われてるみたいだねぇ。
0673デフォルトの名無しさん2012/08/03(金) 00:01:03.25
難しい漢字がボヤけてるのは何故?
見たこと無い漢字とか明らかに輪郭がくっきりしてないんですが。
何十年も昔のPCからそうだったんですか?
0674デフォルトの名無しさん2012/08/03(金) 00:06:20.56
>>668
ずいぶんと参考になりました。私はビット表現まで追いかけてなかったがばれてしまった‥‥‥。それはそれで一層いや一生の恥です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.14
調子に乗って符号なし整数をなくしたJavaなんて言語もあったな
0676デフォルトの名無しさん2012/08/03(金) 00:09:09.64
アンチ
0677デフォルトの名無しさん2012/08/03(金) 00:10:45.73
インチ
0678デフォルトの名無しさん2012/08/03(金) 00:25:33.78
ウソッキー
0679デフォルトの名無しさん2012/08/03(金) 00:33:35.00
printfで2進数表示お願いします。
0680デフォルトの名無しさん2012/08/03(金) 00:44:42.57
http://ideone.com/37iII
0681はちみつ餃子 ◆8X2XSCHEME 2012/08/03(金) 00:59:57.45
>>674
前者は省略記号 (...) とは関係ないんじゃないかな。
「プロトタイプを含まない型を持つ関数」というのは例えば
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.96
>>680 感謝!
0683はちみつ餃子 ◆8X2XSCHEME 2012/08/03(金) 01:16:42.64
>>674
つまりはその項目は今回の printf の件とは無関係。
float は float として渡されるのであり、
受取った方がその型を知る方法は書式指定によると理解していいと思う。
0684デフォルトの名無しさん2012/08/03(金) 01:33:00.41
floatはdoubleとして渡るんじゃないかな〜
0685 ◆QZaw55cn4c 2012/08/03(金) 06:03:44.98
>>681
規格の後段について、よく理解できました。ありがとうございます。
規格の前段の記述が 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() の第二引数以降の型を規定するとは考えにくいのです。
06866852012/08/03(金) 06:53:41.04
訂正しておきます。
×K&R2=C89 では可変長部分やプロトタイプの部分に限定される
○K&R2=C89 では可変長部分やプロトタイプの明示されない部分に限定される
0687デフォルトの名無しさん2012/08/03(金) 07:17:19.71
gccなんかじゃ%fにintなら警告出してくれるけどな。
0688デフォルトの名無しさん2012/08/03(金) 07:26:00.77
printfが%fでscanfが%lfの理由
0689デフォルトの名無しさん2012/08/03(金) 08:28:15.32
何故このスレではscanfが人気なのか。
0690デフォルトの名無しさん2012/08/03(金) 08:31:35.42
入門だからでしょ
0691デフォルトの名無しさん2012/08/03(金) 08:36:36.28
scanfぐらい使いこなせるようになった方がいい
0692デフォルトの名無しさん2012/08/03(金) 08:38:08.30
↑アホ
0693デフォルトの名無しさん2012/08/03(金) 08:40:40.74
入門者なんだからしょうがない
入門者なんだから
入門者だと思って太めに見てやれよ
たかが入門者だぞ
入門者に目くじら立ててどうする
入門者は入門者だと割り切って接するのが一番の方法だよ
0694デフォルトの名無しさん2012/08/03(金) 08:45:27.00
入門者の入門者による入門者のためのスレ
0695デフォルトの名無しさん2012/08/03(金) 09:58:20.70
>694
入門者が返答してるの?
0696デフォルトの名無しさん2012/08/03(金) 10:02:13.47
少なくとも
scanf使いこなせ と言ってるお方は
そういう部類のレヴェルだろ
察しろよ
0697デフォルトの名無しさん2012/08/03(金) 10:05:54.26
scanfくらい使いこなせなくてどうするよ
エラー処理が不要なら簡潔に書けるし
0698デフォルトの名無しさん2012/08/03(金) 10:24:29.69
特殊なC言語入門
http://quaternion.pineappledesign.org/c
0699デフォルトの名無しさん2012/08/03(金) 12:07:05.32
scanf()はどうでもいいけど、sscanf()を一通り使えるようになっておくと捗るぞ。

それはさて、引き数リストを明示していない関数宣言のことは、プロトタイプ宣言とは呼ばないんじゃないのか?
0700デフォルトの名無しさん2012/08/03(金) 12:13:53.68
呼ぶんじゃないの?
0701デフォルトの名無しさん2012/08/03(金) 12:28:17.60
可変長引数である事を明示してるでしょ
0702デフォルトの名無しさん2012/08/03(金) 12:41:59.03
無宣言でいきなり利用
 printf("%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
>>699
それもそうだな。 たぶん呼ばない。

>>701
いや、引数リストが無いのは可変長引数であることを意味しない。
0704デフォルトの名無しさん2012/08/03(金) 12:50:30.35
プロトタイプなしとか、引数なしプロトタイプとか
いい加減C++っぽく統一してほしい
0705デフォルトの名無しさん2012/08/03(金) 12:53:57.56
ttp://ideone.com/I7Wir
0706デフォルトの名無しさん2012/08/03(金) 12:54:16.15
>>703
ん、「明示してない」ってのは「無い」っていう意味で言ってたの?
0707はちみつ餃子 ◆8X2XSCHEME 2012/08/03(金) 12:58:08.12
>>685
俺が根拠にしてるのは JIS なんだが、そこでの記述はこうなってる。

> 呼び出される関数を表す式が、関数原型を含まない型をもつ場合、
> 各実引数に対して整数拡張を行い、型 float をもつ実引数は型 double に拡張する。

日本語でもかなりわかりにく表現だな。

... で終わる宣言がプロトタイプを含まない宣言なのであるとすれば、

void hoge(float a, ...);

という宣言に対して

hoge(1.23f, 1);

と呼び出した場合でもこの 1.23f は一旦 double に拡張されるってことにならないか?
それも変な話だと思う。

更に読み進めていくと

> 関数原型宣言子における省略記号標記は、
> 最後に宣言されている仮引数の直後から実引数の型変換を止める。
> 残りの実引数に対しては、規定の実引数拡張を行う。

とあるので printf に渡した第二引数以降は型変換しないということだでいいんじゃないかな。

0708デフォルトの名無しさん2012/08/03(金) 13:55:03.44
>>702
原因はオーバーフローなのか
どうなのか仕組みから説明しないと・・・
そこが肝要だと思うのです。
0709デフォルトの名無しさん2012/08/03(金) 14:24:31.25
>と呼び出した場合でもこの 1.23f は一旦 double に拡張されるってことにならないか?
ならない。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
>>709
> ならない。aという引数はプロトタイプを持つのだから。
> プロトタイプを持たないのは...の部分。

俺もそう思うんだが、文章の曖昧さの話。
呼び出される関数が関数原型を含まない型をもつか否かで
挙動が分かれるようにも読める。

> 呼び出される関数を表す式が、関数原型を含まない型をもつ場合、
> 各実引数に対して整数拡張を行い、
> 型 float をもつ実引数は型 double に拡張する。

本当は

> 呼び出される関数を表す式が、関数原型を含まない型をもつ場合、
> (関数原型を含まない) 各実引数に対して整数拡張を行い、
> (関数原型を含まない) 型 float をもつ実引数は型 double に拡張する。

ってことでいいんかな。
0711デフォルトの名無しさん2012/08/03(金) 14:58:07.68
まぁそういうことだろうね。
0712はちみつ餃子 ◆8X2XSCHEME 2012/08/03(金) 15:11:29.41
>>709

> 多分理解がおかしい。
> 一部の変換(配列→ポインタ、関数→ポインタ、LValue→RValue)もするし、拡張もする。

言葉が足りんかった。

元々の QZ 氏の主張を要約すると
「省略子を使った場合はプロトタイプが無いわけだから float → double への変換が行われる」
というものだったけど、それに対して「省略子で書いたことによっては変換は起こらない」という
ことを言いたかったもので、一般的な変換についてまで否定したわけじゃないよ。
0713デフォルトの名無しさん2012/08/03(金) 15:43:07.15
昨日質問したんだけど

使わないような難しい漢字は何で輪郭がぼやけてるんでしょうか?
あれはどういうことですか?

C言語では最大何語の漢字をサポートしてますか?
0714デフォルトの名無しさん2012/08/03(金) 16:00:35.79
>>712
わざわざコテつけて言うようなことじゃないよ。
>>713
お前、何人?
0715デフォルトの名無しさん2012/08/03(金) 16:34:13.32
>>714
俺はひとりに決まってるだろ
0716デフォルトの名無しさん2012/08/03(金) 16:50:08.88
半人前のクセに
0717デフォルトの名無しさん2012/08/03(金) 16:58:35.10
>>713
その質問のどこがCの質問?
それぞれGUI環境や文字コードの話だと思うのだが。
0718デフォルトの名無しさん2012/08/03(金) 17:44:24.51
>>717
でもC言語のchar a;
aが67でしょ?
対応してるじゃん。
a='2000'だと何かの漢字になったりしないの?
0719デフォルトの名無しさん2012/08/03(金) 17:50:03.84
アンチって言ってるだろ
アホ
0720デフォルトの名無しさん2012/08/03(金) 17:53:08.18
ピーカーチューー!
0721デフォルトの名無しさん2012/08/03(金) 17:56:17.69
char graph;

graph='F';

と

するとgraph=Fつまり文字を記憶する変数であり
C言語は数値だけでなく文字も記憶できるんですよね?

だから

graph='数';

みたいには出来ないのはなぜかなと。
0722デフォルトの名無しさん2012/08/03(金) 17:57:21.45
>>721
wchar_t があるだろ
0723デフォルトの名無しさん2012/08/03(金) 17:58:47.57
だから文字コードを勉強して来いと。
0724デフォルトの名無しさん2012/08/03(金) 18:04:09.60
どこからどこまでがC言語の仕事でOSの仕事なのか分からない

0725デフォルトの名無しさん2012/08/03(金) 18:05:59.67
>>724
おまえがC言語とOSがわかっていないことは分かる
0726デフォルトの名無しさん2012/08/03(金) 18:06:17.55
#include<stdio.h>あるじゃないですか
stdio.h自体はC言語と関係ないもんなんですか?
0727デフォルトの名無しさん2012/08/03(金) 18:12:03.97
あなたのおっしゃる〈関係〉とは一体どういう意味を含むのですか?
哲学的・形而上学的な観点から、
あなたは〈関係〉という概念を、どのように把握してらっしゃいますか?
0728デフォルトの名無しさん2012/08/03(金) 18:12:14.15
うん
0729デフォルトの名無しさん2012/08/03(金) 18:17:43.74
>>725
分からないプログラムは組めるけど機械的にやってるから
OSに命令を与えるための素材を集めてGUIによって可能にした系=C言語?

0730デフォルトの名無しさん2012/08/03(金) 18:18:00.29
日本語では、どれだけの単語が扱えますか?
0731デフォルトの名無しさん2012/08/03(金) 18:22:52.67
山は死にますか?
0732デフォルトの名無しさん2012/08/03(金) 18:25:01.82
髪は死にますよ
気をつけましょうね プログラマのみなさん
0733デフォルトの名無しさん2012/08/03(金) 18:25:29.37
>>729
冗談抜きで、日本語の表現力を少しは身に着けたほうがいいぞ。
ついでに、パソコンの仕組みも。
0734デフォルトの名無しさん2012/08/03(金) 18:32:48.39
無知が背伸びするとしばしばこうなる
0735デフォルトの名無しさん2012/08/03(金) 18:36:56.00
どういう経緯でC言語をやろう(この言い方も変な感じだが)と思ったのかも気になるな
0736デフォルトの名無しさん2012/08/03(金) 18:37:22.18
APIやdllについて聞いたら殴られそうな勢いだなw
0737デフォルトの名無しさん2012/08/03(金) 18:40:06.08
>>736
C言語以外の言語からも呼び出せますしー
0738デフォルトの名無しさん2012/08/03(金) 18:43:12.26
骨の髄までしゃぶってるのがC使いだから・・
C使いにAPI関を連断られると厳しいものがあるなw
0739デフォルトの名無しさん2012/08/03(金) 18:47:10.93
日 本 語 で お k。
0740デフォルトの名無しさん2012/08/03(金) 18:51:24.15
ではC言語は何かと聞かれて答えられる学生はいるの
0741デフォルトの名無しさん2012/08/03(金) 18:59:46.52
OSに指示を出すための言語がプログラミング言語だと思うのですが
プログラミング言語はどうやって作るのですか?
今はWindowsがあるから何でも可能ですが昔の低水準マシンにおいて
はどうやって作っていたのでしょうか?


0742デフォルトの名無しさん2012/08/03(金) 19:00:17.68
哲学スレでやってください
0743デフォルトの名無しさん2012/08/03(金) 19:05:44.90
めんどくさそうな人間の相手は
誰もがやりたくない事なんだ
0744デフォルトの名無しさん2012/08/03(金) 19:07:02.78
うん
0745デフォルトの名無しさん2012/08/03(金) 19:09:12.81
古いgcc のソース追っかけたら?

メタなCを喰って実行コードを吐くコンパイラをCで書いといて
アセンブラ化
それで出来あがったコンパイラを使って
 複雑さを増したCで書かれたCコンパイラのソースをコンパイルして…
  それで出来あがったコンパイラを使って…

ってな感じだったような
0746デフォルトの名無しさん2012/08/03(金) 19:17:53.67
低水準でも言語だよ
プログラミング言語だよ
クソ機械語はプログラミング言語だよ

お前は情報科過程ひとおおり眺めてざっと理解してから質問しろ
時間の無駄だ
0747デフォルトの名無しさん2012/08/03(金) 19:22:42.31
むかしVBで挫折してて、今回C始めたらC面白いでやんの。
初めからCやっときゃよかったわ。

構造が分からずに手を出すより、構造を知りながら覚える方がおもろいな。
0748デフォルトの名無しさん2012/08/03(金) 19:34:24.44
おもろいね。
0749デフォルトの名無しさん2012/08/03(金) 19:36:29.66
そうでもない
0750デフォルトの名無しさん2012/08/03(金) 19:36:33.60
最初の頃やったPerlはわけわからんかった
今でもトラウマあってPerlには手を出してない
0751デフォルトの名無しさん2012/08/03(金) 20:09:42.58
UnixとかだとCコンパイラがなくてもC言語組めたの?
Windowsだと環境入れないとだめでしょ
0752デフォルトの名無しさん2012/08/03(金) 20:10:06.83
>>749
そうでもないね
0753デフォルトの名無しさん2012/08/03(金) 20:16:19.57
アセンブリから機械語に変換するときにはコンパイラは無い
ハンドアセンブルしてた

実際、微細に渡る変換規則があれば
C言語もハンドアセンブルできる

というよりも
コンパイラの仕事は全て人力で、ノートと鉛筆ででもできる
でも 余りにも時間を喰うから *自動プログラミング* してる
0754デフォルトの名無しさん2012/08/03(金) 20:21:42.23
昔の人は16進で命令覚えてたって言うしな
■ このスレッドは過去ログ倉庫に格納されています