1 :
デフォルトの名無しさん :
2005/08/05(金) 02:37:17 現状、C言語のお勉強スレはどれも教えてクレクレ廚の巣窟と成り果てているので、
このあたりで一つ、ちゃんと機能しそうなスレを立ててみたいと思います。
1.対象
初級者~中級者。
一通りCの入門本は読了し、ポインタとか構造体とかが
(なんとなくでいいので)分かっているレベルにまで到達している人。
2.形式
輪講という形をとってみようと思っています。つまり、
ある範囲の内容をその回の担当者がまとめて書き込む
→外野がその内容について突っ込み&質問
という流れでいきます。
3.参考書
とりあえず、定番と思われる二冊を挙げておきます。その他、必要に応じて適宜、話題にしていく予定です。
(1)プログラミング言語C ANSI規格準拠
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/ (2)独習C 第三版
http://www.amazon.co.jp/exec/obidos/ASIN/4798102962/ というわけで参加者を募ります。対象者についていろいろ書きましたが、基本はどんな方でもOKです。
「傍観だけ」「突っ込みだけ」という人もOK。初心者から上級者までドゾー。
一週間以内に輪講やってくれる方が5人以上集まったら続けます。
集まらないようなら自然消滅ということでw
みんなでC言語のお勉強しませんか?
2 :
1 :2005/08/05(金) 02:39:14
勉強する順番について書いておきます。上記の参考書の(1)をメインに進めていきます。 (1)の目次は次のようになっているので、大体これに従って進める予定です。 第1章 やさしい入門 第2章 データ型・演算子・式 第3章 制御の流れ 第4章 関数とプログラム構造 第5章 ポインタと配列 第6章 構造体 第7章 入出力 第8章 UNIXシステム・インタフェース その他、適宜内容を追加したり省略したりは担当者の自由ということで。 量的に一章分を一人でやるのはかなりきついと思うので、適当に区切ってやります。 具体的にどのぐらい進むかはちょっと今の段階では予測が付かないので、進めながら考えましょう。
3 :
1 :2005/08/05(金) 02:46:58
上記だけでは感じがつかめないと思うので、サンプルを置いておきます。 こんなふうに進めていくつもりです。 1.1 入門 ◆Hello World! 手始めにこんなプログラムを書いてみましょう。 ------------------------------------------------------------ #include<stdio.h> main(){ printf("Hello World!\n"); } ------------------------------------------------------------ これをコンパイルして実行すると次のような出力が得られます。 ------------------------------------------------------------ Hello World! $ _ ------------------------------------------------------------ 上記のプログラムについて解説します。 line 1 #include<stdio.h>は、「stdio.hという標準ライブラリを読み込め」という命令です。 「標準ライブラリ」の定義は後回し(7章あたり)にします。
4 :
1 :2005/08/05(金) 02:47:47
line 2-4 line 2-4はmain(){}という括弧によってくくられています。 これは、「{}内はmainという名前の関数で、この関数は()内に書いてある引数をとる」という意味です。 「引数」、「関数」の定義も後回しです。ここでは「これはおまじないでつけている文なんだな」程度の理解で十分でしょう。 line3 ・printf()は、「括弧内を出力せよ」という命令です。 ・""(二重括弧)は、「括弧内に入っているのは文字列だ」という意味です。 「文字列」の定義も後回し。ここでは「""内に入っている文字は特に指定がなければそのまま出力されるんだな」程度の理解で十分でしょう。 ・Hello World!\n Hello World!は文字列です。これはこのまま出力されています。一方、\nは出力には見当たりません。 これは、「\n」自体が「改行」という意味を持っているからです。このような文字を「エスケープ符号列」といいます。 ・;は、文の終わりを表します。
5 :
1 :2005/08/05(金) 02:52:03
概観はこんなところです。参加表明募集。 上記内容に関する質問もドゾー。 明日にまとめて回答ということで、僕はとりあえず寝ます
こんな夜中がんばるねぇ
輪姦?
>>1 さてお前は教える側に立つのか教わる側に立つのか?
質問もどぞーて言ってるから教える側だろう
それならば一安心だ。
>>3 のレベルを教えるような香具師を対象とするなら、
>これをコンパイルして実行すると次のような出力が得られます。
これはないだろう。
Unix端末の知識を要求するならそれを明らかにしておかないとね。
DOSプロンプトでやるならそれでもいいけどそれも解説が必要そう。
この辺りは判っていることを前提とするなら、HelloWorldからってのは的外れだ。
ついでに、間違いだらけなのはどうしてくれようか。
インクルードファイルはライブラリを読み込む指示じゃないのだし、
main()は値を返さないといけない。
戻り値の型を省略するのもアナクロだ。
12 :
1 :2005/08/05(金) 15:04:04
>>12 行く前に反省しておけ。
逝くなら止めないが。
14 :
1 :2005/08/05(金) 15:39:49
おっと、書いている間に突込みが入ったようなので先にそっちに返事しておきます
>>11 >
>>3 のレベルを教えるような香具師を対象とするなら、
「>>1に書いたレベル」でいいですか?
>一通りCの入門本は読了し、ポインタとか構造体とかが
>(なんとなくでいいので)分かっているレベルにまで到達している人。
と書いたんですけど、ちょっと曖昧だったかもしれません。
レベル的には「プログラムを書く→コンパイル」
の流れは「ブラックボックスとして」理解しているという感じです
つまり、DOS窓開いてgcc hogehoge.cとやれば、「何故かわかんないけど」コンパイルができる
あるいはUnixでやるならそれ相応の手段を「方法としては」分かっている
このぐらいのレベルを要求しています。
「コンパイル」というものそれ自体の理解は要求していませんし、
それを勉強するのはこのスレの範囲を超えます。
15 :
1 :2005/08/05(金) 15:41:33
>インクルードファイルはライブラリを読み込む指示じゃないのだし、
これは失礼しました。標準ライブラリについての情報を読み込む
ですね。このあたりはまだブラックボックスで進めるつもりだったので、適当に書いてしまいました。
正しくないことを書くのはいけない。反省。ただ、詳細はやはりもう少し後になってからやるつもりでして、
ここでその具体的な内容に拘泥するつもりはないです。
>main()は値を返さないといけない。
こっちは少しだけ反論。とりあえず
>>1 の文献(1)ではhello worldは戻り値は省略しています。
その後もしばらく省略で、「関数」のところでようやくreturnについて説明し、以後省略せずに書く、という流れです。
hello worldの段階でreturn 0;についての定義をするべきなのかは緒論あると思いますが、
少なくとも僕はこの段階では無視でいいと思いますし、ここは先述の文献に従おうと思いました。
特に間違った判断だったとは思ってないです。
レベルの指定がちょっとまずかったかもしれないですね。そこまで高度な知識を要求しているわけではないです。
感じとしては、大学ないし高校の授業なんかでとりあえずCを習って、
なんとなく課題で出されたプログラムを書くことはできるけど、
あんまり分かった気がしない・もうちょっと高いところまで行ってみたい
こういう人が集まって順番に講義していけばいい感じに進むんじゃないかなと、そういう考えでスレを立てました。
以上が
>>11 へのレスポンスです。ちょっとだけ休憩&突っ込み待ち。なければ昨日の続きいきます。
16 :
1 :2005/08/05(金) 16:05:15
なさそうなので進みますね 1.2 変数と算術式 熱力学などでよく出てくる単位に絶対温度があります。 これは絶対零度、つまり摂氏-273℃を0K(ケルビン)とする単位です。 これを摂氏に変換するプログラムを作ってみましょう。 ------------------------------------------------------------ #include<stdio.h> /* ケルビンから摂氏への変換 */ main(){ int celsius=0,kelvin=0; int lower=0,upper=500,step=30; kelvin=lower; while(kelvin<upper){ celsius=kelvin-273; printf("%d\t%d\n",kelvin,celsius); kelvin+=step; } } ------------------------------------------------------------
17 :
1 :2005/08/05(金) 16:06:23
出力は次のようになります。 ------------------------------------------------------------ 0 -273 30 -243 60 -213 90 -183 120 -153 150 -123 180 -93 210 -63 240 -33 270 -3 300 27 330 57 360 87 390 117 420 147 450 177 480 207 ------------------------------------------------------------
18 :
1 :2005/08/05(金) 16:07:17
では解説。 l1 #include<stdio.h> これは昨日も言ったようにここでは「おまじない」。 以後、標準ライブラリについては当面言及なしでいきます。 l3-13 main(){} これも前回と同様。以後しばらく無視します。 #つまり、しばらくの間は、プログラムってのは #include<stdio.h> main(){ ここに書かれてある内容だけを見てればいいんだな。 それ以外はおまじないでつけてるんだな。 } とでも思っていただければ結構です。 l2 /* ケルビンから摂氏への変換 */ 「/*」と「*/」で挟まれた文章は、「コメント」といいます。 この文章は、コンパイラによって無視されます。 つまり、コメントはプログラムとしては意味のない文章です。
19 :
1 :2005/08/05(金) 16:08:44
◇なんでこんなものがあるの? 長いプログラムを書いていると、どこにどんなことを書いたのか忘れてしまう というような事態がしょっちゅう起こります。 このようなことを防止するために、つまり後で読んでも何が書いてあるのか 理解できるようにするために、コメントというものがあるわけです。 コメントは、プログラムを複数人で扱うときにも有効です。 自分だけでプログラムを書くのなら自分だけわかってればいいのですが、 他の人もそのコードを読むとなれば、 その人はプログラムを全部自分で書いたわけではありませんから、 当然コードの詳細はよく分かっていません。 そこで、その人がコードを読む手がかりとなるコメントを残しておくわけですね。
おまじないとか勘弁 つか自分でWebスペース借りてやれよ
21 :
1 :2005/08/05(金) 16:11:14
l4-5 int celsius=0,kelvin=0; int lower=0,upper=500,step=30; 上記でcelsiusやkelvinやlowerなどと書いたものを「変数」と呼びます。 それらの左にあるintは、変数が整数であることを示しています。 このように、ある変数がどのような変数なのか定義することを「宣言」といいます。 整数以外の宣言も可能です。例えば変数が、 「文字」であることを示したい場合はintのかわりにcharを 「実数」であることを示したい場合はintのかわりにfloatを それぞれ用います。 celsius=0、upper=500など、「変数=数字」という形は「代入」をあらわします。 宣言の中でいきなり代入することも可能で、上でやっているのはそれです。 l7 kelvin=lower; 代入は宣言以外の部分でもできます。また、変数に変数を代入することもできます。 上記は、変数kelvinに、変数lowerに入っているものを代入する という意味です。
22 :
1 :2005/08/05(金) 16:24:19
l8-12 while(kelvin<upper){ } while(){ }は、「()の中身が正しい文である間、 {}の中身を繰り返し実行する」という意味です。 上記では、「kelvin<upper、つまり、kelvinに入っている整数が、 upperに入っている整数500よりも小さい間、{ }の中身を繰り返し実行する」 という意味になります。 l9 celsius=kelvin-273; 演算の結果を代入することも可能です。 上記は、「変数celsiusに、変数kelvinから273を引いたものを代入する」という意味です。 l10 printf("%d\t%d\n",kelvin,celsius); これは前回やりました。printf("");は、""の中に入っているものを出力する、という意味です。 ただし、今回は見慣れないものが入っています。 一つは「\t」。これは「tab」を意味します。 tabキーを押したときに現れるような空白を出力する、という意味です。
23 :
1 :2005/08/05(金) 16:30:12
l11 kelvin+=step; +=は、代入に似ていますが少し違った意味を持ちます。 これは、kelvinに入っている数字に、stepに入っている数字を足す という意味です。(つまりkelvin=kelvin+step;と同じ意味) こういうものを「代入演算子」といいます。 例 元の演算子:+ - * / 代入演算子:+= -= *= /= 以上です。全体の流れとしては、 1.kelvinにlower、つまり0を代入。 2.celsiusにkelvinを換算したものを代入。 3.kelvinとcelsiusの値を出力 4.kelvinにstep、つまり30を足す 5.2~4をkelvinがupper、つまり500よりも小さい間続ける 6.kelvinがupperを越えると、終了 となります。
24 :
1 :2005/08/05(金) 16:42:55
引き続き参加者&突っ込み募集中 この辺さっさと終わっちゃって本論に入った方がいいんですかね。 「おまじない」等そういう約束に嫌悪感を覚える人もいるようですし、 あんまり未定義の言葉をがんがん使うのも気が引けます。 というわけで、進め方に関する意見も募ります。よろしくおながいします。
だからここでやる必要はあるのか?っていいたいわけだが。
26 :
1 :2005/08/05(金) 17:40:11
>>25 あんまり需要ないかな。一つぐらいこういうスレがあってもいいと思うんだけども。
まあ、とりあえず誰も来なくても一週間は続けるつもりではあります。
なるほど、突っ込みを入れれば入れるほど>1の勉強になるはずなのだが >1がまともに人の意見を聞こうとしないからここでやる意味はないな。 しかし、よくもまぁ間違いだらけの説明を書けるもんだ。
少し真面目に書いてみる。 ・変数宣言 初心者向けならカンマで繋ぐ書式は理解しにくいから一変数一文の方がよい。 「変数が整数である」は説明になっていない。この文は、 「変数が整数型である」と「整数型とは……」の2段階で説明すべきことを端折ってしまっている。 ・定義を宣言 「定義することを「宣言」といいます」とするのは如何なものかと。 今後定義と宣言の違いを云々しなければならないのに、初っ端から混乱させてしまっている。 ・実数型にfloat これもわざわざfloatかなぁ。doubleを使わせるべきだと思うのだが。 ・変数に変数を代入 これも説明なしで理解できるのかなぁ。変数と中身(値)の関連がイメージできていないとなんのことやら。 その直後では「変数lowerに入っているもの」とわざわざ書いているしね。 ・()の中身が正しい文 なんのこっちゃ。 ・tabキーを押したときに現れるような空白 これもコンセンサスが得られる表現とは思えないなぁ。最早どうでもいいけど。 ・代入演算子 =は代入演算子ではないように取れるね。ないとは明言していないけど。 とまぁ、ざっと俯瞰してみたが、只の自慰にしかなっていないね。 対象が初級者なら、とっとと想定するレベル対象の説明を書いてみたらどうかね。
>>15 そこでベターCとしてのC++ですよ。
C++ではmain()にreturnを書かないとreturn 0;が書いてあるかのように振舞う仕様。
>>21 doubleが実数におけるintのような存在。今のパソコンでならfloatは後回しでいい。
(short/long/long longなんかの型の説明のときにでも)
30 :
1 :2005/08/05(金) 23:18:03
すみません、
>>22 と
>>23 の間が一つ分抜けていました。
------------------------------------------------------------
もう一つは「%d」です。「%d」は、""の後についている変数と1セットです。
%d\t%d\nと、「%d」が2回出ていますが、このうち最初の%dはkelvinと、
二回目の%dはcelsiusと対応します。
「%d」は、対応する変数の中身を整数10進数で出力する、という意味です。
#一般に、「%x」は、対応する変数の中身をxという指示に従って出力する、という意味です。例えば、
「%d」:対応する変数の中身を整数10進数で出力する
「%f」:対応する変数の中身を浮動小数点数で出力する
(「浮動小数点数」は、小数点つきの数字という理解で十分でしょう)
「%6d」:対応する変数の中身を「少なくとも6文字分の幅をとって」整数10進数で出力する。
「%6f」:対応する変数の中身を「少なくとも6文字分の幅をとって」浮動小数点数で出力する。
「%.2f」:対応する変数の中身を「小数点以下が2桁となるように」浮動小数点数で出力する。
「%6.2f」:対応する変数の中身を「小数点以下が2桁となるように、しかも少なくとも6文字分の幅をとって」浮動小数点数で出力する。
等々、いろんな指定ができます。
------------------------------------------------------------
手際が悪くて申し訳ないです。今からレスします。
%xは符号なし16進出力の意味があるからまずいだろ。 それに幅・精度指定はもっと後でもいいと思う。
32 :
1 :2005/08/05(金) 23:57:04
>>28 >変数宣言
例えば「プログラミング言語C」では一番最初に変数宣言を説明するところでもう
カンマつきの変数宣言を用いてるよね。
何度も書いてるけど、ここは高校の授業や大学の講義、会社の講習会なんかで
「なんとなく」Cは分かっている人を対象にしてます。言い換えると、
例えば
>>1 で挙げた「プログラミング言語C」を前から順番に読んでも
7割ぐらいは理解できる人を対象にしているということ。
こういう人を対象にぐだぐだと
int celsius;
int kelvin;
kelvin=0;
celsius=0;
などとやるのは冗長だと思うのだが。
>「変数が整数である」は説明になっていない
これが説明になってないのは百も承知で、これは「導入」だから。
このスレが存続するようなら、後ほど(第二章に入った辺りで)ちゃんとやる予定。
>定義を宣言
これはおかしい。スマソ。訂正します。
誤:このように、ある変数がどのような変数なのか定義することを「宣言」といいます。
正:C言語ではこのように、ある変数がどのような種類の変数なのかを
あらかじめ「指定」しておく必要があります。この手続きのことを、「宣言」といいます。
33 :
1 :2005/08/05(金) 23:57:59
>実数型にfloat doubleが一般的なのか。知りませんでした。勉強になります。 大学で「実数はfloat。それで精度が足りないときはdoubleを使え」と習ったので そのように覚えていました。スマソ。訂正しときます。 →変数が「実数」であることを示したい場合は一般的にはdoubleを用います。 >変数に変数を代入 言葉足らずだった。失礼。 誤:変数に変数を代入することもできます。 正:変数に「変数に入っているもの(値)」を代入することもできます。 >()の中身が正しい文 ()の中身が論理的に真となるような文という意味。文法として正しい文、という意味ではない。 「真」「偽」の定義を後回しにしたかったのでこのような表記にしてしまいました。スマソ。
34 :
1 :2005/08/05(金) 23:58:58
>tabキーを押したときに現れるような空白 分かりにくくてスマソ。 「\t」は前回書いたエスケープ符号列に属するもので、tab文字を表します。 これはスペースと同等の機能を持つ文字で、またスペース数文字分の見た目を持ちます。 (「数文字分」と表現が曖昧なのは、tab文字を出力するエディタやコンソールによって tab文字の見た目がスペース何文字分なのかが異なるからです) このようなtab文字を出力するということです。 >代入演算子 例えば、「プログラミング言語C」の61頁は次のようになっています。 --------------------引用-------------------- 次のような式 i = i + 2 では、左辺が右辺に再び現れる。これは次のような圧縮した形に書ける。 i += 2 この演算子+=を代入演算子という。 --------------------引用終わり-------------------- これも、=は代入演算子ではないように取れるよね。ないとは明言していないけど。
ここは
>>1 が突っ込みに対して反撃するスレなのか?
36 :
1 :2005/08/06(土) 00:09:14
>>29 >そこでベターCとしてのC++ですよ。
スマソ。意味がよくわかりません。
>C++ではmain()にreturnを書かないとreturn 0;が書いてあるかのように振舞う仕様。
Cはそうではない、という意味でしょうか。
>doubleが実数におけるintのような存在。
どうやら常識のようですね。スマソ、知りませんでした_| ̄|○
>>31 うは、ほんとだ。失礼しました。
「%文字指定」としておきます。
幅・精度指定は「プログラミング言語C」の一章で紹介だけやってたので、
ちょっとだけ触れてようと思って書きました。
もちろんあとでちゃんとやります。(スレが続きそうなら、ですが)
どうせ反論するなら、これにも反論して置け。 >とまぁ、ざっと俯瞰してみたが、只の自慰にしかなっていないね。 >対象が初級者なら、とっとと想定するレベル対象の説明を書いてみたらどうかね。 つーかなんだ、本の焼き直ししか書けないならわざわざ劣化コピーを作ることないと思うのだが。
仕様だと思っていたことが実は規格にマッチしていないということは多い。 Cは処理系による方言や、規格の変遷もあるからな。 他人に嘘を教えないためには、意外と労力が必要なんだよ。 ま、輪講ってのはそこから逃げるのにいい口実だが、本人がそれに気づ いていないようでは、ただイタイだけ。
>>35 突っ込みされないようにビクビクするスレです
40 :
1 :2005/08/06(土) 00:15:26
>>35 輪講スレにするつもりだったんですが_| ̄|○
僕がふがいないせいでえらい人の反感をいっぱい買ってしまいました。
すみませんすみません_| ̄|○
めげずに参加者募集します。この雰囲気で入ってくるのはかなり勇気が要りそうですが、
突撃してみてください。テキストの順番どおり行くなら、
次の内容はfor文、記号定数あたりの概説です。
人に物を教えるのは難しいし責任が生じるんだよ… 単発質問に回答するのとはわけが違う
>>34 +=なんかは複合代入演算子と言うのが一般的だと思う。
>>36 ベターCはC++の使い方の1つ。
オブジェクト指向以外にもC++は細かいところで改良が加えられている。(main()のreturn 0;もその1つ)
C++はCのつもりでも使え、さらに上のようなちょっとした改良でただのCよりも便利。
というわけで「ちょっと良くなったC」という意味でベターCという言葉がある。
ちなみにCではmain()でreturn 0;を書かないと通常の関数同様何が返されるかは未定義だか処理系依存だか。
C++のmain()は特別扱い。
結局ここは
>>1 の公開オナニースレなわけか
お前らも変質者をいつまでも相手にするなよ
cのテクストがどういう内容かは知らないが、次はif
ではない? forは()中が省略可能でも、3つあること。
コード上でif は簡単で強力な武器である。が理由。
教えるは思考の応用力と周辺の基礎理解が必要と思う。
>>1 は本一冊よんだレベルが丸わかり。本の写し。
読む気にならない書き方”も”問題だな。
>>1 「int」の表せる範囲が2の32乗でない状況とは
どういう場合か試しに答えてみて。
>>1 の話はCが分かってないと分からない
本の受け売りでCのダイジェストをやっても
本当の初心者には何も伝わらないし
>>1 の定番の二冊を読んだ方が早い
とりあえず分野を絞ってみては?
46 :
デフォルトの名無しさん :2005/08/06(土) 03:39:16
っていうか聞いていいですか JAVAが使えたらCも簡単に使いこなせるかな
無理です。Cを使いたければCを学んでください。
つーかこれくらいの劣化コピーならちまたに腐るほど溢れているのに 何故わざわざ同じことを、しかもここでやるのか必要性が全く感じら れないわけだ。 まー夏だから仕方ないのかもしれないがな…。
50 :
1 :2005/08/07(日) 02:05:49
昨日一日いろいろと考えたのですが、
主催者自身がろくにCを分かっていないまま
こうしたスレを立てるというのは、
やはり時期尚早だったようです。
輪講という形で複数人で勉強できる環境をつくれればよいなと
スレを立てる前には思っていたのですが、
実際には勉強する内容のレベルをうまく設定することができず、
また適切な参加者像を提示することができないまま、
ふらふらとここまできてしまいました。
最後に
>>44 の質問にだけ答えて、このスレは閉めることにします。
一週間続けると言い切った直後にこれで非常に申し訳ないです。
お騒がせしました。修行します。
51 :
1 :2005/08/07(日) 02:06:52
>>44 int型は、計算機の自然な整数サイズとされていますが、具体的にそれが
何ビットであるかは規定されていません。
従って、コンパイラを作成するにあたっては、それで使うハードウェアに合わせて
適当なサイズを選んでもよいことになっています(注1)。
つまり、int型の表せる範囲はコンパイラに依存します。これが一点目。
Cコンパイラがどのようなintサイズを採用しているかは
CPUによるところが大きくて、例えば、
16bitCPU 16bit
32bitCPU 32bit
となっている場合がほとんどです。これが二点目。
以上二点の根拠により、
答:32bitでないCPUのマシンを使っている多くの場合、intの表せる範囲は2の32乗でない。
(注1)若干の条件が付きます。「int型は少なくとも16bitで、short以上かつlong以下でなくてはならない」等。
>>1 では、最後まで責任をもって削除依頼してきて下さい。
数多くあるC言語スレの重複スレとして十分削除に応じてくれるでしょう。
最後くらいは潔く行動して下さい。
>>51 16bitでコンパイルした実行ファイルを32bitで実行した場合とか
その逆の場合とかは考えたことあるのか?
お前らなんでそんなに必死なの?
マ界の治安維持のため
56 :
44 :2005/08/07(日) 14:45:41
適当に答えてもらっただけだったが、その前向きな やる気は好感がもてると思った。なんだかんだで レスもそれなりに伸びてるしそのままがんばれ。
ROMだけのつもりだったんだが書いてみる。 当方1のあげた参考書は読んだことないけど気にせず行きます。 for文ってことだったけどif文をやれというレスに従ってif文~基本~を書いてみました。 突っ込みヨロ C言語では関数と呼ばれる部品を組み合わせて目的のプログラムを作ります。 前述のprintf()やwhile()もその関数の一つです。 今回はそんな関数の一つであるif()について勉強してみましょう。 if()は()の中身の値が 1であればif()に続いて書かれた命令を実行し、 0であれば実行せずにそのまま飛ばして次へ行きます。
/*例*/ /* 1*/#include<stdio.h> /* 2*/int main(void){ /* 3*/int a; /* 4*/if(1) printf("if(1)の場合\n"); /* 5*/if(0) printf("if(0)の場合\n"); /* 6*/ /* 7*/a = 1; /* 8*/if(a){ /* 9*/printf("aは1でした。0を入れなおします\n"); /*10*/a = 0; /*11*/} /*12*/printf("a=%d\n",a); /*13*/ /*14*/if(a){ /*15*/printf("これがでるとおかしい\n"); /*16*/} /*17*/ /*18*/return 0; /*19*/} /*終*/ 出力---------------- if(1)の場合 aは1でした。0を入れなおします a=0 --------------------
@解説@ l1-2おまじない。1と書き方ちょっと違うけどスルーでよろ l3int型の変数aを宣言します。 (整数型の大きさのデータの入れ物、名前はaを用意します) l4if()の()の中が1ですので続くprintf()は実行されます。 l5if()の()の中が0ですので続くprintf()は実行されません。 l6aに1を代入します。 (aという入れ物に1という値を入れます) l7今、aは1なのでif()に続く命令が実行されます。 if()の後にやらせたい命令が複数ある場合 この用に{}でくくっておけば、{}内の命令が全て実行されます。 l8-9printf()を実行して、さらにaに0を代入します。 l10aの値を表示します。 l12-14別に命令が1つでも{}を書きたければ書いてもOK l16-17プログラム終了のおまじない 次の課題は if()文~比較演算子を使ってみよう~ 誰か書いてね
見にくすぎるので58のプログラムソース書き直しますた;; /*例*/ /* 1*/ #include<stdio.h> /* 2*/ int main(void){ /* 3*/ int a; /* 4*/ if(1) printf("if(1)の場合\n"); /* 5*/ if(0) printf("if(0)の場合\n"); /* 6*/ /* 7*/ a = 1; /* 8*/ if(a){ /* 9*/ printf("aは1でした。0を入れなおします\n"); /*10*/ a = 0; /*11*/ } /*12*/ printf("a=%d\n",a); /*13*/ /*14*/ if(a){ /*15*/ printf("これがでるとおかしい\n"); /*16*/ } /*17*/ /*18*/ return 0; /*19*/ }
>>59 先生!l7の説明がわかりません!
ていうか、
if(a)
がなんで真になるかの説明が必要だと思われ
お前がやれよと言う突っ込みはスルーでw
つーか、出だしから間違いだな。 ifは関数ではない。 それと、ここだけの話ではないが必ずブロック化する癖をつけたほうがいい。 単文で横着するのは馴れてからで充分だ。
あとif (a)という横着するのも慣れてからで十分。 if (a == 1)にでもすべき。
64 :
59 :2005/08/09(火) 07:37:15
おはようございます
>>59 の解説の行数がずれてました。
l6~l9まで行数に1足して
それ以降は行数に2を足して読んでください。
>>61 if()の()の中にaを入れました。aの中には今、1が入っています。
if()では入れ物の名前ではなくて、その中身に注目して、次の命令を実行するかしないかを決めます。
そのためif(a)はif(1)といっていることになり、続く命令は実行されます。
ってきびしい説明ですね。。誰かスマートにかける人お願いします。
>>62 >>ifは関数でない
確かに関数とはちょっと気色が違いますね。勘違いでした。
制御文と書くのが正しいのかな??
>>ブロック化
了解。気をつけます。
お二方指摘ありがとうございました。参考になります。
このスレッド「C初心者が説明して皆で突っ込みをいれるスレ」とかのがうまく進むかもしれない
65 :
59 :2005/08/09(火) 07:44:10
>>63 ここは横着のつもりではなくて、比較演算子は次の解説で誰かにやって欲しかったのです。
今は「()内が1か0かでif文は判断している」ということを示したかったのです
次の段階として「a == 1」の値が0(偽)か1(真)かという話になるかなぁと・・・
初心者に真とか偽とか逆に難しいか・・・orz
>>63 そこは横着せんと(a != 0)にしとかんと。
つーか、1との比較はやっちゃいかん。
>>63 よかったらなぜ1と比較してはいけないか教えてください
68 :
67 :2005/08/09(火) 10:12:35
70 :
69 :2005/08/09(火) 10:39:18
うわ,俺もアンカー間違えた.
>>67 って書くつもりだったのに.
>>67 >69もそうだけど、実装上も0との比較よりもコストが掛かることが多いのが欠点。
c99ならbool型が導入されているけど、01以外の値にならない保証ってあったっけ?
int型への暗黙のcastができるとしたら、やっぱりtrueと比較しちゃいけないという結論になるんだけど。
>>66 だってその後のprintfで"aは1でした。"って表示するんだぜ。
するとaが2や3のときに"aは1でした。"と表示するのはバグ以外の何者でもないと思うのだが。
あー確かに。そもそも横着した>59が悪いw
なんか やっぱりここでやる意味を感じない 見づらいんだもん 内容は悪くないが(わけわかってない人が突っ込まれてるのって淫行っぽいよねw) 方法がよくない Wikiとかどっかに立ててやったら?
俺はてっきり誰かがそのうちまとめサイトでも作るもんだと思っていたが。
自分でWebsite作ってやってくれないかな 人に教えたりしたいなら責任をもってやれよ こんな所で嘘垂れ流ししないでくれ
>>77 いいじゃん
管理者も「うそをうそと見抜けないやつには・・・」って言ってるわけだし
ここは無能養成教室ですかそうですか。
間違って覚えてる馬鹿より、何も知らない馬鹿のほうが 新人としてはありがたい
プログラムなんて動けばいい
あおりあげ
83 :
59 :2005/08/09(火) 23:14:56
>>72 説明の量軽減を重視した結果この構造にしましたが、1でしたの表示は確かにまずかったですね。
>>73 >>65 に理由を書きましたがやはり横着でしょうか?
もしそれでも横着だと思うのでしたら仕方ありません。
比較演算子の説明を取り入れるべきでした。
>>74 確かに見づらい。しかし人が多いというメリットは学ぶ人にとっては重要かと。
面倒見るほうにははた迷惑な話かもしれないけど^^;
>>75 俺もそう思ってたけど違うのかな
>>1 さん?
>>80 是非とも間違った覚えかけてる馬鹿にちげーよ馬鹿と突っ込みをいれるスレとして。。
という意味で
>>64 の最後に書いたのです。まぁはた迷惑かな。気に障ったらごめん
ブーリアンと式と式の評価。 右辺値左辺値単項前置後置二項演算子。 について最初に教えないとダメだろ。
同じ趣旨って、スレの内容も進み方も全然ちげーじゃねーかw ここの空気でそこに乗り込んだら元々いた奴の邪魔になるだろうが。 つか、なんでそこまでガチガチにする必要があるんだよ? これより酷いクソスレなんて沢山あんだろ?w わざわざ進行してるスレの進行止める必要ねえよ。自治厨。
>>83 俺はifなどの条件式は0か非0かで判定していると言う話はずっと後回しでいいと思う。
とりあえず、比較・不等号演算子だけにする方が直感的だからわかりやすいと思う。
88 :
59 :2005/08/10(水) 09:48:19
>>88 では、来週もう1度同じテーマであなたが講義してね(燐光風に
90 :
59 :2005/08/11(木) 20:13:51
>>89 同じテーマを扱うには別の事柄を説明してからのほうがよさそうです
気が向いたらそっちを書きますかねぇ
てか1さんはどこへいってしまったのかな?もうこないのかしら??
>>90 いや、あなたのためにも先に進むよりもう1度整理したほうがいいと思うよ
輪講ってそういうもんだと思っていたが、ちがうのか?
違うか。リアル厨房にはわからんよ