C++ の変数と型

C++Beginner

はじめに

この実験では、C++ の変数と型について学びます。変数を定義する方法と、さまざまな型の変数を使用する方法を学びます。

コンテンツのプレビュー

コンピュータプログラムはデータを操作(または処理)します。「変数」は、処理のために「データの一部を格納」するために使用されます。格納されている値を変更できるため、「変数」と呼ばれます。

  • 変数
  • 識別子
  • 変数宣言
  • 定数
  • 代入
  • 基本型
  • 基本型と文字列のリテラル

変数

「変数」は、特定のデータ「型」の「値」を格納する「名前付き」の格納場所です。言い換えると、「変数」には「名前」、「型」があり、「値」を格納します。

  • 変数には「名前」(または「識別子」)があり、たとえば radiusareaageheight などです。変数に値を割り当てたり、格納されている値を取得するためには、その名前が必要です。
  • 変数には intdouble などの型があります。
  • 変数は、その特定の「型」の「値」を格納できます。変数は型に関連付けられており、特定の型の値のみを格納できます。
  • 型は、データのサイズとレイアウト、値の範囲、および適用できる演算のセットを決定します。

次の図は、2 種類の変数である int 型と double 型を示しています。int 型の変数は整数(整数)を格納します。double 型の変数は実数を格納します。

image desc

識別子

変数(または関数やクラスなどの他のエンティティ)に「名前」を付けるために「識別子」が必要です。C++ では、識別子に対して次の「ルール」が課されます。

  • 識別子は、大文字と小文字の文字 (a-z, A-Z)、数字 (0-9)、アンダースコア _ で構成される文字のシーケンスです。
  • 空白文字(ブランク、タブ、改行)やその他の特殊文字(たとえば +-*/'@' など)は許可されていません。
  • 識別子は文字またはアンダースコアで始める必要があります。数字で始めることはできません。アンダースコアで始まる識別子は通常、システム使用のために予約されています。
  • 識別子は予約キーワードや予約リテラル(たとえば intdoubleifelsefor)にすることはできません。
  • 識別子は大文字小文字を区別します。roseRose ではなく、ROSE でもありません。

変数の命名規則

変数名は名詞、または複数の単語で構成される名詞句です。最初の単語は小文字で、その後の単語は先頭を大文字にし、単語の間には空白を入れません。たとえば、thefontSizeroomNumberxMaxthisIsAVeryLongVariableName などで、これは「キャメルケース」と呼ばれます。

推奨事項

  1. 変数の意味をよく反映し、「自己説明的」な名前を選ぶことが重要です。たとえば、numberOfStudentsnumStudents などです。
  2. abcdijki1j99 のような無意味な名前を使わないでください。単一のアルファベット名を避けてください。ただし、座標の xyz、インデックスの i のような一般的な名前の場合は例外です。
  3. 名前が正確にその意味を反映するように、30 文字程度の長い名前を使ってもかまいません。
  4. 単数形と複数形の名詞を適切に使って、単数形と複数形の変数を区別してください。たとえば、単一の行番号を表す変数 row と、複数の行を表す rows を使います。

変数宣言

使用する前に、まず次のいずれかの構文でその「名前」と「型」を宣言する必要があります。

構文
指定された型の変数を宣言する int option;
同じ型の複数の変数を宣言し、コンマで区切る double sum, difference, product, quotient;
変数を宣言し、この型の初期値を割り当てる int magicNumber = 88;
この型の初期値を持つ複数の変数を宣言する double sum = 0.0, product = 1.0;

int mark1;           // mark1 という int 型の変数を宣言する
mark1 = 76;          // mark1 を使用する
int mark2;           // int 型の変数 mark2 を宣言する
mark2 = mark1 + 10;  // mark2 と mark1 を使用する
double average;      // double 型の変数 average を宣言する
average = (mark1 + mark2) / 2.0;   // average、mark1 および mark2 を使用する
int mark1;           // エラー:2 回宣言する
mark2 = "Hello";     // エラー:異なる型の値を割り当てる
int number;             // 宣言されているが初期化されていない
cout << number << endl; // 初期化される前に使用される、警告/エラーは表示されないが、予期しない結果になる

次のことに注意してください。

  • C++ では、変数の名前を宣言してから使用することができます。
  • C++ は「強い型付け」言語です。変数は型を持ちます。変数の「型」が宣言されると、その特定の型に属する値のみを格納できます。
  • 各変数は一度だけ宣言できます。
  • C++ では、プログラム内のどこでも変数を宣言できます。ただし、使用する前に宣言する必要があります。
  • 変数の型はプログラム内で変更できません。
  • 宣言されたばかりで初期化されていない変数は、ゴミ値を含んでいます。C/C++ では、変数を初期化する前に使用しても警告/エラーは表示されず、予期しない結果につながります。

定数 (const)

定数は、キーワード const で宣言される「変更不可能」な変数です。その値はプログラム実行中に変更できません。また、const は宣言時に初期化する必要があります。例:

const double PI = 3.1415926;  // 初期化が必要

