C++ with Windows API講習/変数と文字列

概要

今回は、プログラムの中でも非常に重要な要素である、変数の解説をします。

重要語

変数

実行中に値を保存しているもの

宣言

変数の型と名前を定義すること

初期化

変数が最初に持つ値の定義

代入

変数の持つ値を変えること

連結

複数の文字列を繋げること

必要語

今回の必要語はありません。

変数/型

変数とは、プログラムの実行中に値を保存するものです。
これは、実行中に値を変えられる、という点で、定数と対比されます。

C++では、整数のint型、実数のdouble型など、すべての値に型があります。
1つの変数には、1つの型の値しか入れられません。
そこで、変数の説明に、int型の変数、などということがあります。
表のような型のほかにも様々な型があり、自分で増やすこともできますが、これについては基礎講習や応用講習で解説します。

主要な型

int型

整数の型

double型

実数の型

std::wstring型

今回の講習で使う文字列型

bool型

真偽値型

C++標準ライブラリ

C++には、標準ライブラリという、便利なコード集が付随しています。
これは、使われることの多い型や関数の定義をまとめたものです。
この定義を使うことで、簡単かつ安全なプログラムを書くことができます。
ライブラリを使うには、定義のファイルを#include <ファイル名>で読み込みます。
今回の講習では、UTF-16という文字コードを使っているので、std::wstring型を使います。
このために、stringというライブラリを読み込んでいます。

変数の宣言

コードに目を通し、実行してみましょう。
前章と違うところはどこでしょうか。
変数の宣言/初期化/値の利用
#include <Windows.h>
//std::wstringを定義しているライブラリ
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    //宣言、初期化
    std::wstring text = L"Welcome back!";
    //メッセージボックスに渡す
    MessageBoxW(NULL, text.c_str(), L"MessageBoxW1", MB_OK);
    return 0;
}

宣言

変数は、使う前に、その名前が変数であることを宣言しなければなりません。
これには、型名 変数名という構文を使います。
今回は、std::string型の変数textを宣言しました。

初期化

宣言の構文の後ろに、 = L"Welcome back"とついています。
これをつけることで、変数の初期値を設定することができます。
このことを、変数の初期化といいます。
ちなみに、std::string型の初期化をしなかった場合、空の文字列が初期値になります。

値の利用

text.c_str()の部分で値を利用しています。
前章の通り、c_str関数で変換しています。
変数の値は、変数名を書くだけで利用できます。

変数の名前

変数の名前に使える文字は、英数字とアンダーバー_です。
ただし、名前の最初が数字だと、数値とみなされてしまうので、2文字目以降に使いましょう。
変数名はわかりやすいものをつけるようにしましょう。

代入

変数のもつ値を変えるには、代入をします。
変数は、最後に代入された値を保持します。
次の例を実行してみましょう。
代入
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    std::wstring text = L"First";
    
    MessageBoxW(NULL, text.c_str(), L"MessageBoxW1", MB_OK);
    
    //代入
    text = L"Second";
    MessageBoxW(NULL, text.c_str(), L"MessageBoxW2", MB_OK);
    
    return 0;
}

代入

text = L"Second";で、変数textに、値L"Second"を代入しています。
ここで値が変更され、MessageBoxWの第2引数は同じでも、違う値が表示されるのです。
代入の文は、型に関わらず変数名 = 値です。
変数が有効な間は、何度でも代入することができます。

連結

文字列は、別の文字列と繋げて、長い文字列にすることができます。
次の例では、文字列Hello, worldを2つの文字列から生成しています。
連結
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    std::wstring text = L"Hello, ";
    
    //連結と代入
    text = text + L"world";
    MessageBoxW(NULL, text.c_str(), L"MessageBoxW1", MB_OK);
    
    return 0;
}

連結の記号

text + L"world"で、変数textの値に、L"world"を連結しています。
さらに、その値をtextに代入しています。
また、連結では、+の左側の値が前になります。

練習問題

ある人が、月曜日から日曜日まで1週間、毎日箱に果物を詰めることにしました。
各曜日ごとに、MessageBoxWで、詰めた後箱の中に入っている果物を列挙してください。
なお、第3引数の方には曜日を表示してください。
変数と文字列の連結を利用してください。
また、プログラムは、以下のコードに書き足して作りましょう。

果物

各曜日には、表のとおりの果物を詰めます。
果物の名前同士の間にはスペースを1つ入れてください。

詰める果物

月曜日

リンゴ

火曜日

バナナ

水曜日

イチゴ

木曜日

洋ナシ

金曜日

ブドウ

土曜日

メロン

日曜日

ドリアン
解答の一部
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    std::wstring str0 = L"リンゴ";//月曜日に加える果物
    
    return 0;
}
解答
練習問題解答
#include <Windows.h>
#include <string>

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int) {
    std::wstring str = L"リンゴ";                    //月曜日に加える果物
    MessageBoxW(NULL, str.c_str(), L"月曜日", MB_OK);//strに入っている文字列を表示
    str = str + L" バナナ";                          //火曜日に加える果物の文字列を連結
    MessageBoxW(NULL, str.c_str(), L"火曜日", MB_OK);//以下繰り返し
    str = str + L" イチゴ";
    MessageBoxW(NULL, str.c_str(), L"水曜日", MB_OK);
    str = str + L" 洋ナシ";
    MessageBoxW(NULL, str.c_str(), L"木曜日", MB_OK);
    str = str + L" ブドウ";
    MessageBoxW(NULL, str.c_str(), L"金曜日", MB_OK);
    str = str + L" メロン";
    MessageBoxW(NULL, str.c_str(), L"土曜日", MB_OK);
    str = str + L" ドリアン";
    MessageBoxW(NULL, str.c_str(), L"日曜日", MB_OK);
    return 0;
}