型と変数

型と変数

今回は変数について学んでいきます。変数については数学なんかで出てくるものとほとんど変わらないです。ただプログラミングにおける変数というのは色々なものを入れることができるので、『本当は整数を使って計算したかったのに小数を渡しちゃった』みたいに意図しない処理をしかねません。それを防止する意味で型というものが必要になってきます。詳しくは記事の中で見ていきましょう。

前回の復習

前回の記事では、文とトークン、インデント、ブロックなどのプログラミングに関連した用語や作法について学びました。それに加えて出力方法としてprintf関数について勉強しましたね。printf関数について忘れてしまった人は練習問題の解答例を見て思い出すか、前の記事に戻ってざっと復習してみて下さい。

前回の練習問題の解答例

A問題

以下のソースコードを変更して、”おやすみ”という文字列を出力してください。

#include <stdio.h>

int main() {
  printf("おはよう\n");
  return 0;
}

解答例

#include <stdio.h>

int main() {
  printf("おやすみ\n");
  return 0;
}

4行目のprintf関数の部分を変更しました。printf関数を使って文字列を出力する際には、ダブルクォーテーションで囲む必要がありましたね。今回は”おはよう\n”の部分を”おやすみ\n”に変えることで期待通りの出力を得ることができます。

B問題

実行結果が以下の出力になるようにソースコードを書いてください。

**********
*good job*
**********

解答例

#include <stdio.h>

int main() {
  printf("**********\n");
  printf("*good job*\n");
  printf("**********\n");
  return 0;
}

printf関数を3回使って書いていますが、以下のソースコードのように文字列中において改行をしたいところに”\n”を入れて書くことで、printf関数1回だけでも同様の出力ができます。

#include <stdio.h>

int main() {
  printf("**********\n*good job*\n**********\n");
  return 0;
}

型と変数

それでは今回の本題である変数と型についての勉強に入っていきましょう。
変数というのはなんでも入る箱のことです。なんでも入っちゃうと変数の中身が文字なのに、『掛け算をしちゃった』なんてことになりかねないので、変数の中身を指定してあげる『型』という概念が存在します。

変数に入るもの(すなわち中身の部分)には色々な種類があります。整数や小数だけでなく、文字を入れることもできます。それぞれに対応した型があるので頻出のものは覚えちゃいましょう。以下の表の中で頻出するのは、void型, char型, int型, float型, double型です。ほとんど全部ですね。圧倒的に出てこないのはshort型です。競技プログラミングに参加する方はlong型やlong long型を自分で調べておくと良いでしょう。

型名 データ型 備考
void 何もないことを表している型
char 文字型 内部では文字を数字として扱っている。扱える範囲は-128 ~ 127
int 整数型 扱える範囲は-2147483648 ~ 2147483647(一部例外あり)
short 整数型 扱える範囲は-32768 ~ 32767
long 整数型 扱える範囲は-2147483648 ~ 2147483647
float 浮動小数点型 扱える範囲の絶対値は3.402823e38 ~ 1.175494e-38
double 浮動小数点型 扱える範囲の絶対値は1.797693e308 ~ 2.225074e-308

他にも扱う値の符号の有無でデータ型の前に”signed”とか”unsigned”をつけることがありますが、ぶっちゃけそこまで使うことは少ないので説明は省略します。

変数の作り方は、以下のように『型名 変数名;』のようにして作ります。

double tax;

変数名の部分は予約語に被っていない限りは好きなようにつけることができます。予約語というのは、プログラムの文法として既に特殊な意味合いを持っているもので、先ほど紹介した、intやcharなどもそのひとつです。具体的な例をあげるならば、『intという名前の変数を作ることはできないよ』ということです。

実際のプログラムで変数を作ってみましょう。

#include <stdio.h>

int main() {
  int number;
  return 0;
}

実行結果

上記のコードでは4行目で”number”という名前の変数を作っています。この変数を作ることを『宣言する(単に宣言とも言う)』といいます。この辺りの言葉は押さえておかないとコミュニケーションを取る際に致命的になるので覚えておいて下さい。

変数とは値を格納できる箱のことを指す。中身として、文字や整数、小数なんかを入れることが可能。

とは変数の中に入れることができるものを制限する役割があり、変数を作る際には型とセットで書かないとコンパイルエラーになる。また、型と変数名を書いて変数を作ることを『宣言する』という。変数の宣言をする際には、変数名に予約語を使わないように注意する必要がある。

