代入と演算#
進数 | 表現方法 | 例 |
---|---|---|
二進数 | 0b + 二進数 + 接尾辞 | |
八進数 | 0 + 八進数 + 接尾辞 | |
十進数 | 十進数 + 接尾辞 | |
十六進数 | 0x + 十六進数 + 接尾辞 | |
接尾辞:
L/l
:long
型を示すLL/ll
:long long
型を示すU/u
:unsigned
型を示す
型変換#
順序:
long double
double
float
unsigned long long
long long
unsigned long
long
unsigned int
int
文字#
文字データ型
型 | メモリ使用量 | 説明 | 例 |
---|---|---|---|
char | 1 | Ascii 文字 | |
wchar_t | 2/4 | ワイドバイト文字 | wchar_t wcharA{L'A'}; |
char16_t | 2 | utf_16 文字 | char16_t wchar16{u'A'}; |
char32_t | 4 | utf_32 文字 | char32_t wchar32{U'A'}; |
型推論#
// a変数の型はfloat
auto a{1.0f}
// typeid(a).name()を使って出力を確認できる
フォーマット出力#
方法 | 説明 |
---|---|
std::fixed | 小数点形式で浮動小数点数を出力 |
std::scientific | 科学的表記法で小数を出力 |
std::defaultfloat | デフォルトの小数出力に戻す |
std::setprecision(int) | 小数精度を設定 |
std::dec | 十進数で数字を出力 |
std::hex | 十六進数で数字を出力 |
std::oct | 八進数で数字を出力 |
std::showbase | 十六進数と八進数で接頭辞を表示 |
std::shownobase | 十六進数と八進数で接頭辞を表示しない |
std::setw(int) | 出力内容を指定幅に設定 |
std::setfill(char) | 表示幅が文字幅を超えた場合、指定の文字列で残りを埋める |
赤い方法はヘッダーファイルiomanip
をインクルードする必要があります。
エスケープ#
演算優先順位#
演算子 | 結合性 |
---|---|
() [] -> . 後置 ++ 後置 -- typeid const_cast dynamic_cast static_cast reinterpret_cast | 左から右へ |
! ~ 単項 + 単項 -- 前置 ++ 前置 -- & * (型) sizeof new new [] delete delete [] | 左から右へ |
.* 0>* | 右から左へ |
* / % | 左から右へ |
+ - | 左から右へ |
<< >> | 左から右へ |
< <= > >= | 左から右へ |
== != | 左から右へ |
& | 左から右へ |
^ | 左から右へ |
| | 左から右へ |
&& | 左から右へ |
|| | 左から右へ |
? : op= | 右から左へ |
throw | 右から左へ |
. | 左から右へ |
文字エンコーディング#
列挙#
コード例:
// 基本型は整数型int shortのみ
enum class 型名:基本型
{
型1
}
// 基本型はデフォルトでint
// 値を与えない場合は0から始まる
enum class EquipLv {
normal,
high,
rare,
epic,
legend,
myth
};
enum class EquipLv {
normal=100,
high,
rare,
epic,
legend,
myth=1000
};
// 使用
EquipLv weaponeCLV{ EquipLv::normal };
EquipLv weaponeDLV{ EquipLv::legend };
列挙型のまとめ:
- 列挙型はコードの可読性と安全性を向上させることができる。
- 列挙型はデフォルトで int 型である。
- 列挙型のメンバーは整数型のみである。
- 列挙型と他の型の変換には明示的な変換が必要である。
- デフォルトでは、列挙型の次の項目の初期値は前の項目の初期値 + 1 である。
カスタム型名#
型名を変更する方法:(TypeName は A に置き換えられる)
#define TypeName A
typedef TypeName A
using A = Typename
名前空間#
using namespace
変数のライフサイクル#
- コードブロック内の変数のライフは宣言から始まり、そのコードブロックが終了するまで続く。
- コードの開始前に宣言された変数はグローバル変数と呼ばれ、グローバル変数のライフはプログラムの実行開始からプログラムの終了まで続く。
- 変数名の衝突がある場合は、近接の原則が適用される。
- 名前の衝突があるグローバル変数にアクセスするには、修飾子::を使用してアクセスする。
カスタムデータ型#
- 構造体の本質は、私たち自身の方法で連続したメモリ構造を定義することである。
- 構造体変数を宣言する本質は、コンピュータにメモリを要求することであり、このメモリのサイズは少なくとも私たちが定義した構造メンバーが占有するメモリの合計である(メモリの整列)。
- 構造体を使用することで、私たちが定義した方法でこのメモリからデータを読み書きする。
ビット演算#
二進数内容の出力#
bitset
ヘッダーファイルをインクルードするstd::bitset<表示する二進数のビット数>(表示する変数)
#include<iostream>
#include<bitset>
int main() {
int a{(int) 0b11111101111111101111111 };
std::cout << std::bitset<32>(a);
return 0;
}
00000000011111101111111101111111
D:\project\cpp\demo1\Debug\demo1.exe (process 75568) exited with code 0.
Press any key to close this window . . .
左シフト#
<<
右シフト#
>>
符号付き数を右シフトする際、最上位ビットは符号ビットで埋める。
反転#
~
AND 演算#
&
OR 演算#
|
XOR 演算#
^
関係演算子#
関係演算子 | 説明 |
---|---|
> | 大きい |
< | 小さい |
== | 等しい |
>= | 大きいまたは等しい |
<= | 小さいまたは等しい |
!= | 等しくない |
論理演算子#
演算子 | 名称 | 説明 |
---|---|---|
&& | 論理 AND | 1. ビット演算子 & との違いに注意 2. オペランドがすべて true のとき、式は true |
|| | 論理 OR | 1. ビット演算子 |
! | 論理 NOT | 1. ビット演算子~との違いに注意 2. オペランドが false のとき、式は true |
注意:
- 単項演算子の優先順位は二項演算子より高い。
- ビット演算の優先順位は論理演算より高い。
- ~! > & > |
数値は論理演算において数値を boolean 値に変換し、その後論理演算を行う。
文字列処理#
文字列処理関数(cctype ヘッダーファイル)
関数 | 説明 |
---|---|
int isupper(char) | 文字が大文字かどうかを判断 |
int islower(char) | 文字が小文字かどうかを判断 |
int isalpha(char) | 文字がアルファベットかどうかを判断 |
int isdigit(char) | 文字が数字かどうかを判断 |
int isalnum(char) | 文字がアルファベットまたは数字かどうかを判断 |
int isspace(char) | 文字が空白かどうかを判断 |
int isblank(char) | 文字がスペースかどうかを判断 |
int ispunct(char) | 文字が句読点かどうかを判断 |
int isprint(char) | 文字が印刷可能かどうかを判断 |
int iscntrl(char) | 文字が制御文字かどうかを判断 |
int isgraph(char) | 文字がグラフィック文字かどうかを判断 |
int tolower(char) | 文字を小文字に変換 |
int toupper(char) | 文字を大文字に変換 |
ステートメントブロックの中の変数#
C++17 新文法
if(変数のライフサイクル; 条件)
{
}
else
{
}
フォーマットストリーム出力とエスケープ#
printf
パラメータ | 説明 |
---|---|
d | 十進数 |
o | 八進数 |
u | 符号なし十進数 |
x/X | 十六進数整数 |
f | float 小数 |
lf | double 小数 |
s | 文字列 |
0 | 0 で埋める |
+ | 数字を表示する |
非表示の入力#
コンソールは入力内容を表示しない。
ヘッダーファイルは <conio.h> をインクルードする必要がある。
int _getch();
#include<iostream>
#include<conio.h>
int main() {
int a = _getch();
printf("入力した文字は: %d", a);
return 0;
}
goto#
#include<iostream>
int main() {
char a;
rep:
printf("大文字のアルファベットを入力してください: ");
std::cin >> a;
if (a > 64 && a < 91 )
{
a += 32;
}
else
{
goto rep;
}
return 0;
}
配列の本質#
- 一次元配列の本質は、申請したデータ型に基づいて、オペレーティングシステムに連続したメモリ空間を要求することである。
- 多次元配列の本質もオペレーティングシステムに連続したメモリを要求することであり、一般的には低次元の線形順序で並べられる(オペレーティングシステムやコンパイラによって異なる可能性がある)インデックスは対応する領域にアクセスするための便宜である。
一次元配列#
定義方法:
データ型名 配列名[定数式];
初期化方法:
int a[10] = {0,1,2,3,4,5,6,7,8,9};
二次元配列#
定義方法:
データ型名 配列名[定数式1][定数式2];
初期化方法:
// すべてを大括弧内で定義
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
// 一次元の長さを省略できる
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
// 一部の要素に値を設定
int a[3][4] = {{1},{5},{9}};
配列に基づくループ#
#include<iostream>
int main() {
int a[4] = { 3, 4, 2, 7 };
// 第一の方法
for (int i = 0; i < sizeof(a) / sizeof(int); i++)
{
std::cout << a[i] << std::endl;
}
// 第二の方法
// データ型はautoに書き換え可能
for(int value :a)
{
std::cout << value << std::endl;
}
return 0;
}
std::array#
生の配列 + 追加機能
構文:
std::array<変数型, 要素数> 変数名
例:std::array<int, 5> studentId;
一般的な使い方:
// studentIdの要素数を返す
studentId.size();
// studentIdのすべての要素を250に設定
studentId.fill(250);
// studentId[1]の内容を返す、越境するとエラーになる
studentId.at(1);
std::vector#
構文:
std::vector<データ型> 変数名
例:
std::vector<int> studentId
一般的なメソッド:
// 初期化されたvectorの要素は1,2,3
std::vector<int> studentId{1,2,3};
// このvectorは5つの要素を持つ
std::vector<int> studentId(5);
// このvectorは5つの要素を持ち、初期化は100
std::vector<int> studentId(5, 100);
一般的なメソッド:
std::array
のメソッドはstd::vector
でもほぼ使用可能
// 値をvectorに追加
studentId.push_back(値);
// studentIdを再初期化し、10個の要素を持ち、各要素は100
studentId.assign(10, 100);
// studentIdをクリア
studentId.clear();
// studentIdが空かどうかを判断
studentId.empty();
入力#
C 言語#
char str[0xff];
scanf("%s", str);
wchar_t wstr[0xff];
wscanf(L"%s", wstr);
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
int main()
{
const char* username[10];
printf("あなたの名前を入力してください:");
scanf("%s", &username);
printf("\nあなたの名前は: %s\n", username);
// ワイドキャラクター
setlocale(LC_ALL, "chs");
wchar_t* w_username = new wchar_t[5];
printf("【ワイドキャラクター】あなたの名前を入力してください:");
wscanf(L"%s", &username);
wprintf(L"\n【ワイドキャラクター】あなたの名前は: %s\n", username);
return 0;
}
文字の長さ#
strlen()
ワイドキャラクターの長さを求める:
wslen()