-
数値の先頭にある0(ゼロ)とは?C++における8進リテラルの意味と使い方
C/C++において、数値の先頭に付く「0(ゼロ)」は、その数が8進リテラル(octal literal)であることを示します。これは多くの初心者が見落としがちな重要な仕様です。8進数リテラルを使うには、実際の数値の前にゼロを付けて記述します。例えば、8進数の「25」を表したい場合は「025」と書き、8進数の「63」であれば「063」と記述します。コンパイラは先頭にゼロが付いた整数を10進数ではなく8進数として解釈します。サンプルコード#include <stdio.h> int main() { int a = 025; int b = 063; print
-
C++のi++と++iにはパフォーマンスの違いがある?前置き増加と後置き増加を徹底解説
C++におけるi++(後置インクリメント)と++i(前置インクリメント)は、最終的な結果としては同じように見えます。しかし、両者には動作の順序に重要な違いがあります。i++は現在の値を代入した後に値を1増やすのに対し、++iは値を先に1増やしてからその値を代入します。この違いは、以下のコードで確認できます。サンプルコード#include<iostream> using namespace std; int main() { int x = 3, y, z; y = x++; z = ++x; cout << x << , &
-
【C++入門】コマンドライン引数の取得と解析方法をわかりやすく解説
C++のプログラムは、実行時にコマンドラインから値を受け取ることができます。この値はコマンドライン引数(command line arguments)と呼ばれます。設定値などをソースコード内にハードコーディングするのではなく、プログラムの外部から柔軟に動作を制御したい場合に、コマンドライン引数は非常に重要な役割を果たします。 コマンドライン引数は、main()関数の引数を通じて処理されます。argcには渡された引数の総数が整数で格納され、argv[]は各引数を指すポインタの配列です。argv[0]にはプログラム名自身が格納されるため、ユーザーが指定した引数はargv[1]以降に順番に並びます。
-
C++のコピーエリージョン(Copy Elision)とは?仕組みをサンプルコードでわかりやすく解説
コピーエリージョン(Copy Elision)は「コピーの省略(Copy Omission)」とも呼ばれる、C++における代表的なコンパイラ最適化技術のひとつです。この技術により、オブジェクトの不要なコピー処理が自動的に回避されます。現在利用されているほぼすべてのコンパイラが、このコピーエリージョンを採用しています。 ここからは、実際のサンプルコードを使いながら、その仕組みを詳しく見ていきましょう。 サンプルコード #include <iostream> using namespace std; class MyClass { public: MyClas
-
C++入門:関数オーバーロードと戻り値の型のルールを解説
C++では、同じスコープ内に同名の関数を複数定義することができます。これを「関数オーバーロード」と呼びます。ただし、各定義は引数リストにおける引数の型や数が互いに異なっている必要があります。戻り値の型だけが異なる関数宣言は、オーバーロードとして扱うことができません。 関数オーバーロードは、コンパイル時に行われる静的ポリモーフィズムの一種です。コンパイラは関数のシグネチャ(関数名と引数リストの組み合わせ)を確認し、シグネチャが異なっていればそれらを別個の関数として区別します。一方、関数の戻り値の型はオーバーロードの判定にまったく影響しません。シグネチャが同一で戻り値の型のみが異なる場合、呼び出
-
C++のRTTI(実行時型情報)とは?仕組みとdynamic_castの使い方を解説
C++におけるRTTI(実行時型情報)とは 本記事では、C++におけるRTTI(Runtime Type Information:実行時型情報)について解説します。RTTIとは、プログラムの実行時にオブジェクトのデータ型に関する情報を取得できるようにするC++の仕組みです。これにより、プログラムが動作している最中にオブジェクトの実際の型を判定することが可能になります。 ただし、RTTIの機能を利用できるのは、対象のクラスが少なくとも1つの仮想関数(virtual関数)を持っている場合のみです。仮想関数が1つも定義されていないクラスは多態的(ポリモーフィック)ではないため、RTTIは有効になりま
-
C++における関数引数の評価順序をわかりやすく解説
C++では、関数にさまざまな引数を渡すことができます。その際、「関数の引数はどのような順序で評価されるのだろうか」という疑問が浮かぶことがあります。左から右へ評価されるのでしょうか、それとも右から左へなのでしょうか。本記事では、シンプルなプログラムを使って引数の評価順序を実際に確認します。複数の引数を関数に渡し、その出力結果から評価の流れを読み解いていきましょう。サンプルプログラム#include<iostream> using namespace std; void test_function(int x, int y, int z) { cout &l
-
GCCでC/C++ソースからアセンブリ出力を取得する方法
はじめにこの記事では、gcc(GNU Compiler Collection)を使用して、CまたはC++のソースコードからアセンブリ出力を生成する方法を解説します。-Sオプションによるアセンブリ出力の取得gccには、コンパイル過程における中間出力をすべて取得できる便利な機能が備わっています。アセンブリ出力を得るには、「-S」オプションを指定します。このオプションを使うと、コンパイルまでは実行されますが、アセンブラに渡される直前の段階で処理が止まり、その時点のアセンブリコードが出力されます。基本構文gcc -S program.cppデフォルトでは、拡張子「.s」が付いたファイル(上記の例では
-
C++のインライン関数とは?メリットと使い方を徹底解説
C++のインライン関数の基本C++のインライン関数(inline function)は、クラスと組み合わせてよく使われる強力な機能です。関数をインラインとして宣言すると、コンパイラはコンパイル時に、その関数が呼び出される箇所すべてに関数コードのコピーを埋め込みます。そのため、インライン関数に変更を加えた場合、関数を利用しているすべてのコードを再コンパイルする必要が生じることがあります。再コンパイルを行わないと、コンパイラが新しいコードに置き換えられず、古い機能のまま動作し続けるからです。インライン関数の定義方法関数をインライン化するには、関数名の前にinlineキーワードを付け、その関数が呼び
-
C++でdouble型(float型)がNaNかどうかを判定する方法
C++において、浮動小数点数(float型やdouble型)がNaN(Not a Number:非数)かどうかを判定するには、isnan()関数を使用します。この関数はcmathヘッダに定義されており、C++11で導入されました。そのため、C++11以降の環境で利用できます。NaNは「0による除算」や「負の数の平方根」など、数学的に定義できない演算の結果として発生する特別な浮動小数点値です。NaNは自分自身とすら等しくならない(NaN == NaNがfalseになる)という特殊な性質を持つため、比較演算子ではなくisnan()関数を使った判定が推奨されます。サンプルコード#include &l
-
C++の関数から複数の値を返す方法【ポインタ渡しと参照渡し】
C言語やC++では、関数から複数の値を直接返すことはできません。return文で返せる値は基本的に1つだけだからです。しかし、「ポインタ渡し(call by address)」や「参照渡し(call by reference)」といったテクニックを使えば、実質的に複数の値を呼び出し元に返すことが可能です。この記事では、1つの関数から2つの数値を割り算した「商」と「余り」を同時に取得する例を通して、その具体的な方法を解説します。方法1:ポインタ渡し(Call By Address)ポインタ渡しでは、結果を格納するための変数を呼び出し側で用意し、その変数のアドレスを関数に渡します。関数内ではポイン
-
C++でループ内に毎回異なる乱数を生成する方法
C++で乱数を生成する方法について解説します。ここでは、0から指定した上限値までの範囲で乱数を生成します(このプログラムでは最大値を100としています)。srand()関数とはループ内で異なる乱数を得るためには、srand()関数を使用します。これはC++の標準ライブラリ(<cstdlib>)に含まれる関数で、void srand(unsigned int seed) という形式を持ち、rand()関数が利用する擬似乱数生成器のシード(種)を設定する役割を担います。srand()関数の宣言は以下の通りです。void srand(unsigned int seed)引数には「seed
-
【C/C++入門】void mainとint mainの違いとは?正しいmain関数の書き方を解説
C/C++のプログラムでは、エントリーポイントとして int main() を使うこともあれば、void main() を使うこともあります。では、この2つにはどのような違いがあるのでしょうか。本記事では、それぞれの特徴と使い分けのポイントをわかりやすく解説します。 main関数の基本的な役割 main() 関数は、他の関数と同様に引数を受け取り、値を返すことができます。しかし、main() には特別な役割があります。それは、プログラムの実行が必ずこの関数から開始されるという点です。 つまり、main() はオペレーティングシステム(OS)から呼び出される関数であり、main() 内で返された
-
C言語でローカルコンピュータのIPアドレスとホスト名を取得する方法
この記事では、C言語を使ってローカルコンピュータのホスト名とIPアドレスを簡単に取得する方法を解説します。実際に動作するサンプルプログラムを作成しながら、具体的な手順を見ていきましょう。ここでは主に以下の3つの関数を使用します。それぞれ役割が異なるため、まずは各関数の概要を確認しておきましょう。番号関数と説明1gethostname()ローカルコンピュータの標準ホスト名を取得します。2gethostbyname()ホストデータベースから、指定したホスト名に対応するホスト情報を検索します。3inet_ntoa()IPv4のネットワークアドレスを「192.168.1.1」のようなドット区切りの10
-
DFSを使って無向グラフが木(ツリー)かどうかを判定するC++プログラム
グラフが「木(ツリー)」であるための条件は、閉路(サイクル)を一切含まないことです。この記事では、深さ優先探索(DFS)を活用して、無向グラフが木かどうかを判定するC++プログラムを紹介します。 木とは何か 木とは、閉路を持たない連結グラフのことです。n個の頂点からなる木は、必ずn−1本の辺を持ちます。したがって、グラフの中にサイクルが1つでも存在すれば、そのグラフは木ではありません。この性質を利用し、DFSによってサイクルの有無を検出することで、グラフが木かどうかを判定できます。 アルゴリズム サイクル検出の流れは以下の通りです。 開始 関数 cyclicUtil() : A) 現在のノー
-
DFSを使って有向グラフが木(ツリー)かどうかを判定するC++プログラム
グラフは、サイクル(閉路)を一切含まない場合に「木(ツリー)」であるとみなされます。本記事では、DFS(深さ優先探索)を利用して、有向グラフが木かどうかを判定するC++プログラムを解説します。アルゴリズムの概要サイクルの検出には、「訪問済みフラグ」と「再帰スタック」の2つの配列を用います。ある頂点から探索を進めた際、現在の探索経路上(再帰スタック上)にすでに存在する頂点へ戻ってきた場合、そこにサイクルが存在すると判断できます。Begin function cyclicUtil() : a) 現在のノードを「訪問済み」かつ「再帰スタックの一部」とし
-
C++でグラフGの推移閉包を求める方法|ワーシャル(Warshall)アルゴリズムの実装
有向グラフが与えられたとき、すべての頂点ペア (i, j) について「頂点 j に頂点 i から到達できるか」を判定することを考えます。ここで「到達可能」とは、頂点 i から頂点 j へ至るパス(経路)が存在することを意味します。この到達可能性を表す行列は推移閉包(Transitive Closure)と呼ばれ、ワーシャル(Warshall)アルゴリズムを使うことで効率的に求めることができます。 本記事では、推移閉包の基本概念から、ワーシャル法による求解手順、そして実際に動作するC++プログラムの実装例までをわかりやすく解説します。 推移閉包とは 推移閉包とは、グラフの隣接行列を拡張したもので
-
2色アルゴリズムで二部グラフを判定するC++プログラム
二部グラフとは、頂点集合を2つのグループに分割し、同一グループ内に辺が存在しないグラフのことです。これは、グラフの頂点を2色で塗り分けられる(隣接する頂点が異なる色になる)ことと同義です。本記事では、バックトラック法に基づく2色アルゴリズムを用いて、与えられたグラフが二部グラフかどうかを判定するC++プログラムを解説します。 アルゴリズムの概要 このアルゴリズムは、頂点を順番に処理し、各頂点に色(1または2)を割り当てていきます。割り当ての際、隣接する頂点と同じ色にならないかをチェックします(isSafe関数)。全頂点に矛盾なく色を割り当てられれば二部グラフ、どこかで矛盾が生じれば二部グラフ
-
C++でBFS(幅優先探索)を使ってグラフが2部グラフかどうかを判定する方法
2部グラフ(Bipartite Graph)とは、グラフ全体を2色だけで塗り分けできるグラフのことです。具体的には、隣接する頂点同士が必ず異なる色になるように着色でき、同じ集合に属する頂点はすべて同じ色で塗られるグラフを指します。本記事では、BFS(幅優先探索:Breadth-First Search)を利用して、与えられたグラフが2部グラフであるかどうかを判定するC++プログラムを紹介します。2部グラフとは2部グラフとは、頂点集合を2つの集合に分割でき、すべての辺が必ず異なる集合に属する頂点同士を結ぶグラフです。これと等価な定義として、「2色で頂点を塗り分けたとき、隣接する頂点が常に異なる色
-
DFSを使用してグラフが2部グラフかどうかを判定するC++プログラム
2部グラフ(バイパータイトグラフ)とは、グラフ全体を2色で塗り分けることができるグラフのことです。つまり、隣接する2つの頂点が必ず異なる色になるように頂点を着色できるグラフを指します。本記事では、DFS(深さ優先探索)を用いて、与えられたグラフが2部グラフかどうかを判定するC++プログラムを解説します。2部グラフとは2部グラフとは、頂点集合を2つのグループに分割し、すべての辺が必ず異なるグループに属する頂点同士を結ぶようなグラフです。この性質があるため、「隣接する頂点同士を異なる色で塗る」という操作をグラフ全体に適用できるかどうかを調べることで、2部グラフの判定が可能になります。アルゴリズムD