代入と演算#
進数 | 表現方法 | 例 |
---|---|---|
二進数 | 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. ビット演算子 | との違いに注意 2. オペランドの中に 1 つでも true があれば、式は true |
! | 論理 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
一般的なメソッド:
// 要素が1,2,3のvectorを初期化
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()