#include <stdio.h>

int main() {
  char favoriteChar;
  return 0;
}

column

変数の名前の付け方は、個人の自由ですが読みやすいコードを書く上で分かりやすい名前をつけることは大事です。例えば、私が『miyamoto』とか『suzuki』みたいな変数名を使ってコードを書いてもプログラムに誤りがない限りは正常に動作します。しかし後から入ってきた後輩がこのコードを読んだらどうでしょう。何をしている変数なのか分かりにくいと思います。

そういう観点で変数名にはある程度わかりやすいものをつけるように心がけていきましょう。ちなみに変数名には英数字と一部の記号からなる文字列で最初が数字以外というルールがあります。

変数名がどうしてもわかりづらくなる場合は2単語や3単語を使ってでもわかりやすいものにしましょう。この場合は、『perfectHuman』や『perfect_human』のように単語の塊がわかる変数名の書き方で書くのが一般的なのでそれにならっておくのが無難ですね。

代入と変数の値を出力

変数を作ったら当然使いたいですよね。ここでは『変数の中に値を入れる方法』と、『変数の中にどんな値が入っているのかをprintf関数を使って確かめる方法』について学んでいきます。

まずは『変数に値を入れる方法』についてです。

変数に値を入れるには以下のように『変数名 = 値;』と書きます。

double tax;
tax = 1.1;

このように変数に値を入れることを『代入』と呼びます。変数に値を代入するときに注意して欲しいことは、変数を先に作ってから代入をするということですね。そうしないとコンパイラがmain関数の中を上から下に向かって機械語に翻訳している最中に『いきなり知らないものが出てきた!翻訳できない!』とかいってコンパイルエラーを出します。実際に試してみるとコンパイルエラーが出てくるので確認しておくと良いかもしれません。

文字型(char)を代入するときには値をシングルクォーテーション(‘)で囲むようにして下さい。この記事の下のほうに出てくるサンプルコードに具体例を載せてあるのでそっちで確認しておいてもらえれば大丈夫です。

また、宣言と代入を同時に行うこともできます。これを『初期化』といい、初期化を行う際には以下のように『型名 変数名 = 値;』と書きます。

double tax = 1.1;

宣言してから代入をした場合との対比がわかりやすいようにdouble型の変数taxについて初期化を行いました。初期化で書けるときは極力初期化の形で書くようにした方が文法間違いのエラーを減らせるので、初期化で書くことをお勧めします。

ここまでの内容を一度整理するためにサンプルコードを書いて頭を整理しておきましょう。

#include <stdio.h>

int main() {
  int number; //宣言している
  number = 12; //代入している
  char laugh = 'w'; //初期化(宣言と代入を同時に)している
  return 0;
}

実行結果

ちなみに、変数の代入や初期化で”=”の左側に書かれている変数のことをリテラルと呼ぶ人がいますが間違いです。リテラルという言葉は『値そのもの』を指すので、皆さんは間違えて覚えないように注意してくださいね。

代入とは宣言をして作っておいた変数に値を入れることを指す。宣言と代入はまとめて1行で行うことが可能で、これを初期化という。ちなみに『=』は代入に使うので代入演算子と呼ばれたりもする。

次に『変数の中にどんな値が入っているのかをprintf関数を使って確かめる方法』を学んでいきます。

こちらに関してはフォーマット指定子と呼ばれるものさえ覚えてもらえればすぐに理解できるので、先にフォーマット指定子について説明をしておきます。

フォーマット指定子というのは、フォーマットを指定する機能をもつ特殊な文字のことで、『パーセント記号(%)』を用いて書きます。

言葉だけだとイメージがつきにくいと思うので、下のサンプルコードを実行してみて下さい。

#include <stdio.h>

int main() {
  int age = 18;
  printf("岩ちょこは、永遠の%d歳です\n", age);
  return 0;
}

実行結果

岩ちょこは、永遠の18歳です

ソースコードの5行目に注目してください。printfの文字列の中に”%d”と書かれた奇妙な部分があるのがわかると思います。この”%d”というのがフォーマット指定子と呼ばれるもので、これを使うことで変数の中身を出力することができます。

