-
CとC++における文字リテラルの型の違い
CとC++における文字リテラルの型の違い C++では、文字定数(文字リテラル)の型はchar型として扱われます。一方、C言語では文字定数は整数型(int型)として扱われるという重要な違いがあります。 そのため、32ビットアーキテクチャの環境では、C言語において sizeof(a) の結果は4となり、CHAR_BIT(char型1バイトあたりのビット数)は8です。ただし、sizeof(char) が1バイトである点は、CでもC++でも共通しています。 C言語の場合 #include<stdio.h> main() { printf("%d&quo
-
C言語とC++の構造体の違いを徹底解説
本記事では、C言語の構造体とC++の構造体の違いについて詳しく解説します。C++の構造体は、C++のクラスとほぼ同じ性質を持っています。大きな違いのひとつとして、C言語の構造体ではすべてのメンバーがpublic(公開)であるのに対し、C++の構造体ではデフォルトでprivate(非公開)になる点が挙げられます。その他の違いについても、以下の表にまとめてご紹介します。C構造体とC++構造体の比較表C言語の構造体C++の構造体構造体内にメンバー関数を定義することはできません。メンバー変数に加えて、メンバー関数も定義できます。構造体のデータメンバーを宣言時に直接初期化することはできません。構造体のデ
-
C++とJavaにおけるforeachループ(拡張for文)の使い方を解説
foreachループとはC++とJavaには、foreachループ(拡張forループ)と呼ばれるもう一種類のループ構文が用意されています。これは従来のforループを簡略化・改良したもので、配列やコレクションといったコンテナ内のデータにアクセスするために使用されます。foreachループの最大の特徴は、初期化処理や終了条件、インクリメント処理を記述する必要がなく、配列の各要素に素早くアクセスできる点です。つまり、このループは「処理をn回繰り返す」ためのものではなく、「コンテナの各要素に対して何らかの処理を行う」ために使われます。それでは、C++とJavaでforeachループがどのように使われる
-
C言語のdifftime()ライブラリ関数の使い方を解説
この記事では、C言語標準ライブラリに含まれる difftime() 関数について解説します。difftime() は、2つの時刻値の差(経過秒数)を求めるために使用される関数です。difftime() は2つの time_t 型の時刻引数を受け取ります。第1引数には「終了時刻」、第2引数には「開始時刻」を指定し、戻り値として両者の差が double 型(秒単位)で返されます。なお、time1 が time2 より後の場合、結果は負の値になる点に注意してください。プロトタイプdouble difftime(time_t time1, time_t time2);サンプルコード以下は、処理開始時刻
-
C++のシグナル処理入門:signal()関数とraise()関数の使い方を徹底解説
シグナル(Signal)とは、オペレーティングシステム(OS)からプロセスへ送られる割り込み(インタラプト)のことで、プログラムを意図せず途中で強制終了させてしまうことがあります。UNIX、Linux、Mac OS X、Windowsなどの環境では、Ctrl+Cキーを押すことで割り込みを発生させることができます。 すべてのシグナルがプログラム側で捕捉できるわけではありませんが、以下の表に示すシグナルについては、プログラム内で捕捉し、シグナルの種類に応じた適切な処理を実行することが可能です。これらのシグナルは、C++のヘッダーファイル<csignal>で定義されています。 シグ
-
C++の各データ型が取れる値の範囲と最小値・最大値マクロ一覧
C++におけるデータ型の範囲とマクロ プログラミングでは、特定のデータ型が取り得る最小値や最大値を利用したい場面が少なくありません。しかし、これらの値をすべて暗記するのは非常に困難です。そこでC++では、各データ型の最小値・最大値を表すための定義済みマクロが標準で用意されています。 なお、unsigned(符号なし)型は最小値が必ず0になるため、最小値用のマクロは定義されていません。 主なデータ型の範囲と対応するマクロ一覧 データ型範囲最小値のマクロ最大値のマクロ char-128 ~ +127CHAR_MINCHAR_MAX signed char-128 ~ +127SCHAR_M
-
C++のstd::setでユーザー定義型を扱う方法
C++のSTLには、std::setという連想コンテナが用意されています。setは要素を常にソートされた順序で自動的に保持し、重複する値の登録を許さない特殊なデータ構造です。通常はintやstringなどの組み込み型を扱いますが、実は自分で定義したクラス(ユーザー定義型)も格納できます。本記事では、その具体的な方法を解説します。ユーザー定義型をsetに格納するには、そのクラスに対してoperator<(小なり演算子)をオーバーロードし、2つのオブジェクトを比較できるようにする必要があります。この比較演算子が定義されていない場合、setはオブジェクト同士の大小関係を判定できず、ソート済みの
-
C++におけるコンストラクタ委譲(委任)の基本と使い方
C++11以降では、コンストラクタ委譲(constructor delegation)という便利な機能が利用できます。これは、あるコンストラクタが同じクラスの別のコンストラクタを呼び出す仕組みのことで、初期化処理の重複をなくし、コードを簡潔に保つために役立ちます。従来のコードの課題まずは次のプログラムを見て、どのような問題があるのかを確認してみましょう。例#include <iostream> using namespace std; class MyClass { int a, b, c; public: &nbs
-
C++のfmax()関数とfmin()関数の使い方を徹底解説
この記事では、C++におけるfmax()およびfmin()関数の使い方について詳しく解説します。これらの関数は、cmathヘッダーファイルに定義されており、数値比較を簡単に行うための標準ライブラリ関数です。fmax()とfmin()の基本fmax()とfmin()は、それぞれ最大値と最小値を返す関数です。引数として指定できるのは、float、double、long double型の値で、2つの引数を受け取って比較を行います。また、引数の型が異なる場合(例えばfloatとdoubleを比較する場合など)でも、暗黙的に型変換(キャスト)が行われた上で適切な結果が返されるため、異なる浮動小数点型同士
-
C++のfdim()関数とは?使い方とサンプルコードを解説
この記事では、C++のfdim()関数について詳しく解説します。fdim()関数は、2つの引数の正の差を返すために使用される数学関数です。引数をそれぞれaとbとすると、a > bの場合はa - bを返し、それ以外の場合は0を返します。この関数は<cmath>ヘッダーで定義されており、差が負の値にならないようにしたい場合に便利です。例えば、2つの値を比較して差を求めたいが、負の値は0として扱いたいようなシーンで活用できます。使用例#include <cmath> #include <iostream> using namespace std; main(
-
C++のlrint()とllrint()関数の使い方を徹底解説
この記事では、C++で利用できる丸め処理用の関数である lrint() と llrint() について詳しく解説します。まずは lrint() 関数から見ていきましょう。 lrint()関数とは lrint() 関数は、引数として渡された小数値を、現在設定されている丸めモード(rounding mode)に従って整数値へ丸めるための関数です。丸めモードは fesetround() 関数を使って事前に指定できます。 fesetround() で指定できる主な丸め方向は以下のとおりです。 FE_DOWNWARD: 負の無限大方向へ丸める(切り下げ) FE_UPWARD: 正の無限大方向へ丸める
-
C++のcinの戻り値を活用して、個数が不定の入力を取得する方法
プログラムを作成していると、ユーザーから受け取る入力の個数が事前に分からないケースによく出会います。この記事では、C++の cin を使って、個数が不定の入力を効率的に読み取る方法を解説します。 基本的な考え方 最も単純なアプローチは、ループを回しながら特定の値(例えば -1 など)が入力されたら終了する方法です。しかし、これには「その値自体は有効な入力として扱えない」という制約が伴います。 そこで便利なのが、cin >> input の戻り値を利用する手法です。cin からの読み込みは、入力が数値として解釈できない場合に失敗するため、その結果を条件式に使えば、数値以外の文字が入
-
C/C++のlong型は本当に必要?サイズが環境によって異なる理由を解説
CおよびC++には、整数値を扱うためのデータ型としてshort、int、long、long longの4種類が用意されています。それぞれが占めるメモリ領域のサイズは異なり、さらにそのサイズはアーキテクチャやOS、コンパイラによって変化するという特徴を持っています。例えば、int型は環境によって4バイトになる場合もあれば、2バイトになる場合もあります。 クロスコンパイラとは何か こうしたサイズの違いを生む要因の一つが「クロスコンパイラ」の存在です。クロスコンパイラとは、現在実行中のプラットフォームとは別のプラットフォーム向けにコードをコンパイルできるコンパイラのことです。 そのため、まったく同
-
CおよびC++で64ビットgccを使って32ビットプログラムをコンパイルする方法
現在、多くのLinuxディストリビューションに付属するgccコンパイラは、デフォルトで64ビット版として提供されています。しかし開発の現場では、32ビット環境向けにコードをコンパイル・実行しなければならないケースも少なくありません。そのような場合に役立つのが、gccの「-m32」オプションです。 gccのターゲットアーキテクチャを確認する まず、現在使用しているgccコンパイラのターゲット環境を確認しましょう。ターミナルで以下のコマンドを実行します。 gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/
-
与えられた整数のすべての一意な分割(パーティション)を生成するC++プログラム
本記事では、正の整数 n を入力として受け取り、n を正の整数の和として表すすべての一意な分割(パーティション)を生成するC++プログラムを紹介します。「分割」とは、ある整数を複数の正の整数の組み合わせに分解する方法のことです。たとえば 4 であれば、「4」「3+1」「2+2」「2+1+1」「1+1+1+1」のように、要素の順序が異なるだけで構成が同じものは同一の分割として扱われます。このプログラムでは、重複のない形ですべての分割パターンを列挙します。 アルゴリズム 関数 displayAllUniqueParts(int m) の処理手順は以下のとおりです。 Begin function d
-
【C++】ランダムな辺の生成でランダムグラフを作成するプログラム
このプログラムでは、ランダムに決定した頂点数と辺数をもとに、無向のランダムグラフを生成します。時間計算量は O(v × e) です。ここで v は頂点の数、e は辺の数を表します。 アルゴリズム 開始 関数 GenRandomGraphs() を用意する。引数として辺の数「e」と頂点の数「v」を受け取る。 rand() 関数を使って、グラフの頂点と辺にランダムな値を割り当てる。 各頂点の接続先を、方向を区別せずに出力する。 次数(つながり)を持たない頂点には「孤立頂点」と表示する。 終了 C++による実装例 #include<iostream> #inc
-
C++のDFS(深さ優先探索)でグラフが2部グラフかどうかを判定する方法
2部グラフとは 2部グラフ(Bipartite Graph)とは、グラフのすべての頂点をちょうど2つの色で塗り分けられるグラフのことです。このとき、同じ色を持つ頂点同士は互いに隣接しないという条件を満たす必要があります。言い換えると、「隣接する頂点は必ず異なる色になる」という性質を満たすグラフが2部グラフです。 本記事では、深さ優先探索(DFS:Depth First Search)を用いて、与えられたグラフが2部グラフであるかどうかを判定するC++プログラムを解説します。 アルゴリズム DFSを利用した2部グラフの判定は、以下の手順で行われます。 各ノードに対して0または1の値を格納する配
-
C++で文字列をchar配列に変換する3つの方法を解説
C++で文字列(std::string)を char 配列に変換したい場面は、C言語のライブラリ関数と連携するときなどによくあります。この記事では、文字列をchar配列へ変換する代表的な3つの方法を、サンプルコードと実行結果とあわせてわかりやすく解説します。 方法1:forループで1文字ずつコピーする アルゴリズム 開始 char配列変数 m に文字列値を代入する 文字列変数 str を定義する i = 0 ~ sizeof(m) の間、以下を繰り返す m から str へ1文字ずつコピーする str の内容を1文字ずつ出力する 終了 サ
-
与えられた二分木がAVL木かどうかを判定するC++プログラム
AVL木(AVL Tree)とは、すべてのノードにおいて、左部分木と右部分木の高さの差が1を超えないことが保証されている自己平衡型二分探索木です。このバランス特性により、木が片側に偏ることを防ぎ、検索・挿入・削除などの操作を常に高い効率で実行できます。 この記事では、与えられた二分木がAVL木であるかどうかを判定するC++プログラムを紹介します。 AVL木の条件 ある二分木がAVL木であるためには、次の条件を満たす必要があります。 すべてのノードで「左部分木の高さ − 右部分木の高さ」の絶対値が1以下である さらに、左右の部分木もそれぞれAVL木である(条件は再帰的に適用される) アルゴ
-
なぜC++には仮想コンストラクターが存在しないのか?
仮想機構が機能するための前提条件 C++における仮想(virtual)機構は、「基底クラスのポインタが派生クラスのオブジェクトを指している」という状況でのみ動作します。この仕組みを理解することが、仮想コンストラクターに関する議論を理解する第一歩となります。 コンストラクターをvirtualにできない理由 C++では、コンストラクターを仮想関数にすることはできません。その理由は、クラスのコンストラクターが実行される時点では、メモリ上に仮想関数テーブル(vtable)がまだ作成されておらず、仮想関数へのポインタ(vptr)も定義されていないためです。 仮想関数の仕組みはvtableとvptrに依