前提
**筆者** 筆者は、文系卒新人SEです。所属会社が開発側ではなく発注側になるため、プログラマではなく上流を主に担当しています。学生時代はプログラミングのプの字も知らなかったため、下流工程を全く知らないまま上流工程をやる羽目になった、というケースです。学習状況
ExcelのVBAで簡単なツールを作った経験があります。
一般的なプログラミング言語を未履修のため、汎用性のあるプログラミング言語のいろはを学びたい、と考えています。
学習目的
「何か今すぐアプリを作れるようになる」ことよりも「プログラミングという概念の基礎を学ぶ」ことが主眼です。プログラミングにできることとできないことの境界線を把握したいです。「この作業はプログラマさんに依頼可能なのか?」を自力で判断できることが、直近の業務課題だからです。
Qiitaを書く理由は、アウトプットの練習です。
誰に向けて?
プログラミングがわからない! けれどプログラマさんに指示を出さなきゃいけない! という人に向けています。いるかどうか分かりませんが、私がそうなので。あとはプログラミングするよりも、プログラミングというものの基礎ロジックを知りたい、という奇特な趣味を持っている方にも向けています。私がそうなので。
やること
苦しんで覚えるC言語(通称、苦C)というサイトが初心者向け、かつ原理的な部分から詳しく説明してくれている、と聞いたので読みます。
復習用に、読んでいて役に立った内容をメモとして残します。
8進数と16進数の表記
社内の古いソフトで、こんな感じの命名を見たことがありまして、なんだろうなと不思議に思っていました。
先頭に0をつけた数は、8進数として扱われます。
例えば、0152、027、0756、030303 などは8進数です。
あとこれも。
意外に良く使われるのが16進数で、これは先頭に 0x をつけて表します。
例えば、0xFF、0xA7、0x912C、0xABCD などは16進数です。
10進数じゃないことを示す記号だったんですね。
浮動小数点方式
浮動小数点方式
実数値を、数値の並び(仮数部)と、小数点の位置(指数部)で表す方法。
仮数部に、10の何乗などの値を掛け算して実数を表現する。
巨大な数から極小の数まで扱え便利だが、計算は遅い。
名前だけ聞いたことがありました。整数の組み合わせで実数を表示できて便利、ということなんですね。
プロトタイプ宣言
これの話です。
#include
の正体
実は、今まで使用してきたprintf
関数などのプロトタイプ宣言は、毎回先頭に書いていた、stdio.h
ファイルの中に書かれていたのです。
これが、#include <stdio.h>
を書く最大の理由です。
デフォルトで使える関数、というものが一般化できたので、個人的にすごく腑に落ちた話なのですが、関数は基本的にすべて宣言をしなきゃいけなくて、それを#include<*>
でやっていた、ということなんですね。
「最初から使えるよ」という謳い文句は、初心者にはなにやってるのか分からなくて応用きかせられないから苦手なんですが、ひとつ説明が見つかってありがたかったです。
char型
引用は省略して、要点は次の2つです。- C言語では、STRING型(文字を格納できるデータ型)は存在しない。
- 半角1文字のみ格納できるCHAR型が存在するので、これを組み合わせて文字列処理を行う。
文字コードが決まっている(Aは68、Bは69など)ので、足し引きで処理できてしまう、というのが盲点でした。そりゃ文字を処理するにも数字に変換しなきゃいけないので、言われたらその通りなのですが、「AをBにする」という処理が「文字コードに1を足す」と読み替えられるんですね。
配列のメモリ割り当て
こういう原理的な話が知りたかったのでウキウキしながら読みました。
実は、ここに、配列のトリックの全てが暴かれています。
実は配列名は、配列の最初の要素のアドレスを表していたのです。
各要素を参照する時に、[0],[1] と言った要素番号をつけましたが、この意味は、配列名のアドレス+要素番号のメモリを参照するという意味になるのです。
配列、なにも特殊なことはしていないんですね。
それと、配列のサイズを決めるというのは割り当てメモリの範囲を指定しているのと同義であることも分かりました。なるほど。
ついでと言ってはなんですが、アドレスの話が先にあったので「ポインタ」という概念がスムーズに理解できました。C言語未履修なので難しいと言われてもよくわかっていないのですが、それはそれ。
値渡しと参照渡し
VBAでプロシージャの話をすると、必ず出てきて説明のなかった「値渡し(ByVal)」と「参照渡し(ByRef)」の説明がありました。 説明が分かりにくいんで、噛み砕いてみます。 前提として、変数には「1.データが保存されているアドレス」と「2.保存されている数値」の2つの情報があります。関数に引数を渡すときに、変数を渡したいとして、1.と2.のどっちを渡すか、という違いが、値渡しと参照渡しの違いです。 簡単にいうと、直接保存されている数値を渡すのが「値渡し」で、アドレスを引数で渡して、受け取った側の関数がそのアドレスを覗いて数値を取得するのが「参照渡し」というわけです。 たぶん。C言語には参照渡し機能はないとのことですが、ポインタを使うことで、理屈上は同じ処理が可能になっているということでした。C言語くらいしかポインタという概念が使われていない(表に出てこない)というのは、その他言語では、参照渡し機能が基本登載されているという意味というわけですね。