C++変数とデータ型:int、double、char、string、boolを徹底解説
C++における変数
C++において、変数とはプログラマがデータを保持・操作するための名前付きストレージ領域です。すべての変数には明示的な型があり、それによってメモリ占有サイズ、許容値の範囲、実行可能な演算が決まります。
このチュートリアルでは以下を扱います:
- C++の変数
- 基本的な変数の型
- 宣言のルール
- データ型の階層
- 識別子と命名規則
- const修飾子
- スコープ規則
- 暗黙的・明示的な型変換
- レジスタ変数
- コメントとエスケープシーケンス
C++の基本的な変数の型
- int – 小数部や指数部を持たない整数(例:120、-90)
- double – 倍精度浮動小数点数(例:11.22、2.345)
- char – シングルクォートで囲まれた単一文字リテラル(例:'a'、'm'、'F'、'P'、'}')
- float – 単精度浮動小数点数(例:1.3、2.6)
- string – ダブルクォートで囲まれた文字列(例:"How are you?")
- bool – trueまたはfalseのいずれかを保持
C++における変数宣言のルール
- 名前には英字、数字、アンダースコアを使用可能
- 数字で始めることは不可
- 慣習として小文字で開始;大文字開始は通常定数を表す
- 言語キーワード(例:
int)と衝突してはならない - アンダースコアで始めることは許可されるが、予約識別子のルールがあるため推奨されない
C++の変数データ型
C++は豊富なプリミティブ型を提供します。void型は値を持たず、通常は何も返さない関数の戻り値型として使用されます。
算術型は2つのカテゴリに分かれます:
- 浮動小数点型:
float(約32ビット)、double(約64ビット)、long double(実装依存で約96/128ビット) - 整数型:整数、文字、
bool。符号付きと符号なしの両方が存在
符号付き型は負、ゼロ、正の値を表現します。例えば8ビット符号付きcharの範囲は-127〜127です。
符号なし型は非負の値のみを保持します。8ビット符号なしcharの範囲は0〜255です。
変数名(識別子)
識別子は英字、数字、アンダースコアを含められます。長さは無制限で、大文字小文字を区別します:
int guru99, gurU99, GuRu99, GURU99;
予約キーワードを識別子として再利用することはできません。明確な命名規則を採用すると可読性が向上します:変数は小文字、複合語はcamelCaseまたはsnake_case、クラス名は大文字で開始します。
宣言と定義の例
int a = 5;
int b;
char c = 'A';
int a, b;
a = b = 1000;
int a(5);
int b{5};
C++のconst修飾子
初期化後に値を変更させたくない場合にconstを使用します:
const int bufSize = 512; // 入力バッファサイズ
const変数は初期化必須です。未初期化の場合コンパイルエラーになります。
const int i = get_size(); // OK:実行時初期化 const int j = 42; // OK:コンパイル時初期化 const int k; // エラー:未初期化のconst const int i = 42; const int ci = i; // OK:iのコピー
C++における変数のスコープ
スコープは名前が可視である範囲を定義します。変数は宣言位置から、それを囲むブロックの終わりまでアクセス可能です。
#include <iostream>
int main() {
int sum = 0;
for (int val = 1; val <= 10; ++val)
sum += val;
std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;
return 0;
}
mainはグローバルスコープsumはmain内のブロックスコープvalはforループ内のローカルスコープ
ネストしたスコープ
#include <iostream>
using namespace std;
int reused = 42; // グローバルスコープ
int main() {
int unique = 0; // ブロックスコープ
cout << reused << " " << unique << endl; // 42 0
int reused = 0; // ローカルでグローバルを隠蔽
cout << reused << " " << unique << endl; // 0 0
cout << ::reused << " " << unique << endl; // 42 0
return 0;
}
変数の型変換
C++は特定の条件下で暗黙的変換を行います。主なルールは以下の通りです:
- 非bool → bool:0は
false、それ以外はtrueになる。bool b = 42; // bはtrue
- bool → 算術型:
trueは1、falseは0になる。bool b = true; int i = b; // iは1
- 浮動小数点 → 整数:ゼロ方向へ切り捨て。
int i = 3.14; // iは3
- 整数 → 浮動小数点:小数部は失われる。
int i = 3; double pi = i; // piは3.0
- 符号なしオーバーフロー:値が基数でモジュロ演算される。
unsigned char c = -1; // 8ビットcharなら255
- 符号付きオーバーフロー:未定義動作
符号付きと符号なし整数を混在させると、負の符号付き値が予期せず大きな符号なし値に変換されることがあります。
レジスタ変数
registerキーワードで、頻繁にアクセスされる変数をCPUレジスタに格納するようヒントを出せます。現代のコンパイラは通常このヒントを無視し、独自に最適化を行います。
register int i;
コメント
コメントはコンパイラによって無視され、コードの文書化に役立ちます:
- 単一行 –
//で開始 - 複数行 –
/* ... */で囲む
/* This is a comment */ /* C++ comments can also span multiple lines */
エスケープシーケンス
エスケープシーケンスは、印刷不可能または特殊な文字を表現します:
| エスケープ | 説明 |
|---|---|
| \n | 改行 |
| \t | 水平タブ |
| \\ | バックスラッシュ |
| \b | バックスペース |
| \r | キャリッジリターン |
| \v | 垂直タブ |
| \f | フォームフィード |
| \a | アラート(ベル) |
| \" | ダブルクォート |
| \' | シングルクォート |
| \? | クエスチョンマーク |
cout << '\n'; // 改行 cout << "\tguru99!\n"; // タブ + テキスト + 改行
一般化シーケンスでは16進数や8進数の値を使用:
\7 // ベル \12 // 改行 \40 // スペース \x4D // 'M'
まとめ
- 変数は名前付きストレージを提供し、型を持つ
- 主要な型:int、double、char、float、string、bool
- スコープが可視性を定義;ネストしたスコープで名前を隠蔽可能
- 暗黙的・明示的変換が存在するが、慎重に使用する必要がある
- レジスタヒントはパフォーマンス改善の可能性があるが、あくまで助言
- コメントとエスケープシーケンスは可読性と正しい出力を助ける
C言語
- C# 変数とプリミティブデータ型:完全マスターガイド
- C++変数・リテラル・定数完全ガイド:基礎から実践まで
- C++データ型完全ガイド:基本型、修飾子、ベストプラクティス
- C言語変数・定数・リテラル完全ガイド
- C言語データ型完全解説:int、float、charなど
- C言語ユーザー定義関数の4つの実証済みパターン
- C言語ストレージクラス完全理解:スコープ・ライフタイム・パフォーマンス
- C++演算子を徹底解説:種類、例、サンプルプログラム付き
- C言語の変数を理解する:型、命名規則、メモリ管理
- C言語可変長引数のマスター:実践ガイド
- Java変数の種類:ローカル、インスタンス、クラス変数を徹底解説