C++ on MSVC講習/Hello World!

概要

初めてのC++プログラムは、Hello World!のような文章を表示するのが慣習です。
今回は、Hello World!と表示するプログラムを作りましょう。

重要語

コード

プログラマーが書いている文書

ビルド

実行ファイルへ変換する一連の動作

コンパイル

コードを機械語に翻訳する作業

コンパイラ

コンパイルをするプログラム

処理系

コードを機械語への翻訳し、実行をするまでの一連の仕組み

コンソール

文字のみでPCとやり取りするCUI形式の画面

基本ソース文字集合

標準規格で「コードで使用できる文字」とされる96文字

コメント

コード中に実行ファイルには影響しない文字を書ける機能

エントリーポイント

プログラムが実行される時に、実行を開始する場所

main関数

C++のエントリーポイント、かつプログラム全体のまとまり

演算子とオペランド(被演算子)の並び

演算子

+-など、何らかの演算を表す記号

オペランド

何らかの「値」

順番に実行されるC++プログラムの断片

トークン

コード上で意味を持つ最小の単位

標準出力

標準で用意されている出力先

std::cout

プログラム実行時に標準出力に紐づけられるもの

左シフト演算子

<<

リテラル

コード上に直接書かれているデータ

エスケープシーケンス

文字/文字列リテラルの中での一部文字の表記方法

必要語

今回はありません

C++のプログラム事始め

まず、C++のプログラムを学んでいくにあたって、プログラムの仕組みについて解説します。

コード、プログラムの実行とビルド

C++ではプログラマーが書いている文書のことをコードだとか、ソースコードと言います。
コードは幾つかの手順を踏んでPCが実行できるファイルに変換してから使用します。
Visual Studioでは実行ファイルへ変換する一連の動作をビルドと呼んでいます。
ビルドはCtrl+B、ビルドと実行(デバッグ無しで実行)はCtrl+F5がショートカットです。

コンパイルとコンパイラ

ビルド中には、コードを機械語に翻訳する作業があり、これをコンパイルと呼びます。
コンパイルをする時は専用のプログラムが使われますが、それをコンパイラと言います。
私達はMicrosoft社のMicrosoft Visual C++(VC++やMSVCとも)を使います。

処理系

処理系は、コードを機械語への翻訳し、実行をするまでの一連の仕組みの事です。
即ち、ビルドと実行をする一連の仕組みで、多くの場合はコンパイラとOSの組み合わせです。
C++では、処理系によって処理が異なる場合が多数あり、それ故に多用される言葉です。

コンソール

これから私達が学ぶC++プログラムは、原則としていわゆるコンソールを使用します。
ここでのコンソールは、文字のみでPCとやり取りするCUICharacter User Interface形式の画面の事です。
一方、普段から私達が使っているプログラムのほとんどはGUIGraphical User Interface形式の画面です。

Hello World!のコード

さて、Visual Studioを開いて、Visual Studioのプロジェクトの初期コードを実行します。
新しいプロジェクトの作成>コンソール アプリで新しいプロジェクトを作り、実行しましょう。
以後も同様にコンソール アプリを選択してプロジェクトを作るので、覚えておいてください。
Hello, World!
// example.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
}

// プログラムの実行: Ctrl + F5 または [デバッグ] > [デバッグなしで開始] メニュー
// プログラムのデバッグ: F5 または [デバッグ] > [デバッグの開始] メニュー

// 作業を開始するためのヒント: 
//   1. ソリューション エクスプローラー ウィンドウを使用してファイルを追加/管理します 
//   2. チーム エクスプローラー ウィンドウを使用してソース管理に接続します
//   3. 出力ウィンドウを使用して、ビルド出力とその他のメッセージを表示します
//   4. エラー一覧ウィンドウを使用してエラーを表示します
//   5. [プロジェクト] > [新しい項目の追加] と移動して新しいコード ファイルを作成するか、[プロジェクト] > [既存の項目の追加] と移動して既存のコード ファイルをプロジェクトに追加します
//   6. 後ほどこのプロジェクトを再び開く場合、[ファイル] > [開く] > [プロジェクト] と移動して .sln ファイルを選択します

実行結果