定数の命名規則:アンダースコアで連結された大文字の単語を使用します。たとえば、MIN_VALUE

「式」は、('+''-''*''/' などの)「演算子」と「オペランド」(変数またはリテラル値)の組み合わせで、特定の型の単一の値を生成するように「評価」できます。たとえば、

1 + 2 * 3           // int 型の 7 を返す

int sum, number;
sum + number        // int 型の値に評価される

double principal, interestRate;
principal * (1 + interestRate)  // double 型の値に評価される

代入 (=)

「代入文」は、次のように定義されます。

  1. (右辺の)リテラル値を変数(左辺の)に代入する。
  2. (右辺の)式を評価し、その結果の値を変数(左辺の)に代入する。

右辺は値でなければならず、左辺は変数(またはメモリアドレス)でなければなりません。

代入文の構文は以下の通りです。

構文
(右辺の)リテラル値を変数(左辺の)に代入する number = 88;
(右辺の)式を評価し、その結果を変数(左辺の)に代入する sum = sum + number;

代入文は次のように解釈されます。まず、右辺(RHS)の「式」が評価されて結果の値(「rvalue」または右辺値と呼ばれます)が生成されます。その後、「rvalue」が左辺(LHS)の変数(または「lvalue」、つまり「rvalue」を保持できる場所)に代入されます。

基本型

以下の表は、基本型の「典型的な」サイズ、最小値、最大値を示しています。再度、サイズは実装に依存することに注意してください。

カテゴリ 説明 バイト数 (典型的) 最小値 (典型的) 最大値 (典型的)
整数型 int(または signed int) 符号付き整数(少なくとも 16 ビット) 4 (2) -2147483648 2147483647
整数型 unsigned int 符号なし整数(少なくとも 16 ビット) 4 (2) 0 4294967295
整数型 char 文字(符号付きまたは符号なしは実装に依存) 1
整数型 signed char 文字または符号付き微小整数(符号付きであることが保証される) 1 -128 127
整数型 unsigned char 文字または符号なし微小整数(符号なしであることが保証される) 1 0 255
整数型 signed short 短い符号付き整数(少なくとも 16 ビット) 2 -32768 32767
整数型 unsigned short 短い符号なし整数(少なくとも 16 ビット) 2 0 65535
整数型 long 長い符号付き整数(少なくとも 32 ビット) 4 (8) -2147483648 2147483647
整数型 unsigned long 長い符号なし整数(少なくとも 32 ビット) 4 (8) 0 上記と同じ
整数型 long long 非常に長い符号付き整数(少なくとも 64 ビット) 8 -2e^63 2e^63-1
整数型 unsigned long long 非常に長い符号なし整数(少なくとも 64 ビット) 8 0 2e^64-1
実数型 float 浮動小数点数、約 7 桁 4 3.4e^38 3.4e^(-38)
実数型 double 倍精度浮動小数点数、約 15 桁 8 1.7e^308 1.7e^(-308)
実数型 long double 長い倍精度浮動小数点数、約 19 桁 12 (8)
ブール型 bool true または false のブール値 1 false (0) true (1 または非ゼロ)
広い文字型 wchar_t、char16_t、char32_t 広い(2 バイト)文字 2 (4)

sizeof 演算子

C/C++ は、オペランドのサイズ(バイト数)を取得する単項の sizeof 演算子を提供しています。次のプログラムは、sizeof 演算子を使用して基本型のサイズを表示します(以下のコードを /home/labex/Codetest.cpp に保存してください)。

/*
 * 基本型のサイズを表示する。
 */
#include <iostream>
using namespace std;

int main() {
   cout << "sizeof(char) is " << sizeof(char) << " bytes " << endl;
   cout << "sizeof(short) is " << sizeof(short) << " bytes " << endl;
   cout << "sizeof(int) is " << sizeof(int) << " bytes " << endl;
   cout << "sizeof(long) is " << sizeof(long) << " bytes " << endl;
   cout << "sizeof(long long) is " << sizeof(long long) << " bytes " << endl;
   cout << "sizeof(float) is " << sizeof(float) << " bytes " << endl;
   cout << "sizeof(double) is " << sizeof(double) << " bytes " << endl;
   cout << "sizeof(long double) is " << sizeof(long double) << " bytes " << endl;
   cout << "sizeof(bool) is " << sizeof(bool) << " bytes " << endl;
   return 0;
}

出力:

sizeof(char) is 1 bytes
sizeof(short) is 2 bytes
sizeof(int) is 4 bytes
sizeof(long) is 4 bytes
sizeof(long long) is 8 bytes
sizeof(float) is 4 bytes
sizeof(double) is 8 bytes
sizeof(long double) is 12 bytes
sizeof(bool) is 1 bytes
画像の説明

typedef 文

unsigned int を何度も入力するのは面倒です。typedef 文を使用すると、既存の型に新しい名前を付けることができます。たとえば、次のように、unsigned int に対して "uint" という新しい型を作成できます。typedef#include の直後に配置する必要があります。typedef は注意深く使用する必要があります。なぜなら、プログラムを読みにくく理解しにくくするからです。

