忍者ブログ
IT関係の小作人労働の日々の日記です。 最近データベースが好きです。 インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。 何でもできそうで、何にもできない。

【C言語入門】コメントを使いこなす:ソースコードに「メモ」を残す2つの方法


プログラムを読みやすくしたり、一時的に特定の処理を無効化(コメントアウト)したりするために欠かせないのが「コメント」です。実はC言語には2種類の書き方があり、それぞれ使えるようになった「時代(規格)」が異なります。

1. 実践:2種類のコメントを書いてみる

【 手を動かして確認 】 新しく `comment.c` を作成し、以下のコードをコンパイルしてみてください。コメント部分はコンパイラに無視されるため、実行結果には影響しません。

#include <stdio.h>

int main(void) {
    /* これは「複数行」コメントです。
       昔から使われている伝統的な書き方です */
    printf("Hello with Comments!\n");

    // これは「1行」コメントです。現代の主流です。
    return 0;
}

2. 伝統的な書き方:/* 文字列 */

【 ここがエンジニアの視点 】 最初期のC言語(旧規格)から存在する書き方です。記号で囲った範囲すべてがコメントになるため、長い解説を書くのに適しています。ただし、`/* ... /* ... */ */` のように入れ子(ネスト)にすることはできません。最初の `*/` が現れた時点でコメント終了とみなされ、エラーの原因になります。

3. 現代的な書き方:// 文字列

【 ここが仕組みのキモ 】 行の途中に `//` を書くと、その行の末尾までがコメントになります。実はこれ、もともとはC++という別の言語の機能でしたが、C99規格(1999年)から正式にC言語でも使えるようになりました。今のMac(C17/C11)環境であれば、何の問題もなく使用可能です。

4. 個人的な見解:なぜ「//」を優先して使うのか

【 ここがこだわり 】 2つの書き方がありますが、個人的には「//」をメインで使うようにしています。その理由は、圧倒的に「コードの修正(デバッグ)がしやすいから」です。

修正のしやすさ(メンテナンス性)
・`/* */` は、開始と終了の両方の記号を意識しなければならず、範囲を広げたり縮めたりする際に手間がかかります。
・一方 `//` は、行の先頭に付ける・外すだけの単純作業で済みます。最近のエディタ(VS Codeなど)のショートカット機能とも相性が良く、直感的にコメントアウト・解除を切り替えられるのがメリットです。

古いソースコードの保守でどうしても必要な場合を除き、普段の学習や開発では `//` だけで統一したほうが、作業効率は格段に上がると感じています。

5. 理解度チェック!練習問題

【 チャレンジ 】 C言語のコメントに関する説明として、**間違っているもの**はどれでしょうか?

選択肢:
A. `/* */` は複数行を囲むことができる。
B. `//` は行の末尾までをコメントにする。
C. `//` 形式は、最初期のC言語(C89)でも標準で使えた。
D. コメントアウトを活用すると、特定の手続きを一時的に無効化できる。

正解と解説を見る

正解:C

`//` 形式がC言語の標準規格(C99)に採用されたのは1999年です。それより前の非常に古い規格では、`/* */` しか認められていませんでした。現在のMac環境(C17など)では気にせず使ってOKです。

6. まとめ:やってみて分かったこと

「なぜ2種類あるのか?」という疑問を深掘りすると、C言語が歩んできた進化の歴史に突き当たります。個人的にはメンテナンス性を重視して `//` を推奨しますが、両方の特徴を知っておくことで、他人が書いたコードを読む際にも戸惑わずに済みます。自分なりの「書き方のルール」を持って、楽しくコードを書いていきましょう。

PR

【C言語入門】Macターミナルで解き明かす:コンパイラ「Clang」とC言語規格(C11/C17)の深い関係


ターミナルで `clang` と打ち込んでコンパイルしているとき、裏側では一体何が起きているのでしょうか。今回は、ツールとしてのコンパイラと、言語のルールである「規格」の関係、そして自分の環境の正体を暴く方法まで、まとめて解説します。

1. 料理人とレシピの関係:ClangとC言語規格

【 ここがポイント 】 C言語の学習において、コンパイラと規格は「料理人とレシピ」の関係に似ています。この違いを理解すると、エラーの原因や書き方のマナーがより鮮明に見えてきます。

Clang(料理人)
・Mac標準のコンパイラ。ソースコードを読み、CPUが実行できる形に翻訳する「実務担当」です。

C言語規格(レシピ)
・「C11」や「C17」といった、言語の書き方の公式ルールです。時代に合わせて更新されます。

2. C言語の主な規格(C99 / C11 / C17)

【 ここがポイント 】 C言語は1970年代に誕生しましたが、今も進化し続けています。特に重要なのが以下の3つです。