コンソールが出てきて、Hello World!と改行(気付きにくいですが)が表示されます。
下にVisual Studioからの終了メッセージが表示されますが、無視していきましょう。
出力については、< Hello World!のように、を付けて記載していきます。
実行結果
< Hello World!

コードHello World!解説

それでは、まず上の方からコードを見ていきましょう。

コードで使える文字

さて、C++の文法について触れていきますが、初めにコードで使える文字についてです。
以下96文字が、標準規格で「コードで使用できる文字」とされる、基本ソース文字集合です。
ただし、コメントやリテラル、追々解説する識別子などではその限りではありません。
ちなみに、MSVCでは拡張機能として、$も基本ソース文字集合として定義されています。
基本ソース文字集合(確実にコードで使用できる文字)
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " '
半角スペース 水平タブ 垂直タブ 改行 改ページ 

基本ソース文字集合と踏みやすいエラー

ありがちなミスとして、「スペースを全角にしてしまってビルドに失敗する」があります。
先述の通り、基本文字集合以外の文字を使用すると、おおむねエラーになります。
つまり、いわゆる全角文字などが紛れ込んでいると、おおむねビルドが失敗するのです。

コメント

さて、Visual Studioのエディターで緑で表示されている部分は全てコメントです。
コメントは、コード中に実行ファイルには影響しない文字を書くことが出来る機能です。
そのため、主にプログラマー同士でのコードの意図や補足を書き残すために使います。
構文は、//から改行までと、/*から*/までがあり、後者は改行をコメントに含められます。

構文の表記

なにかしら

その文字自体を書く必要がある(例だと、「なにかしら」を直接書く)

なにかしら

「なにかしら」が、説明や明らかでない文字であれば、追って定義

複数行にまたがっている

それぞれの行が、その構文を表現できる表記の仕方
コメントの文法
// 改行以外の任意の文字 改行
/* 任意の文字 */

#includeインクルード <iostreamアイオーストリーム>

大雑把に言うと、C++標準ライブラリのiostreamを読み込んでいます。
今は、後で解説する、std::coutシーアウトを使うために必要だから書く、という認識をしてください。
この一行は次に開設する、mainメイン関数の前に書く必要があるので注意してください。

mainメイン関数

コードのint main() {}の部分のことをmain関数と呼びます。
main関数は、エントリーポイントであり、プログラムの処理が始まり、終わるところです。
即ち、C++のコンソールプログラムは、main関数の本体を上から順々に実行していくのです。
ただし、関数の本体は{}に挟まれている部分のことです。

コードHello World! main関数内解説

それでは、main関数内のstd::cout << "Hello World!\n";について見ていきます。
そのために、もう少し基礎的なC++の文法についてを踏まえておきましょう。

C++では式は、演算子とオペランド(被演算子)の並びのことです。
オペランドはリテラルや、追々解説する変数など、何らか「値」のことを指します。
そして、演算子は+-などの、何らかの演算を表す記号のことです。

C++には文という単位があり、意味論的に、コードは文が並べられることで構成します。
そして、コード上の文が順番に実行されることによって、プログラムが実行されるのです。
また、多くの文では、;セミコロンが文の終端を表す記号です。
即ち、多くの文では、;を必ず最後に付ける必要があることになっているのです。

トークン

コードで意味を持つ最小の単位は、英語等の「単語」に当たるトークンと呼ばれるものです。
トークンはキーワード、識別子、リテラル、演算子、区切り記号などに分けられます。

トークンの区切りとホワイトスペース

トークン同士は、ホワイトスペースもしくは演算子、区切り記号のトークンで区切られます。
そして、それぞれのトークンの間には自由にホワイトスペースなどを追加することが出来ます。
ホワイトスペースとは、スペース、水平/垂直タブ、改行、改ページのことです。

だから…

#include <iostream>は、ビルドの中でも、プリプロセスという作業で処理されます。
なので、「今解説しているトークン」とは別の存在なので触れないでおきます。
さて、先段落の解説より、コード「Hello World!」は、次のように書くことも出来ます。
(ただし、コメント部分はあまりにも量が多いので、コメント部分以外を抜粋)
ぎゅうぎゅうづめ
#include <iostream>
int main(){std::cout<<"Hello World!\n";}
すっかすか
#include <iostream>

