Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】A love letter made with C language

2025年09月18日に「Dev.to」が公開したITニュース「A love letter made with C language」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

C言語で書かれたラブレターが公開。プログラミングの構文や用語(変数、関数、ループなど)を使い、愛のメッセージを表現するユニークなコードだ。C言語の要素で相手への褒め言葉や誓いを綴り、初心者にプログラミングの面白さを伝える。

出典: A love letter made with C language | Dev.to公開日:

ITニュース解説

このニュース記事は、C言語を使って書かれたユニークなラブレターのソースコードを紹介している。システムエンジニアを目指す初心者にとって、このコードはC言語の基本的な要素から応用的な概念まで、実践的な学習の良い題材となるだろう。

プログラムの冒頭にある「/* ... */」で囲まれた部分はコメントであり、人間がコードを理解しやすくするための説明だ。コンパイラはこの部分を無視する。続く「#include <stdio.h>」のような行は、プログラムが動作するために必要な機能を外部から取り込む指示で、これらはヘッダーファイルと呼ばれる。<stdio.h>は標準入出力(画面への文字表示など)、<string.h>は文字列操作、<time.h>は時間に関する機能を提供する。プログラムの実行は「int main(void)」関数から始まる。C言語のプログラムは、通常main関数が終了し、「return 0;」が実行されることで正常に終了する。これは、プログラムが問題なく完了したことをオペレーティングシステムに伝える標準的な方法だ。

#define RECIPIENT "Yourname"」のような行は「前処理指令」で、コンパイルが始まる前にテキストの置き換えを行う。ここではRECIPIENTという名前を"Yourname"という文字列に置き換えるように指示している。これにより、プログラム中でRECIPIENTと書くだけでその値を利用でき、値の変更が必要な場合も一箇所を修正するだけで済むため、プログラムの保守性が高まる。HEARTFOREVERも同様に定義されており、特にFOREVERは無限ループを意味するfor(;;)というC言語のイディオムを読みやすくする。

プログラムでは、独自のデータ型も定義されている。「typedef enum { ... } Feeling;」はFeelingという新しい型を定義し、CALMBUTTERFLIESといった名前付き定数で感情の状態を表す。これにより、数値ではなく意味のある名前で状態を管理でき、コードの可読性が向上する。「typedef struct { ... } Promise;」はPromiseという構造体型を定義している。構造体は複数の異なるデータ型を一つにまとめることができる仕組みで、ここではvow(誓いの文字列)とpriority(優先度)を一つのPromiseとして扱っている。

このラブレターには、いくつかのカスタム関数が用意されている。「static void type_line(const char *s, unsigned delay_ms)」関数は、与えられた文字列をまるでタイプライターのように一文字ずつ遅延させて表示する。putcharで一文字ずつ出力し、fflush(stdout)で出力バッファを強制的に吐き出すことで、リアルタイムな表示を実現している。nanosleep関数は指定した時間だけプログラムの実行を一時停止させ、文字間の遅延を作り出す。print_border関数は指定した文字で罫線を表示し、feeling_to_string関数はFeeling型の値を対応する文字列に変換する。seal_with_kiss関数は特別なメッセージを表示する。これらの関数は、プログラムの各部分の役割を明確にし、再利用性を高める「モジュール化」の良い例だ。

main関数の中では、まず「const char *dear = RECIPIENT;」のように変数を宣言し、初期値を設定している。constキーワードは、変数の値が一度設定されたら変更されないことを示す。これは意図しないデータの変更を防ぐための安全策だ。「compliments」と「vows」はそれぞれ文字列の配列とPromise構造体の配列として定義されている。配列を使うことで、複数の似たようなデータを効率的に管理できる。sizeof演算子を使って配列の要素数を計算しているのは、プログラムの柔軟性を高めるテクニックだ。

日付と時刻の表示には「time_t now = time(NULL);」で現在の時刻を取得し、「strftime」関数で「%B %d, %Y」のような書式指定子を使って、「月 日, 年」形式の文字列に変換している。これは、ユーザーに読みやすい形式で情報を提示する一般的な方法だ。

メイン関数の実行では、まずprint_borderで罫線を表示し、printf関数で「Dear Yourname,」などのメッセージを出力する。type_line関数を使って、メッセージに特別な演出を加える。次に、褒め言葉の配列complimentsforループで一つずつ取り出し、ハートマークと共に表示している。ループ処理は、同じような処理を繰り返し行いたい場合に非常に有効な手段だ。

約束の表示では、さらに一工夫されている。「Promises (sorted by priority):」と表示された後、vows配列が優先度priorityの高い順に並べ替えられている。これは「選択ソート」と呼ばれるシンプルなソートアルゴリズムで実現されている。内側のループで残りの要素の中から最大の優先度を持つ要素を探し、外側のループでその要素を現在の位置と交換するという手順を踏む。これにより、約束が重要度順に整理されて表示される。ソート処理は、データを特定の順序で並べるための基本的なアルゴリズムの一つだ。

プログラムの最後の方では、C言語特有のキーワードや概念を使って、さらに遊び心のあるメッセージが表現されている。「const int distance = 0;」は距離が常にゼロであることを示し、「volatile long heartbeat = 0;」のvolatileキーワードは、コンパイラに対してこの変数が予期せぬ外部要因によって変更される可能性があるため、最適化を抑制し、常にメモリから値を読み書きするように指示する。これは通常、ハードウェアレジスタの操作などで使われるが、ここでは「心臓の鼓動が常に変動する」という詩的な表現に利用されている。無限ループFOREVER { ++heartbeat; ... }の中でheartbeatを増やすことで、永遠に続く愛情を表現している。「if (heartbeat < 0) break; // impossible, like loving you less」という条件は、long型のオーバーフローが起こらない限り実行されない、つまり愛情が減ることがないという冗談交じりの表現だ。

If love were undefined behavior, I’d still risk it for you.」という行は、C言語の「未定義動作(undefined behavior)」という概念に触れている。未定義動作は、プログラムが特定の操作を行ったときに、C言語の標準で結果が保証されない状態を指す。これは通常、プログラマが避けるべきものだが、ここでは「愛のためならどんなリスクも冒す」という強い意思を表す詩的な表現として使われている。また、「If life tries to optimize us away, we’ll add 'volatile' and stay.」は、先ほどのvolatileキーワードを人生の困難に重ね合わせ、困難を乗り越える決意を示している。

最終的に、プログラムは「love( Yourname ) == true;」というメッセージと、seal_with_kiss関数による締めくくりのメッセージを表示し、print_borderで最後の罫線を描いて、return 0;で正常終了する。P.S.のメッセージ「this letter is portable across all platforms as long as Yourname is defined.」は、このラブレターの「移植性」についてユーモラスに言及している。C言語のプログラムは一般的にOSやハードウェアに依存しない高い移植性を持つが、ここでは「Yournameが存在する限り、この愛はどこでも通用する」という温かいメッセージに変換されている。

このC言語のラブレターは、単なるコードの集合体ではなく、プログラミングの基礎から、データ構造、アルゴリズム、そしてC言語特有の深い概念までを学ぶことができる、非常に示唆に富む教材だ。初心者は、このコードを通してC言語が単なる命令の羅列ではなく、創造的で表現力豊かなツールであることを実感できるだろう。

関連コンテンツ

関連IT用語