C99:1999年制定。変数の宣言をコードの途中で書けるようになるなど、便利になった世代。
C11:2011年制定。より高度な処理(並列処理など)への対応が強化されました。
C17:2018年制定。C11のバグ修正が中心の、現在最も「標準」として使われる安定したルール。

3. 実践:自分のMacの「デフォルト規格」を調べる

【 ターミナルの動き 】 自分のMacのコンパイラが、普段どの時代のレシピ(規格)を基準にしているかを確認してみましょう。`--version` よりもさらに深い情報を引き出すコマンドを使います。

# コンパイラの内蔵設定からバージョン情報を抽出する
% clang -dM -E -x c /dev/null | grep __STDC_VERSION__

[ 実行結果の例 ]
#define __STDC_VERSION__ 201710L

【 結果の読み方 】 この数値は、その規格が策定された年月(あるいはバージョン番号)を示しています。

201710LC17(最新のMacでの標準設定)
201112LC11
199901LC99

4. 応用:あえて規格を指定してビルドする

【 ターミナルの動き 】 特定のルールで厳格にチェックしたいときは、コンパイル時に `-std` オプションを付けます。

# C11のルールに従ってコンパイルする場合
clang -std=c11 hello.c -o hello

5. 理解度チェック!練習問題

【 チャレンジ 】 今回学んだ内容の復習です。コンパイル時に、特定のC言語規格(例:C11)に準拠させるための正しい指定方法はどれでしょうか?

# 記述例:
clang 【 空欄 】 hello.c -o hello

選択肢:
A. -ver=c11
B. -mode=c11
C. -std=c11
D. -rule=c11

正解と解説を見る

正解:C. -std=c11

「Standard(規格)」を意味する -std オプションを使います。これによって、コンパイラという「料理人」にどの「レシピ」を使うかを明示的に指示できます。

6. まとめ:やってみて分かったこと

単に「プログラムを動かす」だけでなく、背後にある「Clang」というツールの特性や、「C17(201710L)」という準拠規格を知ることで、自分が今どの時代の技術を使っているのかが鮮明になりました。この「環境への理解」こそが、トラブルに強いエンジニアへの第一歩です。

【C言語入門】printfマスター:計算結果を表示する「書式指定子」の役割


前回の「Hello World」に続き、今回はコンピュータの本領である「計算」の結果を表示させてみます。C言語で数値を扱う際に避けて通れないのが、printf関数の書式指定(フォーマット)という仕組みです。

1. 実践:計算結果を表示するプログラム

【 手を動かして確認 】 新しく `calc.c` というファイルを作成し、以下のコードを記述します。ただの文字列ではなく、実行時に計算が行われ、その結果が画面に表示されます。

#include <stdio.h>

int main(void) {
    // 「%d」という穴に、1+1の結果を流し込む
    printf("計算結果は %d です\n", 1 + 1);
    return 0;
}

2. コンパイルと実行結果

【 ターミナルの動き 】 ターミナルでビルドして実行します。プログラムの中に「2」という数字は書いていませんが、実行時に計算された結果が出力されることを確認してください。

% clang calc.c -o calc
% ./calc
計算結果は 2 です

3. 【重要解説】printfの「書式指定子」とは?

【 ここが仕組みのキモ 】 printfの「f」は **formatted(書式化された)** の略。単に表示するだけでなく、データをどのような形式で表示するかを指定できるのが最大の特徴です。ここで使った **`%d`** は、その中核となる「データの予約席」の役割を果たします。

%d の正体
役割:10進数の整数(Decimal)を表示するための「型抜き」のようなもの。
対応関係:カンマの後に書いた「1 + 1」という計算結果が、この `%d` の場所に自動的に流し込まれます。

なぜ直接数字を書かないのか?
実際の開発では、計算の内容が複雑になったり、ユーザーの入力によって値が変化したりします。「ここは整数の場所」と事前に決めておくことで、どんな値が来ても正しく表示できる柔軟性が生まれます。

4. 応用:書式とデータの対応ルール

【 ミスを防ぐ視点 】 printfの中に複数の `%d` を置くことも可能です。その場合、左から順番にデータが割り当てられます。この「左からの順番」を意識することが、表示バグを防ぐ基本です。

// 2つの穴に、順番に値を流し込む
printf("%d と %d を足すと %d です\n", 10, 20, 10 + 20);

[ 出力イメージ ]
10 と 20 を足すと 30 です

5. 理解度チェック!練習問題

【 チャレンジ 】 今回学んだ内容を復習しましょう。以下のプログラムの【空欄】に入る正しいコードはどれでしょうか?

#include <stdio.h>

int main(void) {
    // 「3 × 3 = 9」と表示させたい
    printf("3 * 3 = 【 空欄 】\n", 3 * 3);
    return 0;
}

