-
C言語における変数のスコープとは?静的スコープの仕組みを解説
C言語における変数のスコープここでは、C言語における変数のスコープがどのように決定されるのかを解説します。C言語では、変数は常に静的スコープ(静的束縛)として扱われます。つまり、ある名前の変数がどの実体に結び付けられるかは、プログラムのソースコード(テキスト)を見るだけで判断でき、実行時の関数呼び出しスタックには依存しません。具体的な例を見てみましょう。サンプルコード# include <stdio.h> int x = 0; int my_function() { return x; } int my_function2() { &
-
C言語におけるグローバル変数の再宣言の挙動を解説
本記事では、C言語におけるグローバル変数の「再宣言」がどのように扱われるのかを詳しく解説します。C言語はグローバル変数の再宣言をサポートしているのか、実際のコード例を見ながら確認していきましょう。ローカル変数の場合:再宣言はエラーになるまず、比較のためにローカル変数(関数内で宣言された変数)を再宣言した場合の挙動を見てみます。コード例#include <stdio.h> int main(){ int a; int a = 50; printf(a is : %d\n, a); }実行結果[Error] redeclaration of a with no
-
C言語のvolatile修飾子とは?意味と使い方をわかりやすく解説
この記事では、C/C++におけるvolatile(揮発性)修飾子の意味と役割について詳しく解説します。volatileは、変数を宣言するときに付与する修飾子です。コンパイラに対して「この変数の値はいつでも外部から変更される可能性がある」ことを伝えるために使われます。これにより、コンパイラによる最適化を抑制し、意図しない動作を防ぐことができます。volatile修飾子の主な性質volatileキーワードが付いた変数には、次のような特徴があります。メモリへの割り当てが削除されず、必ず実メモリ上に保持される変数がCPUレジスタにキャッシュされない代入された順序どおりに値が扱われる基本的な使い方vol
-
C/C++のプリプロセッサとは?仕組みと主要ディレクティブをわかりやすく解説
この記事では、C言語やC++におけるプリプロセッサ(前処理系)の動作原理について詳しく解説します。まず、プリプロセッサが何であるかを確認しましょう。 プリプロセッサとは何か プリプロセッサとは、実際のコンパイルが始まる前に、コンパイラへ情報の前処理を指示するためのディレクティブ(指令)のことです。ソースコードをコンパイルする前に、テキストレベルでコードの変換や置換を行う役割を担っています。 すべてのプリプロセッサディレクティブは「#」記号で始まり、1行の中でディレクティブより前に記述できるのは空白文字のみです。また、プリプロセッサディレクティブはC++の文ではないため、行末にセミコロン(;)を
-
【C/C++入門】while(1)とwhile(0)の違いをわかりやすく解説
本記事では、C言語およびC++における while(1) と while(0) の違いについて詳しく解説します。while はC/C++に用意されている繰り返し処理(ループ)の一つで、指定した条件を評価し、その条件が真(true)である間、ループ内の文を繰り返し実行します。 while(1):無限ループを作る while(1) や while にゼロ以外の値を指定した場合、条件が常に真と判定されるため、無限ループになります。条件式には「1」などの非ゼロ値が書かれているだけで、偽になることがないため、ループ内の処理が永久に実行され続けます。 この無限ループから抜け出すには、if 文などの条件分
-
C言語の__func__識別子とは?現在の関数名を取得する方法を解説
C言語には、現在実行中の関数名を自動的に取得できる便利な識別子 __func__ が用意されています。この記事では、__func__ の基本的な使い方と動作について、サンプルコードを交えて解説します。 __func__ 識別子とは __func__ は、C99規格で標準化された事前定義識別子(predefined identifier)で、その関数内で参照すると「現在の関数名」を文字列リテラルとして返します。 また、古いバージョンのCやC++、GCCなどのコンパイラでは、同等の機能を持つ __FUNCTION__ がサポートされている場合があります。移植性を考慮する場合は、C99以降に準拠し
-
C言語のrestrictキーワードとは?ポインタ最適化の基本と注意点を解説
この記事では、C言語におけるrestrictキーワードについて詳しく解説します。restrictはC99規格で初めて導入されたキーワードで、ポインタを扱う際にコンパイラへ重要なヒントを与えるために使われます。それでは、その実際の役割と使い方を見ていきましょう。 restrictキーワードは、ポインタ宣言時に型修飾子として使用されます。 このキーワード自体は新しい機能を追加するものではありません。プログラマが「特定の最適化を行っても安全である」ことをコンパイラに伝えるためのものです。 restrictをポインタに付けると、コンパイラに対して「このポインタは、その指す先のオブジェクトへアクセスす
-
C言語における構造体変数の操作|代入はできるが比較はできない?
C言語において、構造体(struct)変数に対して直接実行できる操作は限られています。基本的に構造体に対して行えるのは代入操作のみであり、==演算子を使った等価比較などの操作は標準ではサポートされていません。ここでは、実際のコード例を通じて、構造体でできること・できないことを確認していきましょう。代入操作の例まずは、構造体変数への値の代入が正しく動作する例です。#include <stdio.h> typedef struct { // 複素数を表すための構造体を定義 int real, imag; }complex; void displayComplex(complex
-
【C言語/C++】rename関数でファイル名を変更する方法
C標準ライブラリの関数 int rename(const char *old_filename, const char *new_filename) は、old_filename で指定されたファイル名を new_filename へ変更するための関数です。この関数を使用することで、ファイルの名前変更だけでなく、別のディレクトリへの移動も同時に行うことができます。 rename関数のプロトタイプ宣言 rename() 関数は、ヘッダーファイル <stdio.h> 内で以下のように宣言されています。 int rename(const char *old_filename, cons
-
C/C++のremove()関数でファイルを削除する方法
C言語の標準ライブラリ関数 int remove(const char *filename) は、指定されたファイルを削除し、以後アクセスできないようにするための関数です。stdio.h ヘッダーに宣言されており、プログラムから直接ファイルシステム上のファイルを操作できます。 remove()関数の宣言 int remove(const char *filename) パラメータ filename:削除対象となるファイルの名前を格納したC文字列(ヌル終端文字列)です。相対パスまたは絶対パスのどちらでも指定できます。 戻り値 成功した場合:0 を返します。 失敗した場合:-1 を返し、グ
-
C++でコピーコンストラクタを実装する方法を徹底解説
本記事では、C++におけるコピーコンストラクタの実装方法について詳しく解説します。実装方法に入る前に、まず「コピーコンストラクタとは何か」を理解しておきましょう。コピーコンストラクタとはコピーコンストラクタとは、同じクラスの既存のオブジェクトを使って新しいオブジェクトを初期化するコンストラクタのことです。主に以下のような場面で使用されます。同じ型の別のオブジェクトから、新しいオブジェクトを初期化するオブジェクトをコピーして、関数の引数として渡すオブジェクトをコピーして、関数から戻り値として返すクラス内でコピーコンストラクタが定義されていない場合、コンパイラが自動的にデフォルトのコピーコンストラ
-
C++で入力された文字列が数値かどうかを判定する方法
本記事では、C++において与えられた文字列が「数値文字列」なのか、それとも通常の文字列なのかを判定する方法を解説します。数値文字列とは、すべての文字が 0〜9 の範囲に収まっている文字列のことです。判定の基本的な考え方解決策は非常にシンプルです。文字列を先頭から1文字ずつ順番に走査し、それぞれの文字が数字であるかどうかを確認します。すべての文字が数字であれば true を返し、途中に数字以外の文字が1つでも見つかった時点で false を返します。サンプルコード#include <iostream> using namespace std; bool isNumeric(stri
-
C++における静的データメンバーの初期化方法をわかりやすく解説
静的データメンバーとはC++では、クラス内に静的(static)なメンバーを定義できます。静的メンバーには関数と変数の両方が含まれます。特に静的メンバー変数は、そのクラスから生成されたすべてのオブジェクト間で共有される単一のコピーを持つという重要な特徴があります。静的メンバー変数の初期化ルール静的メンバー変数は、クラス定義の内部では宣言のみを行います。実際にメモリを確保して値を代入する(定義と初期化)処理は、クラス定義の外部で行う必要があります。初期化を行う際は、「クラス名」に続けてスコープ解決演算子「::」を記述し、その後に変数名を指定します。この形式を使うことで、どのクラスに属する静的変数
-
C++で参照パラメータ(参照渡し)を使う方法をわかりやすく解説
C++では、変数の参照を関数に渡すことができます。この方法は一般に「参照渡し(Call by Reference)」と呼ばれます。参照渡しとは、関数へ引数を渡す際に、引数そのものではなく「引数への参照」を仮引数にコピーする手法です。関数内部ではこの参照を通じて、呼び出し元で使われている実際の引数にアクセスします。そのため、関数内でパラメータに対して行った変更は、渡された元の変数にもそのまま反映されます。値を参照渡しするには、通常の値と同じように引数の参照を関数へ渡します。ただしその場合、関数のパラメータを参照型として宣言する必要があります。次のswap()関数は、引数として受け取った2つの整数
-
C++のfree関数とは?動的メモリ解放の基本と使い方を解説
C/C++の標準ライブラリ関数である void free(void *ptr) は、malloc、calloc、realloc によって事前に確保された動的メモリを解放(デアロケート)するための関数です。動的に確保したメモリを使い終わった後に必ず呼び出すことで、メモリリークを防ぐことができます。free()関数の宣言void free(void *ptr)この関数は引数としてポインタ ptr を受け取ります。これは、malloc、calloc、または realloc によって以前に確保されたメモリブロックへのポインタであり、指し示された領域が解放されます。なお、引数に NULL ポインタを渡し
-
C++11のランダムライブラリ(<random>)を使って乱数を生成する方法
C++11では、標準ライブラリの <random> ヘッダを使用することで、高品質な乱数を簡単に生成できるようになりました。従来の rand() 関数と比べて、分布の制御や乱数の品質が大幅に向上しており、現代のC++における乱数生成の推奨手法となっています。乱数生成の基本的な仕組みC++11の乱数生成は、主に次の3つの要素で構成されます。random_device:OSから真にランダムなデータを取得する非決定的な乱数生成器。シードの供給源として利用します。mt19937:メルセンヌ・ツイスタと呼ばれる擬似乱数生成エンジン。高速で長い周期を持つため広く使われています。distribu
-
C++のclock()関数を使って処理時間を計測する方法
この記事では、C++におけるclock()関数の使い方について解説します。clock()関数は、time.hまたはctimeヘッダーファイルで定義されており、プログラムの処理にかかった経過時間を計測する際に活用できます。経過時間を求めるには、処理の開始時点と終了時点でそれぞれclock()を呼び出して時刻を取得し、その差分を計算します。その後、差分をCLOCKS_PER_SEC(1秒あたりのクロックティック数)で割ることで、実際のプロセッサ時間(秒単位)を求めることができます。サンプルコード以下の例では、ユーザーがEnterキーを押すまでの時間をclock()を使って計測します。#includ
-
C++11で逆順の範囲ベースforループを実現する方法
C++11で導入された範囲ベースforループ(range-based for loop)は、コンテナや配列の全要素を簡潔に走査できる便利な構文です。しかし、標準の範囲ベースforループは前方向の走査のみをサポートしており、要素を逆順に処理したい場合にはそのまま使うことができません。この課題を解決してくれるのが、C++開発者の間で非常に人気の高いライブラリ「Boost」です。Boostには強力な機能が多数含まれており、その中の boost::adaptors::reverse() を利用することで、配列やSTLコンテナを逆順に走査する範囲ベースforループを簡単に実現できます。コード例以下の例で
-
C++14のジェネリックラムダ(汎用ラムダ)とは?仕組みと使い方を実例で解説
ラムダ式とC++14での進化C++11で導入されたラムダ式は、関数内に直接記述できる無名関数であり、他の関数呼び出し文の中にネストして埋め込むことができます。また、autoキーワードと組み合わせることで、ラムダ式を変数に格納し、後から再利用することも可能です。C++14では、このラムダ式がさらに拡張され、ジェネリックラムダ(汎用ラムダ)と呼ばれる機能が追加されました。これにより、パラメータの型をautoで宣言できるようになり、1つのラムダ式で複数の異なる型を扱えるようになりました。例えば「整数の加算」「浮動小数点数の加算」「文字列の連結」など、型の異なる処理を同一のラムダ式で実現したい場合に非
-
C++で乱数を生成する方法【srand()とrand()の使い方を解説】
C++を使って乱数を生成する方法を解説します。ここでは、0から指定した値までの範囲で乱数を生成します(このプログラムでは最大値を100に設定しています)。この処理にはsrand()関数を使用します。srand()はC標準ライブラリに含まれる関数で、void srand(unsigned int seed)という形式で定義されており、rand関数が使用する擬似乱数生成器にシード(種)を設定します。srand()の宣言は以下の通りです。void srand(unsigned int seed)この関数は「シード(seed)」と呼ばれるパラメータを受け取ります。シードとは、擬似乱数生成アルゴリズムで