またprintf関数の括弧の中にカンマ(,)と変数名が追加されているのがさっきのサンプルコードで見てもらえるとわかると思います。これはフォーマット指定子を用いて変数の中身を出力する際に、どの変数の中身を出力するかを指定しているためです。そのため複数個のフォーマット指定子を用いた場合はその分だけカンマでくぎりながら変数を指定してあげる必要があります。

フォーマット指定子には型に対応したものが定められているので、それぞれの型に対応したフォーマット指定子を覚えてくださいね。(しばらくは”%d”と”%lf”がほとんどなので、最低限その2つだけでも覚えてもらって後で復習する形でも大丈夫です)

ここでは出力フォーマット指定子の一部のみを書いておきます。(配列を勉強した後じゃないとわからない物は表から省いて書いてあるのでこれが全てではないことを理解した上でご覧下さい)

フォーマット指定子 変数の型 説明や備考
%c char型 char型の変数に入っている文字を出力します
%d int型, short型 int型やshort型の変数に入っている整数を出力します
%ld long型 long型の変数に入っている整数を出力します
%f float型 float型の変数に入っている小数を出力します
%lf double型 double型の変数に入っている小数を出力します

表にまとめるとこんな感じになります。フォーマット指定子に関しても使って覚える方が断然早く習得できるので沢山試してみて下さい。サンプルコードをもう一つ載せておくので、コードを好きに改変してコンパイルしてみて下さい。

#include <stdio.h>

int main() {
  /*char型の変数の場合*/
  char weather = 'S';
  printf("今日の天気は%c\n", weather);

  /*short型の変数の場合*/
  short wind = 3;
  printf("風力%d\n", wind);

  /*int型の変数の場合*/
  int pressure = 1013;
  printf("気圧は%dhPa\n", pressure);

  /*long型の変数の場合*/
  long day = 8282;
  printf("今日は岩ちょこが生まれてから%ld日目\n", day);

  /*float型の変数の場合*/
  float temperature = 10.5;
  printf("気温は%f度\n", temperature);

  /*double型の変数の場合*/
  double humidity = 68.5;
  printf("湿度は%lfパーセント\n", humidity);
  return 0;
}

実行結果

今日の天気はS
風力3
気圧は1013hPa
今日は岩ちょこが生まれてから8282日目
気温は10.500000度
湿度は68.500000パーセント

printf関数を用いて変数の中身を出力する際には、フォーマット指定子を使用する必要がある。フォーマット指定子とは『%』を用いた特殊な意味を持つ物のことである。(出力フォーマット指定子と呼ぶ場合は入力フォーマット指定子と区別した呼び方で、詳しくは第8回の記事で入力を勉強するのでそのときに違いを述べる)

まとめ

今回の記事では型と変数について学んでいきました。要点をざっくりとおさらいしましょう。

  • 変数というのは値を入れる箱のことで、型とセットで宣言をすることで作成できる。
  • 宣言しただけでは変数は役に立たないので値を代入してあげる必要がある。
  • 宣言と代入を同時に行うことを初期化と言い、初期値が決まっている時はなるべく初期化の形で記述するとコンパイルエラーを生みにくい。
  • printf関数を用いて変数の中身を出力する際にはフォーマット指定子を用いる必要がある。
  • フォーマット指定子にはそれぞれの型に対応したものがあるので、出力したい変数の型にあったフォーマット指定子を用いる必要がある。

ここまでを押さえられていれば大丈夫でしょう!十分に理解できています。
次回は演算子について勉強していく予定です。今回勉強した変数と組み合わせることで変数の便利さが実感できるはずです。お楽しみに!

練習問題でたくさんコードを書いて変数の使い方に慣れておきましょう。

練習問題

A問題

次のソースコードをコンパイルするとエラーが発生します。コードを修正して以下の出力結果が得られるように修正して下さい。

#include <stdio.h>

int main() {
  int dimension = 2;
  printf("こちら%s次元行きの電車になります\n", dimension);
  return 0;
}

出力結果

こちら2次元行きの電車になります

B問題

実行結果が以下の出力になるようにソースコードを書いてください。ただし、数値の部分はフォーマット指定子を使用して下さいね。(^^)

わたしの戦闘力は53万です

printf関数【C言語講座#3】

演算子【C言語講座#5】


最後まで記事を見ていただきありがとうございます。また別の記事でお会いできることを祈っております。

Print Friendly, PDF & Email

C言語カテゴリの最新記事