C言語講座 第2回

変数の型

今回は、C言語を使うのにどうしても必要な予備知識である変数の型について説明します。いきなりですが、ここで少しPythonを思い出してみましょう。まずPythonの変数は数字でも文字でも文字列でも何でも代入することができます。例えば以下のPythonのプログラムを入力して、hensu.pyという名前で保存しましょう。

#!/usr/bin/env python3.4

x = 2
y = 2.5

print(x * y)
y = ' x 2.5 = 5'
print(str(x) + y)

保存できたら、

$ python hensu.py

と入力して、このプログラムを実行してみましょう。どういう結果が得られたでしょうか?

5
2 x 2.5 = 5

となったはずです。6行目のprint文では、xとyの中身が掛け合わされたものが出力されます。次に7行目では、それまで数字を入れていたyに文字列の’ x 2.5 = 5’を代入しており、8行目でxとyをつない文字列が表示されます。このようにPythonの変数は、一度数値として使ったとしても、その後で文字を代入することもできます。

Pythonの話が少し長くなりましたが、今度はC言語において変数はどうなっているのでしょうか?C言語の変数は、見た目にはPythonとほとんど同じになります。また、Pythonにもint型やfloat型、str型などがありましたが、C言語の変数にも型という考え方があります。C言語における変数の型の指定は、変数が使われる前に必ず行う必要があり、これを変数の“宣言”と言います(実は前回でてきた#includeで指定するファイルは、変数や関数の宣言の集まりです)。一度変数を宣言してしまうと、後で型を変更することは基本的にはできません。さて、C言語でよく用いられる変数の型を挙げておきましょう。

  • 整数型 int
  • 文字型 char
  • 単精度浮動小数型 float
  • 倍精度浮動小数型 double

整数型(int型と表記します)は、整数を代入するための型です。文字型(char型)は、1バイト文字、つまり、アルファベットや数字、=や@などの記号を1文字代入するための型です。単精度浮動小数型(float型)も倍精度浮動小数型(double型)もどちらも小数を代入するための型ですが、double型はfloat型に対してより広い範囲の小数を代入することができます。

では、先ほどのPythonによるプログラムとほぼ同等の内容を、C言語で作ってみます。

#include <stdio.h>

int main()
{
  int x = 2;
  float y = 2.5;
  char a = '2';
  char b[] = " x 2.5 = 5";

  printf("%.0f\n", x * y);
  printf("%c%s\n", a, b);
  return 0;
}

hensu.cという名前で保存して、コンパイルしましょう。コンパイルのやり方は、

$ cc -o hensu hensu.c

です。コンパイルできたら

$ ./hensu

と入力して実行してみてください。Pythonで作ったプログラムと同じ結果が得られるはずです。

では内容を説明しましょう。1〜4行目までは、前回の内容と同じです。次に5行目から8行目でこのプログラムで使う変数の宣言と初期化をしています(普通、変数の宣言は、関数が始まってすぐの部分ででまとめて行います)。

5行目は、int型の変数xを宣言し、かつ、その変数に値を代入して変数を初期化しています。変数は宣言しただけでは、その中にどんな値が入っているかわからない状態ので、変数の中身を使う前に必ず初期化することを忘れないでください。

6行目も同様に、float型の変数yを宣言して2.5という値で初期化しています。

7行目では、char型の変数aを宣言し、“2”という文字で初期化しています。なお、char型変数に文字を代入する時は、’ ‘(シングルクォーテンション)で囲みます。Perlのように、””で囲むとコンパイルできないので、注意してください。

8行目については少し詳しく説明する必要があります。この行は、char型の配列bを宣言し、文字列“ x 2.5 = 5”で初期化するという意味です。C言語では、char型変数が文字を扱うための変数になりますが、扱えるのはあくまで1文字だけで、文字の並び(文字列)を1変数で扱うことはできません。文字列を扱うためには、char型の配列が必要です。C言語の配列は、“a[]”のように変数名[]の形をしています。普通、配列の宣言では[]の中に数字を入れて配列の大きさを指定する必要がありますが、8行目の場合、宣言と同時に初期化も行っているため、[]の中に配列の大きさを指定する必要はありません。ちなみにこの配列の場合は、“ x 2.5 = 5”の文字数(10)+1の大きさになります。これは、文字列の一番最後に’\0’という文字(\0で一文字分です)が自動的に代入されるためです。この’\0’は、文字列の終わりを意味する記号です。また、文字列により初期化を行う場合は、1文字のときに使った’ ‘ではなく、””で囲みます。

10行目と11行目は変数の中身を出力しています。printfは前回にも出てきましたが、今回は変数の中身の表示に使われています。””の中で指定されたフォーマットに従って、“,”以降に書く変数の中身を表示します。“,”以降には、演算も置くことができ、その場合は演算の結果を表示します。10行目の場合も変数xとyのかけ算の結果を出力するように指定しています。

printf()関数の””の中で変数の中身を表示するためには、以下のような記号を使います。

  • %c : char型変数(一文字)
  • %s : char型変数の文字列
  • %d : int型変数
  • %f : float型

%cを除いては、%と文字の間に数字を入れることで、その数字の分だけ表示する幅を指定できます。また、%fの場合、小数点以下の桁数も指定できます。例えば%10.3fであれば、10文字分の幅をとり、そのうち小数点以下3桁を表示するという意味になります。なお、10行目の様に%.0fにすると、小数点以下を表示しないという意味になります。

練習問題

  1. 自分の学籍番号、名前、メールアドレスが代入された変数を作成し、以下の順番で出力しなさい。なお、学籍番号が10桁、名前は25桁で出力すること。学籍番号 名前 メールアドレス
  2. 以下に示すような身長と体重を持つ人がいます。これらの値をもとにしてBMIを計算して出力するプログラムを作成しなさい。なおBMIは、身長をh(単位はm)、体重をw(単位はkg)とすると、w / (h*h) で計算されます。
    1. Aさん 身長 170 cm 体重 63 kg
    2. Bさん 身長 182 cm 体重 84 kg
    3. Cさん 身長 176 cm 体重 81 kg
  3. 第1回の練習3で表示した、自分の名前とそれに対応するアミノ酸残基の3文字表記が代入された変数を作り、第1回の練習3のように出力しなさい。