Cの変数と関数
Cの基礎である変数と関数について勉強しよう。
そもそもC言語とは
- C言語は構造化プログラミング(流れ図とかで表せる)、手続き型プログラミング(関数、メゾット、サブルーチンを使える)の要素を含んだ言語です。
- 実行速度がコンパイラの力によってほかのプログラミングよりも高速であることが利点。
- しかしコンピュータに理解しやすい言語ということは、人間には若干理解しにくい構文が存在するということです。
- 2024年度現在、わが校の情報技術基礎の授業ではCが主体となって授業がされている。
- C言語が開発されたのは1972年ごろで、プログラミング言語としての開発時期は古いほうに分類される。
- C言語はもともと研究所の独自言語として使われていたので最初に学ぶ言語として有名になったのは1990年ごろと割と最近。
- オブジェクト指向の普及からアプリケーションソフトウェアでは使われなくなり、C言語の特徴である速度や省メモリが要求されるシステムプログラミングにおいてもC言語ではなくRustが使われるようになるるなど、最近では利用頻度が落ちてきた。かなしい。
Cの変数
変数とは
変数とは、数学における「x」や「y」のように、数字を代入することができる入れ物。 C言語に限らず、ほとんどのプログラミング言語ではこの変数に数字だけではなく文字などをぶちこんで、プログラムに活用することができます
C言語は静的型付け言語
C言語は静的型付けによって変数を宣言します。 変数には整数をしまえる整数型、実数をしまえる実数型、文字をしまえる文字型があります。 この「型」と変数の「変数名」を一緒に宣言することで初めて変数として使えるようになる言語を静的型付け言語と呼ばれます。
また型の宣言がない変数はC言語の力によってint型とみなして実行される。
変数宣言時には変数の中身が初期化されないので、宣言した後に適当に初期値を入れておくと わけわからんエラーが起きないので幸せになれます。
int型 - 整数型
整数のみ入れられます。 整数型は保存できる限界の数字によっていくつか種類があります。
- int型
32bit、つまり2^31 ~ 2^31-1の範囲内の数字を入れることができます
- long型
64bit、つまり-2^63 ~ 2^63-1の範囲内の数字を入れることができません ROBOTCでは使用できません。
また、割り算では計算結果が必ず絶対確実に計算結果が整数にならないので、int/intにすると予想外の値が出力されることがままある。 int/floatにすることで、計算結果をfloat型にすることができる。
まず普通に使っているときにint型で保存できない値が出ることはよほどない。むしろ、long型のように64bit確保する変数をたくさん使うと今度はメモリが足りなくて動かなくなる可能性があるという恐怖におびえることになる。
float型 - 実数型
実数を保存することができる型。
- float型
32bitで表現できる範囲内の実数を保存できる。
- double型
63bitで表現できる実数を保存できる。ROBOTCでは使用不可。
実数の中に整数も入っているので整数も普通に保存できる。 表現できる数字の範囲的に、double型のほうがより高精度な小数を保存 できる。
配列
配列とは、複数の変数を連続的に接続したものである。
- 変数の型 配列名[要素数]で宣言する。
- 配列名[要素番号]で参照できる
ちなみに要素は0から確保されるので要素番号と要素数を混同することのなきよう
例えば10こ要素を確保した場合、0~9のスペースを確保する。
サンプルコード
#include <stdio.h>
int main(void)
{
// int型の配列dataで保存できる要素は10、すべての要素に0を初期値として代入
int data[10]={0};
// 最後の要素に10を代入
data[9]=10;
printf("v:%d\n",data[9]);
return 0;
}
出力結果は
v:10
定数
定数とは、変更できない値のことです。例えば円周率をPIと定めて3.14として計算してほしい場合などで使われます。
サンプルコード
// includeと同じ段階で宣言するときは# define
# define WIDTH 10.5
// プログラム中で宣言するときはconst <文字型> <変数名>
const float HEIGHT = 10.5;
関数
C言語は命令を関数で呼び出す。たとえばprintf("%d\n",a);のように、printf関数にaという変数を渡して、"%d\n"で表示することができるが、これは最初に #include <stdio.h> と宣言するヘッダファイル内に、printf関数が宣言されているからなのです。
これと同じように、我々も関数を定義できます。 ロボットでは値の取得、計算、特定の動作などを関数として定義しておき、ほかの関数で使うことができます。
戻り値
呼び出したい関数が呼び出す関数に、値を渡して処理してもらうことができます。
サンプルコード
#include <stdio.h>
// 関数の定義
int add(int a, int b);
int main() {
int x = 5;
int y = 3;
int result;
// add関数を呼び出し
// add関数にxとyの値を渡して
// add関数が計算した値(戻り値)をresltに代入する
result = add(x, y);
return 0;
}
// <戻り値の型> 関数名(<引数の型> 引数の名前)
// 引数の関数名は呼び出し元と違ってても動くよ
int add(int a, int b) {
return a + b;
}