C++セミナー(初級)データと型

HOME->講習会->プログラミングセミナー->C++セミナー(初級)


前回は,好きな文字を表示するプログラムを作成しました.決まったことを表示するだけであれば,わざわざプログラミングをさせる意味はありません.ここでは,データを変数と呼ばれるものに書き込んだり,読み込んだりする方法について紹介します.

目次

変数とは
変数の型
変数の出力(cstdio)
変数の出力(iostream)
定数

変数とは

「変数」とは,データを保持し続けるためのものです.よく例えられる例として,変数は物をいれる箱であるといわれます.


C++で変数を用意するには,以下のようにして行います.

変数型 変数名;

このように変数を用意することを宣言といいます.変数宣言は,C言語ではプログラムのはじめでしか宣言することができなかったですが,C++ではどの場所でも宣言することが可能となりました.

int value;

上記のもので言えば,整数型の変数valueを用意したことになります.また,変数名は好きな名前にすることができますが,アルファベッドの小文字,大文字とアンダーバー,数字(変数名の先頭には使えない)で記述する必要があります.以下は変数名のNGな例です.

int value!;  // !は使えないのでNG
int 0value;  // 先頭に数字は使えないのでNG

NGではない変数名にする以外にも,団体によって,変数名のつけ方にルールが場合があります(先頭の文字は小文字で始める,単語と単語のつながりの時は単語の1文字目を大文字にするなど).

それでは,変数にどのようにデータを入れるのかやってみましょう.

value = 15;

上記のように変数に「変数=データ」いれることができます.数学の「=」とは異なり,等しいではなく,代入の意味になります.また,変数は宣言と同時にデータを保持させることもできます.

int value = 15;

上記では,intと呼ばれる整数のデータを保持することができる変数を用意しましたが,C++では,保持するデータの形によって,適切な変数の種類を選択する必要があります.このように変数の扱えるデータの種類のことをといいます.

変数の型

C++では,整数型や浮動小数点数型など様々なものが標準で用意されています.

変数型扱えるデータサイズ範囲
char文字もしくは整数1 byte -128~127
shortワイド文字もしくは整数2 byte(CPU依存) -32,768~32,767
int整数4 byte(CPU依存) -2,147,483,648~2,147,483,647
long整数4 byte(CPU依存) -2,147,483,648~2,147,483,647
float単精度浮動小数点数4 byte 3.4E±38(7桁)
double倍精度浮動小数点数8 byte 1.7E±308 (15 桁)
boolブーリアン1 byte trueもしくはfalse
void型無し

上表の「int」と「long」は同じデータに見えるかもしれませんが,CPUによってサイズが変動します.C++の定義によれば,intはCPUのビット数に対応させ,shortはint以下のサイズ,longはint以上のサイズとされています.例えば,家電などに使われるマイコンでは,「int」が4 byteではなく,2 byteになることがあります.そのため,普段使用するCPUと異なるCPUを使用する際にはあらかじめ,サイズを調べておく必要があります.

また,整数を扱うことのできる型については,以下のようにして,符号なし整数型とすることも可能です.

数型扱えるデータサイズ範囲
unsigned char文字もしくは整数1 byte0~255
unsigned shortワイド文字もしくは整数2 byte0~65,535
unsigned int整数4 byte(CPU依存)0~4,294,967,295
unsigned long整数4 byte0~4,294,967,295

整数型の前に「unsigned」キーワードを付けることによって,符号なし整数型として扱うことができます.また,「unsigned」キーワードの代わりに,通常では省略する「signed」を付けると符号あり整数型と明記することができます.

char c;
signed char sc;    // 符号あり
unsigned char uc;  // 符号なし
short s;
signed short ss;   // 符号あり
unsigned short us; // 符号なし
int i;
signed int si;     // 符号あり
unsigned int ui;   // 符号なし
long l;
signed lond sl;    // 符号あり
unsigned long ul;  // 符号なし

変数の出力(cstdio)