選択肢:
A. %s
B. %d
C. %f
D. &d

正解と解説を見る

正解:B. %d

計算結果(9)は整数なので、Decimal(10進数)を意味する「%d」を使用するのが正解です。%sは文字列、%fは小数を表示する際に使用します。

【C言語入門】Macターミナルで始めるC言語:Xcodeを使わずにClangで「Hello World」を動かす最短ルート


プログラミングの原点とも言えるC言語。Mac(Apple Silicon)環境には、標準で高性能なコンパイラ「Clang」が備わっています。今回は、重厚なGUIを持つXcodeはあえて使わず、ターミナルだけでコードを書き、ビルドして実行するまでの「一連の儀式」を、実際の動作環境に基づいて解説します。

1. 開発環境の確認:Apple Clang (arm64)

【 手を動かして確認 】 まずは、自分のMacに武器が備わっているか確認します。現在のMac(M1/M2/M3/M4チップ)では、アーキテクチャが「arm64」となっているのが特徴です。ターミナルで以下の結果が返ってくれば、準備は万端です。

% clang --version
Apple clang version 17.0.0 (clang-1700.0.13.5)
Target: arm64-apple-darwin24.6.0
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

※ `Target: arm64` は、Apple Siliconに最適化されたバイナリを生成することを示しています。

2. 作業ディレクトリの作成

【 実践のポイント 】 学習用のコードが散らからないよう、専用のディレクトリ(フォルダ)を用意します。こうした小さな整理整頓が、後のデバッグ効率を左右します。

# デスクトップに学習用フォルダを作成して移動
mkdir -p ~/Desktop/c-study && cd ~/Desktop/c-study

# 現在のディレクトリを確認
pwd

3. ソースコードの記述:hello.c

【 ここがエンジニアの視点 】 テキストエディタを開き、以下のコードを入力して `hello.c` という名前で保存します。C言語の最も基本的な構成要素(標準入出力のインクルードと、main関数)のみを記述します。

#include <stdio.h>

int main(void) {
    printf("Hello, World!\n");
    return 0;
}

4. コンパイルの実行(ビルド)

【 ターミナルの動き 】 書いたばかりのテキスト(ソースコード)を、arm64アーキテクチャが理解できる実行ファイルへ変換します。`-o` オプションで、出力ファイル名を指定するのがMac流のスマートなやり方です。

# hello.c を元に、実行ファイル hello を生成
clang hello.c -o hello

# 実行ファイルができたか確認(lsコマンド)
ls -F
→ hello* と表示されればビルド成功です。

5. プログラムの実行

【 実行時の注意点 】 いよいよ実行です。カレントディレクトリにあるファイルを明示的に指定するため、頭に `./` を付けて実行ファイルを叩きます。

# 実行
./hello

[ 出力結果 ]
Hello, World!

6. 【重要解説】なぜ `InstalledDir` がそこにあるのか?

【 ここが仕組みのキモ 】 先ほどのバージョン確認で表示された `InstalledDir: /Library/Developer/CommandLineTools/...` というパス。これは、Macが「Xcode本体をインストールしなくても、開発に必要な最小限のツール(Command Line Tools)を個別に管理している場所」を指しています。

Clangが選ばれる理由
・Apple Silicon(arm64)への最適化が極めて優秀。
・エラーメッセージが親切で、初心者でも「どこでミスしたか」が分かりやすい。

arm64アーキテクチャの意識
今のMacで作った実行ファイルは、そのままでは古いIntel Mac(x86_64)では動きません。このように「どのCPU向けの実行ファイルを作るか」を意識することが、低レイヤを学ぶ醍醐味の一つです。

7. 理解度チェック!練習問題

【 チャレンジ 】 今回の手順を復習しましょう。Macのターミナルで、カレントディレクトリにある実行ファイル「hello」を起動するための正しいコマンドはどれでしょうか?

選択肢:
A. run hello
B. hello.exe
C. ./hello
D. clang hello

正解と解説を見る

正解:C. ./hello

セキュリティ上の理由から、ターミナルでは現在のディレクトリ(./)を明示的に指定して実行するルールになっています。clang hello と打つと、実行ではなく再コンパイルを試みようとしてエラーになるので注意しましょう。

8. まとめ:やってみて分かったこと

「コンパイル」という一見手間のかかるステップを踏むことで、テキストが「動くプログラム」に変わる瞬間を肌で感じることができました。IDE(統合開発環境)のボタン一つで実行するのも便利ですが、ターミナルで `clang` コマンドを直接叩く経験は、パスの概念やコンパイルプロセスの理解を深め、エンジニアとしての基礎体力を確実に底上げしてくれます。