0または0.0はfalseに、それ以外はtrueに変換されます。
bool a = 0; // false bool b = 1; // true bool c = 2; // true bool d = 0.0; // false bool e = 1.0; // true bool f = -0.1; // true
値0のポインタはfalse、それ以外はtrueに変換されます。
int* p1 = NULL; int z; int* p2 = &z; bool bp1 = p1; // false bool bp2 = p2; // true
falseは0に、trueは1の整数に変換されます。また演算は整数に変換された上で実行され、その結果が0ならばfalseとなります。
int x = false; // 0 int y = true; // 1 bool e1 = true - true; // false (1-1=0) bool e2 = true + true; // true (1+1=2)
論理値がTRUE、FALSEのように大文字で記述されることがありますが、これはWindows.hなどで
#define TRUE 1 #define FALSE 0
のように定義されているためで、これらは整数値です。windows.h - c++ - What is the difference between false and FALSE? - Stack Overflow
char ch = 'a';
文字列の処理は、C ランタイム ライブラリもしくは標準ライブラリのstringコンテナを用いると簡単です。
文字リテラルとは'a'
のようにシングルクォートで囲まれた文字で、文字定数とも呼ばれます。
種類 | 型 | 表記 |
---|---|---|
文字リテラル | char | 'a' |
char (UTF-8) | u8'a' | |
ワイド文字リテラル | wchar_t | L'a' |
char16_t (UTF-16) | u'a' | |
char32_t (UTF-32) | U'a' |
ファイルに出力し、バイナリエディタで確認してみます。
std::ofstream stream("sample.txt"); // U+3042「あ」 stream << "\u3042"; // 82 A0 … Shift_JISによる符号化 stream << u8"\u3042"; // E3 81 82 … UTF-8による符号化 // U+1F607「😇」 stream << "\U0001F607"; // 3F 3F … ? stream << u8"\U0001F607"; // F0 9F 98 87 … UTF-8による符号化 stream.close();
ところで文字列リテラルはダブルクォートで囲んで表現し、配列に格納されます。
char ch1 = '\\'; // \ char ch2 = '\''; // ' char ch3 = '\"'; // " char ch4 = '"'; // " (エスケープしなくても良い)
型 | 別名 |
---|---|
int | signed |
short | short int、signed short int |
long | long int、signed long int |
int a = 3; a /= 2; // 1 int b = 1.5; // 1
コンパイラの設定によってビット長が異なります。
データモデル | ビット長 | 採用している環境 | |||||
---|---|---|---|---|---|---|---|
char | short | int | long | long long | ポインタ | ||
ILP32 | 8 | 16 | 32 | 32 | 64 | 32 | |
LLP64 (IL32P64 / P64) | 8 | 16 | 32 | 32 | 64 | 64 | Windows系 |
LP64 (I32LP64) | 8 | 16 | 32 | 64 | 64 | 64 | UNIX系 |
ILP64 | 8 | 16 | 64 | 64 | 64 | 64 | UNIX系 |
bool以外の整数系データ型は、unsignedを付けることで符号なし整数として表現できます。
型 | signed | unsigned |
---|---|---|
char | -128 ~ 127 | 0 ~ 255 |
short | -32,768 ~ 32,767 | 0 ~ 65,535 |
int | -2,147,483,648 ~ 2,147,483,647 ※1 | 0 ~ 4,294,967,295 ※1 |
long |
unsigned int a = 1; // 1 (0x00000001) unsigned int b = -1; // 4294967295 (0xffffffff) unsigned int c = 1; c -= 3; // 4294967294 (0xfffffffe)
signed char a1 = -1; unsigned char a2 = a1; // 255 unsigned char b1 = 128; signed char b2 = b1; // -128
型 | 接尾辞 (サフィックス) |
---|---|
unsigned | u または U |
long | l または L |
unsigned long | ul |
__int64 | ll、LL または i64 |
2進 ※1 | 0b0 | 0b10 | 0b10000 |
---|---|---|---|
8進 | 00 | 02 | 20 |
10進 | 0 | 2 | 16 |
16進 | 0x0 | 0x2 | 0x10 |
※1 Visual C++では、Visual C++ 2015以降で2進数リテラルに対応しています。ISO C/C++ 標準のサポート - Visual Studio 2015 における Visual C++ の新機能 | MSDN
文字列 | |
---|---|
簡易なNaN (Quiet NaN) | nan |
Signaling NaN | nan(snan) |
不定のNaN (Indefinite NaN) | nan(ind) |
無限大 (Infinity) | inf |
double ind = std::pow(-1.0, 0.5); std::cout << ind; // -nan(ind) double zero = 0; double inf = 1 / zero; std::cout << inf; // inf bool r1 = isnan(ind); // true bool r2 = isnan(zero); // false bool r3 = isnan(inf); // false
double r = sqrt(-2.0); // -nan(ind)
型 | 接尾辞 (サフィックス) |
---|---|
float | f または F |
long double | l または L |
キャスト演算子 | 用途 | 安全性 |
---|---|---|
static_cast | 関連のある型への変換 static_cast 演算子 | MSDN |
△ |
reinterpret_cast | 関連のない型への変換。任意の整数型からポインタへ、ポインタから他のポインタへの変換 reinterpret_cast 演算子 | MSDN |
× |
const_cast | const属性やvalatile属性の除去 const_cast 演算子 | MSDN |
△ |
dynamic_cast | 安全なダウンキャスト。キャストの成否の確認 dynamic_cast 演算子 | MSDN |
○ |
() | Cスタイルのキャスト。static_cast、reinterpret_cast、const_castを兼ねる キャスト演算子: () | MSDN |
× |
int a;
void* p1 = static_cast<void*>(&a);
void* p2 = static_cast<void*>(a); // C2440 'static_cast': 'int' から 'void *' に変換できません。
void* p3 = reinterpret_cast<void*>(a);
int a = 10; const int* p1 = &a; *p1 = 20; // C3892 const である変数へは割り当てることはできません int* p2 = p1; // C2440 '初期化中': 'const int *' から 'int *' に変換できません。 int* p3 = const_cast<int*>(p1); *p3 = 20;