5/15(金)〜18(月) の学習ログです(主にC言語)
こんばんは。
いつもありがとうございます。
安藤です。
今日はこんな時間に更新です。
ここ数日は雨が続いていて少し肌寒いです。
外出の予定がなければ、雨はけっこう好きです。
音や匂い、雰囲気などが好きです。
ここには僕の個人的な学習ログをあげております。
2020.5.16(土)
◎C言語(ドットインストールより)
●演算子について
単項演算子
++ --
代入を伴う演算子
x += 5;
◎C言語(web記事「苦しんで覚えるC言語」)
●プログラムの部品化
作成したプログラムを再び使うことを再利用と呼び、関数として再利用することを部品化と呼ぶ。
部品をたくさん用意しておけば巨大なプログラムであっても、そ部品を組み合わせるだけで完成するので、効率的。
プロトタイプ宣言
予め先頭で関数の形を宣言しておくことで、いつでも宣言した関数は使えるようになる。
唯一、main関数だけはプロトタイプ宣言は不要。
●#includeの正体
これは、printf関数などのプロトタイプ宣言だった。
#include<stdio.h>を記述する理由はこのため。
関数は、
関数名();
このように記述すれば呼び出せる。
●引数
関数に数値を渡す
そのための仕組みが「引数」
引数は、関数に渡す情報の総称
引数は、関数の()の中に書いて指定する必要がある。
引数を使う場合、()の中には渡された数値を格納する変数を宣言しておく。
int sum (int max);
このように使用する変数を指定する部分を仮引数と呼ぶ。
仮引数とは、関数宣言に書かれた引数の型の名前のこと。
関数を変更した場合はプロトタイプ宣言も変更する必要があるけど、
プロトタイプ宣言では変数の型だけで良い。変数名は省略可能。
引数に指定した変数は、その関数の中では普通の変数と同じように使用できる。
●関数に数値を渡す
引数を持つ関数を呼び出す場合、数値を渡す必要がある。
それには、呼び出す時に、()の中に数値を書き込む。
関数に渡す数値のことを、「実引数」という。
引数付きの関数を呼び出す場合は、必ず数値を渡さなくちゃいけない。
●複数の引数
引数はたくさん持たせられる。
int sum (int min , int max)
複数の引数を使う場合は、それぞれを「,」カンマで区切って指定する。
型を混ぜても大丈夫。
複数の引数を持つ関数は、全ての引数に数値を渡さないと実行されないよ。
◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
1980年代、米AT&T社のベル研究所では、C言語にオブジェクト指向機能を追加した「C with Class」という言語を開発。この「C with Class」が後の「C++」になる。
Cとの互換性を強調したC++には、低レベルなことも記述できるというメリットと、低レベルなことも記述しないといけないデメリットが共存していた。
その点を改善するべく、1990年代に登場したのがJava。
Javaは、C++からCへの互換性を取り除き、その代わりにLispなどからより良い機能を取り込んで誕生した。1990年代に誕生した言語の中で最も成功した言語として世界中で使われている。
ソフトウェア開発の最大の敵は、「複雑さ」。
人間の脳は複雑なものを扱うことに弱い。記憶力と理解力に限界があるため。
年々性能が向上するコンピュータの処理能力の限界よりも人間の理解力の限界によるソフトウェア生産性の限界の方がより厳しい制約になってきている。
2020.5.18(月)
◎C言語(web記事「苦しんで覚えるC言語」)
●変数の寿命
関数内で寿命が尽きる変数
ローカル変数の寿命
関数の中で宣言された変数は、関数が終了すると捨てられてしまう。
再び同じ関数が呼び出されたら、もう一度変数を作り直す。
この時、前回とは別のメモリが使われるので、値も変わる。
つまり、関数の中で宣言された変数の寿命は関数の中だけであるということ。
このように、関数の中で寿命が終わる変数を「ローカル変数」と呼ぶ。
また、変数の寿命や有効範囲などをまとめて「スコープ」と呼ぶことがある。
●ローカル変数
関数の中で宣言された変数。
仮引数の変数も同様。
その関数が終わると捨てられ、再度関数が呼ばれた時には新しく作られる。
また、他の関数から使用することはできない。
●スコープ
識別子が有効な範囲を制限する仕組みの総称。
一般的には、変数の寿命と有効範囲を決定する仕組み。
●同じ名前でも別の変数
ローカル変数が有効なのは、宣言された関数の中のみ。
別の関数で同じ名前の変数が宣言されていても、それは別の変数となる。
●関数の独立性
関数を他のプログラムでも簡単に使えるようにするためには、各関数が独立している必要がある。
変数の値が突然変更されるというリスクから解放される。
特に大規模開発では必須。
※古典的言語には、この仕組みがない。
●正確にはブロック内
ローカル変数の寿命が{関数内というのは、正確には「ブロック内」ということ。
ブロックとは、{ }で囲まれている範囲のこと。
●グローバル変数
関数外で宣言された変数。
プログラム全体が終了するまで生き残り続け、宣言されたソースファイル内の全ての関数から使用できる。
グローバル変数は、プログラムの開始時に自動的に0に初期化される。
ローカル変数は、関数の呼び出しのたびに作られるので、その度に初期化していると、無駄ななるので自動的に初期化しない。
グローバル変数は最初に初期化すればいいので、それでです。
グローバル変数は、その関数からでも代入や値の取得ができるので便利な反面、どこで値が変更されるか分からない怖さがある。なので、グローバル変数はプログラム全体で共有する特別なデータのみみ使うこと。
※関数内にグローバル変数と同じ名前のローカル変数がある場合
エラーにはならず、ローカル変数を宣言することはできる。
グローバル変数と同名のローカル変数では、ローカル変数が優先される。
これは、関数の独立性を維持するための仕組み。
グローバル変数のスコープは、ファイル内。
基本的には、他のファイルでは使えない。参照できない。
しかし、他のファイルで、変数名と型を指定すると、使用できるようになる。
●関数内で生き残る変数
静的なローカル変数の寿命
ローカル変数とグローバル変数の中間的な存在である変数がある。
関数内で変数を宣言する時に、型名の前にstatic(スタティック)とつけることで、「静的なローカル変数」を宣言することができる。
関数内で宣言されているので、使用できるのは宣言された関数のみだけど、その値はプログラムが終了するまで残る。
また、初期化しなくても自動的に0に初期化される。
この変数は、関数が以前に呼び出された時の値を覚えておきたい場合に使用される。
◎読書「まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法」
オブジェクト指向プログラミングは、データによる複雑さへの対抗手段として登場した。
正しい結果を得るためには、処理とデータを常に一貫して保つ必要があり、そのために使われたテクニックが「抽象データ」。
抽象データとは、データと手続きをまとめたもの。
データとその取り扱い方法をまとめてブラックボックス化できる。
抽象データの利点は、
①変化に強いこと
②処理のイメージがつかみやすいこと
コードの抽象化により、イメージが具象化する。
このようなインテリジェントなデータを「オブジェクト」と呼ぶ。
これが「オブジェクト指向プログラミング」の由来になっている。
●プロトタイプ型とクラス型
抽象化の原則から言えば、同じものが数多く登場する場合にはグループ化してまとめてしまうべき。
このことを、DRY(Don’t Repeat Yourself)原則と呼ぶ。
重複を避けるために同種のオブジェクトをまとめる方法は大きく分けて2つ。
①プロトタイプ型
元になるオブジェクトのコピーを作ることで同種のオブジェクトを作りだす。
プロトタイプとは、ひな型のこと。
JavaScriptもプロトタイプ型。
②鋳型
これは、例えるなら、たい焼きの型とたい焼きの関係。
このたい焼きの型に相当するものをオブジェクト指向プログラミングでは、「クラス」と呼ぶ。
同じ種別のオブジェクトはそれぞれ同じクラスに属し、操作や性質を共有する。
プロトタイプ型と違って、クラス型オブジェクト指向言語は、ひな型となるクラスとひな型から作られたオブジェクトを明確に区別する。
たい焼きの型は、たい焼きではないことと同じように。
クラスと対比し、違いを際立たせるためにオブジェクトのことをしばしば「インスタンス」と呼ぶ。
今回はこれで以上です。
先のことは全く見えていませんが、歩を進めて景色を変えていきたいと思っています。
次回は5/22(金)に更新します。
ではまた!