変数に計算結果を保持させた後,表示しなければ,どのような結果が得られたのが知ることができません.C++セミナー(初級)出力処理で紹介した「std::printf」や「std::cout」を用いて表示をしてみます.

#include <cstdio>
int main()
{
    char c='a';
    int i=15;
    long l=100;
    float f=-12.0;
    double d=2.0;
    std::printf("%c, %d, %ld, %f, %lf\n", c, i, l, f, d);
}

上記はstd::printfを使用した変数の出力になります.「a, 15, 100, -12, 2」といったように表示されればOKです.std::printfでは,変数の出力する際には,「” “」の間に%dや%fなどフォーマット指定子を書き込むことによって,順番に後ろにカン区切りで打ち込んだ変数を出力することができます.上記のプログラムであれば,%cにcのデータ,%dにiのデータ,%ldにlのデータ,%fにfのデータ,%ldにdのデータを表示することになります.

フォーマット指定子を以下に示します.

指定子変数型動作
%cchar1文字表示
%schar *文字列を表示
%dint, short整数10進で表示
%uunsigned int, unsigned short符号なし整数10進で表示
%oint, short, unsigned int, unsigned short整数8進で表示
%xint, short, unsigned int, unsigned short整数16進で表示
%ffloat実数を表示
%efloat実数を指数で表示
%gfloat実数を最適形式で表示
%ldlong倍精度整数10進で表示
%luunsigned long符号なし倍精度整数10進で表示
%lolong, unsigned long倍精度整数8進で表示
%lxlong, unsigned long倍精度整数16進で表示
%lfdouble倍精度実数を表示

また,フォーマット指定子によっては,表示する桁数を制御することができる.例を以下に示します.

#include <cstdio>
int main()
{
    int value = 15;
    float pi = 3.14159265;
    std::printf("%06d, %.2f", value, pi); // 「000015, 3.14」と表示される.
}

%とアルファベッドの間に「06」と書いてありますが,「左側を0で埋めて6桁」にする制御になります.「.2」については,「小数点以下2桁まで表示」にする制御になります.

変数の出力(iostream)

次はstd::coutを用いて表示をしてみましょう.

#include <iostream>
int main()
{
    char c='a';
    int i=15;
    long l=100;
    float f=-12.0;
    double d=2.0;
    std::cout << c << ", " << i << ", " << l << ", " << f << ", " << d << ", " << std::endl;
}

std::printfの時と同じ出力が得られればOKです.std::coutを使用すると,フォーマット指定子を記述することなく,変数の中身を出力することができます.しかし,桁数が勝手に丸められたり,指数表示になったりとすることがあるため,以下のようにして,フォーマットを前もって設定することが必要となる場合があります.

#include <iostream>
#include <iomanip>
int main()
{ 
    double pi=3.1415926535897932384626433832795028841971;
    std::cout << pi << std::endl;         // 「3.14159」と出力される
  
    // 表示される桁数を変更する
    std::cout << std::fixed;              // 指数表記から固定小数点表記に変更
    std::cout << std::setprecision(15);   // 表示範囲を小数点以下15桁に変更(iomanipのincludeが必要)
    std::cout << pi << std::endl;
}

「std::cout << std::fixed」と記述することによって指数表示から固定小数点表記となり,「std::cout << std::setprecision(x)」と記述することによって,小数点以下x桁まで表示するというように指定することができます.

定数

場合によって,円周率などといったものについては,プログラマーが不意に書き換えができないようにしたい場合があったりします.そのようなときには,「const修飾子」もしくは「constexpr修飾子」を使用します.const修飾子は,変数を宣言するタイミングで保持したデータを定数として設定します.constexpr修飾子は,コンパイル時に決定することのできる定数として設定します.そのため,一般的にC++で定数を設定する際には,constexpr修飾子を使用します.以下に記述の例を示します.

const int WIDHT = 320;
constexpr double PI = 3.14159265;

変数型の前にconst修飾子もしくはconstexpr修飾子を付けることによって,プログラマーが不意にデータの書き換えができなくなります.また,定数は風習としてすべて大文字で記述することが多いです.