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)同じ「Hello World」を、C と C++ それぞれの流儀で書いたものを並べます。機能は同じでも、文法と意図が微妙に異なることに注目してください。
%d / %s のような書式指定子を書かなくてよく、型の取り違えによるバグ(例: int に %s を使って落ちる)がコンパイル時に防げるのが利点です。
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::cout に x を流し込む」と読みます。複数の値を連続して流すこともでき、左から順に出力されます。
int main()C の int main(void) に相当します。C++ では void を省略して int main() と書くのが一般的です。C++ では main の return 0; も省略できますが、明示したほうが読み手にやさしいので本サイトでは書きます。
std::endl と \n の違いC++ で改行を出力するときの書き方は 2 通りあります。多くの入門書は std::endl を使いますが、実は "\n" が推奨されます。
両者の違いは「バッファを flush(強制書き出し)するかどうか」。std::endl は改行を出したあとに flush を行うため、ループ内で大量に呼ぶと出力が数倍遅くなることがあります。一方 "\n" は改行だけで flush しません(バッファがいっぱいになるか、プログラム終了時に自動で flush されます)。
"\n" を使い、即座に画面に出してほしい場面(デバッグ出力、プログレス表示、プロンプトの手前など)でだけ std::endl を使うのが現代の流儀です。
C で gcc を使っていた場面で、C++ では g++(または clang++)を使います。本サイトは C++17 を基準にするので、-std=c++17 を明示する習慣を付けましょう。
各オプションの意味:
-std=c++17 … 使用する規格を指定。c++20, c++23 も指定可-Wall -Wextra … 警告を多めに出す(バグ予防の定番セット)-o hello … 出力ファイル名(省略すると a.out)clang++ -std=c++17 -Wall hello.cpp -o hello。macOS の g++ は実体が clang++ のことが多いので、どちらを使っても結果は大差ありません。
「小数点以下 2 桁」「幅 8 桁で右寄せ」など、書式を指定した出力も可能です。C の %6.2f のような書式指定子の代わりに、マニピュレータと呼ばれる関数を << で流し込みます。
C++ 側は一見冗長に見えますが、型ごとに意味が明確で、書式指定子の取り違えによるバグが起きません。C++20 からは std::format(printf 風の書式を型安全に使える)、C++23 では std::print が追加され、好みで選べるようになっています。
<< 直書きを使い、書式が複雑になる場面でのみ std::format(C++20)を紹介します。旧来の printf も C ライブラリとして引き続き使えますが、型安全性のメリットを生かすために C++ では std::cout を推奨します。
using namespace std; は書くべきか多くの入門書が冒頭に using namespace std; と書き、以降 std:: を省略させる教え方をしますが、実務や本格的なコードでは避けるべき書き方とされています。
理由は std 名前空間にある識別子(count, distance, size など)が、自作関数や他のライブラリの同名シンボルと衝突するリスクがあるためです。特にヘッダファイル内では絶対に書いてはいけません(その .h を #include したすべてのファイルに影響する)。
using std::cout;(using 宣言)や、関数スコープに限って using namespace std; を書く方法もあります。本サイトでは、学習者が「どれが標準ライブラリか」を常に意識できるよう、基本的に毎回 std:: を付けて書きます。
ここまでの理解を 3 問で確認してみましょう。
std::endl と "\n" の違いとして正しいものは?std::endl は改行 + バッファ flush、"\n" は改行のみ"\n" は改行後に flush し、std::endl は flush しないstd::endl は Windows、"\n" は Unix 専用std::endl は改行を出したあとバッファを flush します。ループ内で多用すると出力が遅くなるため、通常は "\n" を使い、即座に表示したい場面のみ std::endl を使うのが現代の流儀です。using namespace std; が実務で推奨されない主な理由は?