C++ Learning

第2回 Hello World と iostream

C++ で最初のプログラムを書きます。printf ではなく std::cout を使う流儀、<< 演算子の読み方、std::endl\n の違い、g++ でのコンパイルと実行までを、C と対比しながら押さえます。

このページで押さえること
✅ 最低限ここだけ覚える
  • #include <iostream> で入出力を読み込む
  • std::cout << "..." << std::endl; で出力
  • コンパイルは g++ -std=c++17 hello.cpp -o hello
  • 拡張子は .cpp.cxx / .cc も可)
⭐ 余裕があれば読む
  • std::endl"\n" の違い(flush の有無)
  • << 演算子のオーバーロードの正体
  • using namespace std; を使わない理由
  • 書式出力(std::setw, std::setprecision

1. C と C++ で書き比べる

同じ「Hello World」を、C と C++ それぞれの流儀で書いたものを並べます。機能は同じでも、文法と意図が微妙に異なることに注目してください。

hello.c C
#include <stdio.h> int main(void) { printf("Hello, %s! n=%d\n", "World", 42); return 0; }
書式指定子 %s / %d が必要
hello.cpp C++
#include <iostream> int main() { std::cout << "Hello, " << "World" << "! n=" << 42 << "\n"; return 0; }
書式指定子 不要/型安全
どちらも出力は同じ:
Hello, World! n=42
違いは「どう書くか」。C++ 側は %d / %s のような書式指定子を書かなくてよく、型の取り違えによるバグ(例: int に %s を使って落ちる)がコンパイル時に防げるのが利点です。

2. コードを読み解く

C++ 側のコードを 1 行ずつ見ていきます。C と共通の構造(main 関数、return 0;)は省略し、C++ で新しく登場する要素だけを取り上げます。

#include <iostream>

標準入出力ストリームを使うためのヘッダ。C での <stdio.h> に相当します。.h が付かない新しい記法で、C++ の標準ヘッダはすべてこの形です(<vector>, <string>, <algorithm> など)。

std::cout

標準出力ストリームを表すオブジェクト。std は「standard」の略で、C++ 標準ライブラリの名前空間です。std::cin(入力)、std::cerr(エラー出力)もよく使います。

名前空間を毎回書くのが冗長だからといって、using namespace std; を安易に書くのは推奨されません。理由は後の第 6 節で説明します。

<< 演算子

ストリーム挿入演算子と呼ばれます。std::cout << x は「std::coutx を流し込む」と読みます。複数の値を連続して流すこともでき、左から順に出力されます

<< の正体: 実はこれは C++ の演算子オーバーロードの一例で、「左シフト演算子」を出力用に再定義したもの。詳細は第 21 回(演算子オーバーロード)で扱いますが、いまは「C++ の出力はこう書く」と覚えておけば十分です。

int main()

C の int main(void) に相当します。C++ では void を省略して int main() と書くのが一般的です。C++ では main の return 0; も省略できますが、明示したほうが読み手にやさしいので本サイトでは書きます。

3. std::endl\n の違い

C++ で改行を出力するときの書き方は 2 通りあります。多くの入門書は std::endl を使いますが、実は "\n" が推奨されます。

endl を使う遅い場合あり
std::cout << "hello" << std::endl;
改行 + バッファを flush
"\n" を使う推奨
std::cout << "hello\n";
改行のみ(高速

両者の違いは「バッファを flush(強制書き出し)するかどうか」。std::endl は改行を出したあとに flush を行うため、ループ内で大量に呼ぶと出力が数倍遅くなることがあります。一方 "\n" は改行だけで flush しません(バッファがいっぱいになるか、プログラム終了時に自動で flush されます)。

使い分け: 通常は "\n" を使い、即座に画面に出してほしい場面(デバッグ出力、プログレス表示、プロンプトの手前など)でだけ std::endl を使うのが現代の流儀です。

4. コンパイルと実行

C で gcc を使っていた場面で、C++ では g++(または clang++)を使います。本サイトは C++17 を基準にするので、-std=c++17 を明示する習慣を付けましょう。

$ g++ -std=c++17 -Wall -Wextra hello.cpp -o hello $ ./hello Hello, World! n=42

各オプションの意味:

clang++ でも同じ: clang++ -std=c++17 -Wall hello.cpp -o hello。macOS の g++ は実体が clang++ のことが多いので、どちらを使っても結果は大差ありません。
余裕があれば読む ― ここから先は応用
最低限はここまで(書き比べ/コード読解/endl と \n の違い/コンパイル)。残りは細かい話なので、急ぎなら次章に進んで OK。

5. 書式付き出力

「小数点以下 2 桁」「幅 8 桁で右寄せ」など、書式を指定した出力も可能です。C の %6.2f のような書式指定子の代わりに、マニピュレータと呼ばれる関数を << で流し込みます。

C(printf)C
#include <stdio.h> printf("%8.2f\n", 3.14159); // 出力: 3.14
C++(iomanip)C++
#include <iostream> #include <iomanip> std::cout << std::setw(8) << std::fixed << std::setprecision(2) << 3.14159 << "\n";

C++ 側は一見冗長に見えますが、型ごとに意味が明確で、書式指定子の取り違えによるバグが起きません。C++20 からは std::formatprintf 風の書式を型安全に使える)、C++23 では std::print が追加され、好みで選べるようになっています。

本サイトの方針: 基本は << 直書きを使い、書式が複雑になる場面でのみ std::format(C++20)を紹介します。旧来の printf も C ライブラリとして引き続き使えますが、型安全性のメリットを生かすために C++ では std::cout を推奨します。

6. using namespace std; は書くべきか

多くの入門書が冒頭に using namespace std; と書き、以降 std:: を省略させる教え方をしますが、実務や本格的なコードでは避けるべき書き方とされています。

using namespace std;入門書流儀
#include <iostream> using namespace std; int main() { cout << "hello\n"; }
名前空間汚染のリスク
毎回 std:: を書く本サイト採用
#include <iostream> int main() { std::cout << "hello\n"; }
出典が明確

理由は std 名前空間にある識別子(count, distance, size など)が、自作関数や他のライブラリの同名シンボルと衝突するリスクがあるためです。特にヘッダファイル内では絶対に書いてはいけません(その .h を #include したすべてのファイルに影響する)。

妥協案として: 特定の名前だけを取り込む using std::cout;(using 宣言)や、関数スコープに限って using namespace std; を書く方法もあります。本サイトでは、学習者が「どれが標準ライブラリか」を常に意識できるよう、基本的に毎回 std:: を付けて書きます。
広告スペース

確認クイズ

ここまでの理解を 3 問で確認してみましょう。

Q1. C++ で標準出力に書き込むために必要なヘッダはどれ?

<stdio.h>
<iostream>
<cstdio>
<iomanip>
<iostream> が std::cout / std::cin / std::cerr を提供します。<cstdio> は C の printf を C++ から使うためのヘッダ、<iomanip> は setw / setprecision などの書式マニピュレータ用です。

Q2. std::endl"\n" の違いとして正しいものは?

どちらも全く同じ動作で、好きな方を使ってよい
std::endl は改行 + バッファ flush、"\n" は改行のみ
"\n" は改行後に flush し、std::endl は flush しない
std::endl は Windows、"\n" は Unix 専用
std::endl は改行を出したあとバッファを flush します。ループ内で多用すると出力が遅くなるため、通常は "\n" を使い、即座に表示したい場面のみ std::endl を使うのが現代の流儀です。

Q3. using namespace std; が実務で推奨されない主な理由は?

コンパイルが遅くなるため
標準ライブラリの識別子が自作関数や他ライブラリと衝突するリスクがあるため
C++ の規格で禁止されているため
実行時オーバーヘッドが発生するため
std 名前空間には count / distance / size など一般的な名前が多く存在するため、自作のコードや他ライブラリの同名シンボルと衝突する危険があります。特にヘッダファイル内に書くと、そのヘッダを include したすべてのファイルに影響するため厳禁です。
この記事をシェア