はじめに
今回はC++における標準出力について、自分が初心者の頃に疑問だったことも含めて例文を解説していきたいと思います。
なるべく言葉や概念についても説明していきますが、足りないところは別の記事で補う予定です。
また、最後に理解度を深める演習問題を作ってあるので是非取り組んでください!
C++で画面に表示してみよう!
さて、恐らくですがこのページを見つけてくださった方には、初めてC++を触ると言った方が多いのではないでしょうか?
まずは「HelloWord!」と表示してみましょう!
#include <iostream> int main(){ std::cout << "HelloWorld!" << std::endl; return 0; }
上記のコードをコピーしてC++ファイルを作ってください。
これを適当なコンパイラでコンパイルして実行するとディスプレイ画面に一行「HelloWorld!」と出るはずです。
初めての方向けにざっくりと今回のテーマにはあまり関係のないコードを説明します。まぁいいやという方は、飛ばしてもらっても構いません。
- 「#include <iostream>」:標準ライブラリ「iostream」を読み込む。
よく言われるのが”おまじない”です。少し説明すると、”「iostream」という名前のプログラムを作るための部品が沢山入っている箱(ライブラリ)を利用するので用意してくださいね”とコンパイラに命令(include)しています。また、予め言語に組み込まれたライブラリを標準ライブラリといいます。
最初の頃はよく分からないけどプログラムの先頭に書くものと覚えておけば大丈夫です! - 「int main(){}」:int型で定義されたメイン関数。
C++プログラムはメイン関数を実行することによって様々な挙動を行います。中括弧「{}」で囲われた部分(コードブロック)が関数の中身で、関数を実行すると中身に書いてあることが文法ルールに沿って行われます。型や関数についてはまた別の記事で解説したいと思います。 - 「return 0」:int型のメイン関数のため、返り値として0を返す。
また別の記事で解説するので一旦はとりあえずメイン関数の最後につけるものとして覚えておいてください。
標準出力するには?
ここからが今回の本題です。
文字列を画面上に表示するというのはディスプレイ画面に文字列を出力するということです。このプログラムの実行結果を出力すること(主にディスプレイ画面に出力すること)を標準出力といいます。
文字列を標準出力するために使ったコードは次の一行です。
std::cout << "HelloWorld!" << std::endl;
これを説明すると”名前空間「std」の標準出力オブジェクト「cout」に文字列「HelloWorld!」と名前空間「std」のマニピュレータ「endl」を出力する。”となりますが、これでは訳がわからないと思うので詳しく見ていきましょう!
名前空間とは?
まずはじめに名前空間というのは、”C++において住所のような役割”をしていて、一つの名前空間には同じ名前の部品を複数設定することはできません。
この仕組みによって、プログラムで同じ名前を設定したい部品が複数あるときに、それぞれ別の名前空間を使うことで設定することができます。また、使うときも名前空間と部品の名前を伝えることで使うことができます。
名前空間にある部品は次のようにして呼び出します。
名前空間::部品
今回のプログラムにある「std::cout」、「std::endl」は共に名前区間「std」に存在する何らかの部品「cout」、「endl」を呼び出しているということです。
標準出力オブジェクト
名前空間「std」にあるオブジェクト「cout」のことを標準出力オブジェクトといい、ここにデータを出力することでターミナルなどのディスプレイ画面にデータを表示することができます。
また、「<<」のことを出力演算子(挿入演算子)といい次のようにして使います。
出力先<<出力するデータ
今回のプログラムでは「HelloWorld!」という文字列と「std::endl」という部品を出力していることになります。
マニピュレータ
入出力オブジェクトに対して入出力演算子と共に入出力フォーマットの変更や改行等の特殊な効果を持つ識別子のことをマニピュレータといいます。
標準ライブラリにいくつか存在しており、自分で新たに作ることもできます。
今回出てきた「endl」は改行とともにバッファをフラッシュするという効果を持ちます。バッファについてはまた別の記事で解説します。見た目上では単に改行するだけなので、改行するための特殊な識別子として覚えてください。
まとめ
これらをまとめると説明はやはり
“名前空間「std」の標準出力オブジェクト「cout」に文字列「HelloWorld!」と名前空間「std」のマニピュレータ「endl」を出力する。”
となりますね!
理解できた方は次へ進んでください。理解できなかった方はコメントで分からない点を教えてくだされば、なるべく分かりやすく答えさせていただきます。
標準出力とその周辺のことについての色々
最も簡単な出力方法を覚えてもらいましたが、標準出力やその周辺のことについて色々と覚えておいてもらいたいことがあるので、この際サクッと覚えてしまいましょう!
単純なプログラムにはusingディレクティブを活用しよう!
このプログラムでは指定した名前空間にある部品を使いますよーと宣言することができたら、部品を使う時に名前空間を指定しなくても良いですよね?
実はそれを可能にしてくれるコードが存在します。
using namespace 名前空間;
これをusingディレクティブといい、書いておくことでこのC++プログラムでは指定した名前空間にある部品を使うということを宣言することができます。
これを名前空間「std」に適応して先程のプログラムと同じものを書くと次のようになります。
#include <iostream> using namespace std; int main(){ cout << "HelloWorld!" << endl; return 0; }
どうでしょう?少しだけスッキリしましたか?
但し、これは名前空間が存在することによって起こる複雑さを無くすとともに、メリットも打ち消してしまっているのでプログラムによって使い分けることが大切です!
筆者の見解ですが、単純なプログラムでは使うことをお勧めしますが、複雑なプログラムになればなるほど使わない方が良いと思います。
標準出力オブジェクトは改行をしない!
まずは次のプログラムを見てください。
#include <iostream> using namespace std; int main(){ cout << "Hello"; cout << "World!" << endl; return 0; }
どのように出力されると思いますか?
一度、自分の端末で実行してみてください!
結果は、最初と同じくディスプレイ画面に一行で「HelloWorld!」と表示されると思います。
つまり「cout」が持つのは出力するという意味のみであり、一行生成するといったような意味は持ち合わせていないということです。
改行したい時には「endl」などの識別子を用いる必要があります。
標準出力とリテラルについて。
上に挙げてきたプログラムでは自然と文字列を二重引用符「””」で囲っていましたが、表示するもの全てを二重引用符「””」で囲うわけではないのです。
リテラルというのは固定値のことで、プログラム中に書かれた数値や文字列などの定数を指します。今回はよく使う次の四つのリテラルについて記述法を覚えてください。
文字リテラル
「a」のような単一の文字のことです。C++では引用符「”」で囲んで記述します。但し、日本語は一文字でも二文字として扱われるので注意してください。
文字列リテラル
「HelloWorld!」のような文字の集合、文字列のことです。二重引用符「””」で囲んで記述します。これは既出ですね。
整数リテラル
数値の「2」「3」などの整数のことです。囲う必要はなく、そのまま記述します。
浮動小数点リテラル
数値の「3.14」「0.314」などの小数点定数のことです。こちらも囲う必要はなく、そのまま記述します。
また、整数部か小数部のどちらかを省略することもできます。
以下にサンプルプログラムを示します。
#include <iostream> using namespace std; int main(){ cout << "HelloWorld!" << endl; //HelloWorld cout << 'a' << endl; //a cout << 3 << .14 << endl; //30.14(3.14にはならない) cout << 3. << 14 << endl; //314 (3.14や3.014にはならない) return 0; }
コメントアウトは実行結果を示しています。
エスケープシーケンス
最後にエスケープシーケンスについてです。
エスケープシーケンスとは改行やバックスペースなどを示す文字のことで、先頭にバックスラッシュを使って記述します。
詳しくは別の記事で紹介しますが、覚えておいたらいいかなというものを以下に紹介します。
- 「\n」:改行する
- 「\t」:タブ
- 「\’」:引用符
- 「\”」:二重引用符
- 「\?」:クエスチョンマーク
#include <iostream> using namespace std; int main(){ cout << "Hello\tWorld!\n" //Hello World!(間の空間はタブ) << "\"HelloWorld!\"\?" //"HelloWorld"? << endl; return 0; }
コメントアウトは実行結果を示しています。
演習問題
最後にいくつか演習問題を解いてもらいます。
全ての問題がこの記事に書いてあることを使えば解答可能になっているので、できれば何も見ずに自分の力だけで解けることが好ましいです。
また、数字については整数リテラルもしくは浮動小数点リテラルを用いてください。
演習問題1
名前空間「std」にusingディレクティブを適応せずに、ディスプレイ画面に自分の名前を表示するプログラムを作成せよ。
演習問題2
名前空間「std」にusingディレクティブを適応して、ディスプレイ画面に「誕生日は○月○日です」(○は数字を挿入すること)と表示するプログラムを作成せよ。
演習問題3
名前空間「std」にusingディレクティブを適応して、ディスプレイ画面に「10/3=0.333」と表示するプログラムを作成せよ。尚、「0.333」については整数部を省略してプログラムを作成すること。
演習問題4
名前空間「std」にusingディレクティブを適応せずに、ディスプレイ画面に以下のように表示するプログラムを作成せよ。尚、途中の改行にはエスケープシーケンスを用いよ。
標準出力の'基礎'は 99.99% マスターしました!
演習問題1解答
#include <iostream> int main(){ std::cout << "けーとら"<< std::endl; return 0; }
演習問題2解答
#include <iostream> using namespace std; int main(){ cout << "誕生日は" << 4 << "月" << 1 << "日です" << endl; return 0; }
演習問題3解答
#include <iostream> using namespace std; int main(){ cout << 10 << '/' << 3 << '=' << .333 << endl; return 0; }
演習問題4解答
#include <iostream> int main(){ std::cout << "標準出力の\'基礎\'は\n" << 99.99 << "%\tマスターしました!" << std::endl; return 0; }
最後に
さて今回は標準出力の基礎について書いてきましたが、如何だったでしょうか?
C++を覚えていく上でも基礎中の基礎なので、しっかりと理解してもらいたい部分ですので、もしもわからないことがあればコメントにてお待ちしております。
また、詳しく知りたいようなことがあったりしたら別の記事を用意させてもらうので、そちらの方も是非コメントをお願いします。
最後まで読んでいただき、ありがとうございました。
次の記事でお待ちしています!
コメント