【C/C++】ループ・条件文なしで1から1000まで表示する方法
はじめに
この記事では、C/C++においてループ(for文、while文など)や条件分岐(if文など)を一切使わずに、1から1000までの数値を表示する方法を解説します。
ループが使えないとなると、真っ先に思いつくのは再帰関数ですが、この問題では条件文も禁止されているため、再帰の終了条件(ベースケース)を設けることができません。そこで、まったく異なるアプローチが必要になります。
解決策:静的メンバーとコンストラクタを活用する
ここでは、クラスの静的メンバー変数(staticメンバー)とコンストラクタを組み合わせることで、この問題をエレガントに解決します。基本的な仕組みは以下の通りです。
- 静的メンバー変数を1で初期化する
- コンストラクタ内で現在の値を表示し、その値を1つ増やす(インクリメント)
- サイズ1000のオブジェクト配列を作成することで、コンストラクタが1000回呼び出される
オブジェクトが生成されるたびにコンストラクタが自動的に実行されるため、その回数分だけ数値が出力され、結果として1から1000までが表示されるという仕組みです。
サンプルコード
#include<iostream>
using namespace std;
class PrintN {
public:
static int value;
PrintN() {
cout << value++ << ", ";
}
};
int PrintN::value = 1; // 1で初期化
main() {
int N = 1000;
PrintN obj[N]; // サイズ1000の配列を作成し、1000個のオブジェクトを生成
}実行結果
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, .... 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000,
コードのポイント
- static int value:すべてのオブジェクト間で共有される静的メンバー変数で、初期値は1に設定されています。
- cout << value++:後置インクリメントにより、現在の値を出力した後に値が1増加します。
- PrintN obj[N]:配列の宣言時に各要素に対してデフォルトコンストラクタが自動的に呼び出されます。
注意点
可変長配列(VLA)は標準C++では正式にサポートされていないため、厳密には N を const 定数や #define マクロで定義するか、new PrintN[1000] のように動的確保を利用すると、より移植性の高いコードになります。また、main関数の戻り値は int 型と明示することが推奨されます。
まとめ
一見不可能に思える「ループも条件文も使わない繰り返し処理」も、「オブジェクト生成時にコンストラクタが必ず実行される」というC++の言語仕様を利用すれば実現できます。静的メンバー変数で状態を共有しながら、オブジェクト配列の生成だけで反復を実現している点が、このテクニックの面白さであり、C++の柔軟性を感じさせる好例といえるでしょう。
-
C++の範囲ベースforループ(Range-based for)を徹底解説!構文から実例まで
範囲ベースforループ(range-based for loop)は、C++11で標準に追加された機能で、従来のforループをより簡潔に記述できる形式です。コンテナ内の要素を先頭から末尾まで順番に処理する際に活躍します。本記事では、その構文や使い方、メリット・デメリット、具体的なコード例まで詳しく解説します。 基本構文 for( range-declaration : range-expression ) loop statement range-declaration(範囲宣言) ― range-expressionの要素と同じ型の変数宣言です。通常はautoキーワードを使うことで、要素の型
-
C/C++で実装するバークレーアルゴリズム――分散システムの時刻同期を徹底解説
バークレーアルゴリズムとは バークレーアルゴリズム(Berkeleys Algorithm)は、分散システムにおいて各ノードの時計を同期させるために用いられるアルゴリズムです。特に、以下のような状況にあるシステムで有効とされています。 マシンに正確な時刻源が存在しない場合 ネットワークやマシンにUTCサーバーが用意されていない場合 分散システムとは、物理的に離れた場所に配置された複数のノードが、ネットワークを介して相互に接続されたシステムのことを指します。各ノードの時計は独立して動作しているため、誤差が生じやすく、何らかの同期機構が必要になります。 バークレーアルゴリズムの仕組み このア