int


    main
(           )

{
std      ::     cout
   <<
"Hello World!\n"
;
       }

std::cout << "Hello World!\n";

それでは、この1文を、std::cout<<"Hello World!\n";の四つに分けて考えましょう。
;というのは文の終わりを示すトークンなので他の3つについて解説します。

標準出力とstd::coutシーアウト

標準出力は、標準で用意されている出力先のことで、大体はコンソールです。
C++で標準出力を表すのはstd::coutで、紐づいている先に文字を出力することが出来ます。
ただ、大抵の場合はコンソールに紐づいて居るので、コンソールに出力するために使います。

ストリーム演算子(<<

<<は、俗に「ストリーム演算子」と呼ばれることもある「左シフト演算子」です。
左にstd::cout、右に「値」があると、右の「値」をstd::coutに渡し、出力します。
また、std::cout << "Hello World!\n" << 10;のように繋げ、連続して出力出来ます。

リテラル

コード上に直接書かれているデータのことをリテラルと呼びます。
リテラルは多数ありますが、整数/小数/文字/文字/文字列リテラルを今回解説します。
整数/小数は、単純に数字を直接書くだけでリテラルとなります。

文字列リテラル("Hello World!\n"

文字列リテラルは"ダブルクオーテーションで囲う必要があります。
それは、あくまでデータ部分であることを示す必要があるからです。
つまり、"Hello World!\n"というのは、文字列のデータということなのです。

文字リテラル

文字リテラルでは、文字列リテラル同様に、'シングルクオーテーションで囲う必要があります。
文字リテラルは、文字列リテラルと違い1文字のみしか使用することが出来ません。
詳しくすると難しいですが、文字リテラルに使えない文字も非常にたくさんあります。
ただし、アルファベットや半角数字、基本的な記号は、ほぼすべての場合で使えます。

エスケープシーケンス(\n

文字/文字列リテラルの中では、一部文字をエスケープシーケンスを用いて記述します。
特に使うのは以下です。以下から、"Hello World!\n"Hello World!と改行だとわかります。
なお、エスケープシーケンスは文字リテラルで使用することが出来ます。

特に使うエスケープシーケンス

\\

バックスラッシュ(円記号)

\"

ダブルクオーテーション

\n

Line Feed(改行)

\t

水平タブ

練習問題

次に示す出力結果になるようにC++コンソールプログラムを作りましょう。
ただし、整数/小数/文字/文字/文字列リテラルとエスケープシーケンスを使いましょう。
なお、回答例はあくまで回答例なので、実行結果と問題の制約を満たせば問題ありません。
また、問題がわからない場合などに読み直したり、調べることも問題ないとします。
出力結果
< C++ is a good programming language.
< 42 2021.05
回答例
回答例
#include <iostream>

int main() {
    std::cout << "C++ is a good programming language.\n"
        << 42 << ' ' << 2021.05;
}

ヒント 出力の1行目はすこし長めの文字列ですね。
一方、42は整数、2021.05は小数ですね。
では、文字リテラルはどこで使うと賢いでしょうか。

参照、出典

参照や出典です

参照

標準規格と処理系 - cpprefjp C++日本語リファレンス

https://cpprefjp.github.io/implementation-compliance.html

翻訳フェーズ - cppreference.com

https://ja.cppreference.com/w/cpp/language/translation_phases

トークンと文字セット | Microsoft Docs

https://docs.microsoft.com/ja-jp/cpp/cpp/character-sets?view=msvc-160

コメント - cppreference.com

https://ja.cppreference.com/w/cpp/comment

main 関数 - cppreference.com

https://ja.cppreference.com/w/cpp/language/main_function

式 - cppreference.com

https://ja.cppreference.com/w/cpp/language/expressions

文 - cppreference.com

https://ja.cppreference.com/w/cpp/language/statements

std::cout, std::wcout - cppreference.com

https://ja.cppreference.com/w/cpp/io/cout

式 - cppreference.com(演算子)

https://ja.cppreference.com/w/cpp/language/expressions#Operators