typedef unsigned int uint;

多くの C/C++ コンパイラは、unsigned inttypedef である size_t という型を定義しています。

typedef unsigned int size_t;

基本型と文字列のリテラル

整数リテラル

デフォルトでは、123-456 などの整数は int として扱われます。例えば、

int number = -123;
int sum = 4567;

デフォルトの基数 10 の整数の他に、16 進数の値には接頭辞 '0x' を、2 進数の値には接頭辞 '0b' を使用できます(一部のコンパイラでは)。例えば、

int number1 = 1234;       // 10 進数
int number2 = 01234;      // 8 進数 1234、10 進数 2322
int number3 = 0x1abc;     // 16 進数 1ABC、10 進数 15274
int number4 = 0b10001001; // 2 進数(一部のコンパイラでは動作しない場合があります)

long リテラルは接尾辞 'L' または 'l' で識別されます(小文字は避けてください。1 と混同される可能性があります)。long long int は接尾辞 'LL' で識別されます。また、unsigned int には接尾辞 'U'unsigned long には接尾辞 'UL'unsigned long long int には接尾辞 'ULL' を使用できます。例えば、

long number = 12345678L;     // long 型には接尾辞 'L' が必要
long sum = 123;              // int 型の 123 は自動的に long 型の 123L にキャストされます
long long bigNumber = 987654321LL;  // long long int 型には接尾辞 'LL' が必要

short リテラルには接尾辞は必要ありません。ただし、許容範囲内の整数値のみを使用できます。例えば、

short midSizeNumber = -12345;

浮動小数点数リテラル

小数点がある数、例えば 55.66-33.44 は、デフォルトで double として扱われます。また、科学表記でも表現できます。例えば、1.2e3-5.5E-6。ここで、e または E は 10 のべき乗を表す指数を示します。小数部分または指数の前には、プラス (+) またはマイナス (-) の符号を付けることができます。指数は整数でなければなりません。

float リテラルには必ず接尾辞 'f' または 'F' を使用する必要があります。例えば、-1.2345F。例えば、

float average = 55.66;      // エラー!右辺は double 型です。float 型には接尾辞 'f' が必要です。
float average = 55.66f;

long double には接尾辞 'L'(または 'l')を使用します。

bool リテラル

bool リテラルは 2 つだけで、truefalse です。例えば、

bool done = true;
bool gameOver = false;
int i;
if (i == 9) {   // true または false を返します
   ......
}

文字リテラル

印刷可能な char リテラルは、文字を 1 対の シングルクォート で囲んで書きます。例えば、'z''$''9'。C++ では、文字は 8 ビットの ASCII コードで表され、算術演算では 8 ビットの 符号付き整数 として扱うことができます。言い換えれば、char と 8 ビットの符号付き整数は相互に変換可能です。また、[-128, 127] の範囲の整数を char 型の変数に代入することもできます。unsigned char には [0, 255] の範囲の整数を代入できます。例えば、

char letter = 'a';             // 97 と同じ
char anotherLetter = 98;       // 文字 'b' と同じ
cout << letter << endl;        // 'a' が表示されます
cout << anotherLetter << endl; // 数字ではなく 'b' が表示されます
anotherLetter += 2;            // 100 または 'd'
cout << anotherLetter << endl; // 'd' が表示されます
cout << (int)anotherLetter << endl;  // 100 が表示されます

文字列リテラル

String リテラルは、0 個以上の文字が 1 対の ダブルクォート で囲まれて構成されます。例えば、"Hello, world!""The sum is """。例えば、

String directionMsg = "Turn Right";
String greetingMsg = "Hello";
String statusMsg = "";             // 空の文字列

例(リテラル)

/* 基本型のテスト */
#include <iostream>
using namespace std;

int main() {
   char gender ='m';             // char 型はシングルクォートで囲まれます
   bool isMarried = true;         // true(非ゼロ) または false(0)
   unsigned short numChildren = 8; // [0, 255]
   short yearOfBirth = 1945;      // [-32767, 32768]
   unsigned int salary = 88000;   // [0, 4294967295]
   double weight = 88.88;       // 小数部分がある
   float gpa = 3.88f;           // float 型には接尾辞 'f' が必要です

   // "cout <<" を使用すると、任意の型の値を表示できます
   cout << "Gender is " << gender << endl;
   cout << "Is married is " << isMarried << endl;
   cout << "Number of children is " << numChildren << endl;
   cout << "Year of birth is " << yearOfBirth << endl;
   cout << "Salary is " << salary << endl;
   cout << "Weight is " << weight << endl;
   cout << "GPA is " << gpa << endl;
   return 0;
}

出力:

Gender is m
Is married is 1    // true
Number of children is 8
Year of birth is 1945
Salary is 88000
Weight is 88.88
GPA is 3.88
画像の説明

まとめ

このパートでは、いくつかの基本型を紹介しました。変数を表現する方法と、それを操作する方法を知る必要があります。メモリ内の各型のサイズと、各型の範囲が何であるかを覚えておいてください。