-
std::getline()が書式付き抽出の後に入力をスキップする原因と解決方法
C++でstd::cin >>による書式付き抽出を行った直後にstd::getline()を呼び出すと、2つ目の入力がスキップされてしまうことがあります。この現象は、以下のコードで簡単に確認できます。問題を再現するサンプルコード#include <iostream> #include <string> using namespace std; int main(){ string name; string city; if (cin >> name && getline(cin, city)){ cou
-
C++で一重引用符に複数の文字を指定するとどうなる?出力される巨大な数値の正体
C++では、ダブルクォート()は文字列リテラルを表し、シングルクォート()は1文字だけを含む文字リテラルを表すのが基本ルールです。では、シングルクォートの中に複数の文字を入れて出力しようとすると、どのような結果になるのでしょうか。今回はこの興味深い挙動について解説します。 サンプルコード #include<iostream> using namespace std; main() { cout << ABCD; } 実行結果 1094861636 このプログラムを実行すると、一見意味不明な大きな数値が出力されます。この数値には、いったいどんな意味があるのでしょう
-
C++の値渡しと参照渡しの違いを徹底解説!使い分けのポイントも紹介
C++では、関数へ引数を渡す方法が複数用意されています。主な方法は以下の3つです。値渡し(Call by Value)参照渡し(Call by Reference)アドレス渡し(Call by Address)アドレス渡しは「参照渡し」と呼ばれることもありますが、C++において両者は別の仕組みです。アドレス渡しではポインタ変数を使って、メモリ上の正確なアドレスそのものを渡します。一方、参照渡しでは参照変数(元の変数の別名=エイリアス)を渡します。なお、C言語には参照という機能が存在しないため、同じ効果を得るにはポインタを渡す必要があります。この記事では、値渡しと参照渡しの動作の違いをサンプルコ
-
C++で二分木の奇数レベルのみを出力するプログラム
本記事では、二分木(バイナリツリー)のうち奇数番目のレベル(1層目・3層目・5層目…)に存在するノードだけを順に出力するC++プログラムを紹介します。アルゴリズム使用する構造体と各関数の処理の流れを、擬似コードで以下に示します。Begin 構造体 nod を宣言する 整数型のメンバ d を宣言 構造体 nod へのポインタ l を宣言 構造体 nod へのポインタ r を宣言 関数 struct nod* newNod(int d) を呼び出す 関数 struct nod* newNod(int d) を定義 構造体 nod へのポインタ node
-
C++で入力を読み取った後にcin.clear()とcin.ignore()を呼び出す理由とは?
はじめにC++では、標準入力ストリームであるcinを使ってユーザーからの入力を受け取ります。しかし、プログラムの実行中に何らかの原因でエラーフラグがセットされると、cinが正常に動作しなくなることがあります。具体的には、入力をまったく受け付けなくなったり、意図しない文字を読み込んでしまったりするケースが発生します。このような問題を解決するために活躍するのが、cin.clear()とcin.ignore()という2つの関数です。本記事では、それぞれの役割と使い方について詳しく解説します。cin.clear()の役割:エラーフラグのリセットcin.clear()は、入力ストリームに設定されたエラー
-
C/C++で波括弧(中括弧)を省略するのはなぜ悪い習慣とされるのか?
波括弧の省略がもたらす問題 C++では、if-else文やループ(for、whileなど)の後の波括弧(中括弧)を省略してコードを書くことができます。しかし、波括弧を使わない場合、if-elseやループの直後にある1つの文だけがそのブロックに属すると解釈されます。以下の例で確認してみましょう。 if(condition) { Line 1 Line 2 } if(condition) Line 1 Line 2 最初のケースでは、Line 1とLine 2の両方がifブロック内にあります。一方、2番目のケースでは、ifブロックに含まれるのはLine 1だけで、Line 2はブ
-
C++でstatic_cast<int>(x)を使うべき理由 ― (int)xとの違いとは?
(int)xはC言語スタイルの型キャストであり、C++ではstatic_cast(x)を使用するのが推奨されています。static_cast<>()はコンパイル時の型チェック機能を提供しますが、Cスタイルのキャストにはその機能がありません。また、static_cast<>()はC++コードのどこからでも識別でき、このC++形式のキャストを使うことで、開発者の意図がより明確に伝わるというメリットもあります。Cスタイルキャストの危険性Cスタイルのキャストでは、ある型のポインタをまったく別の型のデータに向けてキャストできてしまうことがあります。例えば、整数型ポインタは文字型データを指すことも可能です
-
【C++】AVLツリーが要素の追加・削除時に実行する回転の種類を出力するプログラム
AVLツリー(AVL木)とは、自己平衡型二分探索木の一種です。すべてのノードにおいて、左部分木と右部分木の高さの差が1を超えないように保たれることが最大の特徴です。木の回転とは木の回転(Tree Rotation)とは、AVLツリー上の要素の順序に影響を与えることなく、ツリーの構造を変更する操作のことです。回転では、あるノードを1つ上へ移動させ、別のノードを1つ下へ移動させます。この操作は、小さい部分木を下へ、大きい部分木を上へ移動させることでツリーの高さを減らし、多くのツリー操作のパフォーマンスを向上させるために使われます。回転の方向は、ノードがどちら側にシフトされるかによって決まります。言
-
CおよびC++における一重引用符と二重引用符の違い
C/C++における一重引用符と二重引用符の基本的な違いC言語およびC++では、一重引用符()は単一の文字を表すために使用され、二重引用符()は文字列リテラルを表すために使用されます。この区別は一見些細なことに思えますが、プログラムの動作に大きな影響を与える重要なポイントです。例えば、文字列リテラル「x」は文字列であり、文字「x」とヌル終端文字「\0」を含んでいます。そのため、この場合の「x」は2文字分の配列として扱われます。一方、「x」はあくまで1つの文字を表すリテラルであり、両者はまったく別のものです。文字リテラルの型とサイズの違いC++では、文字リテラルのサイズはchar型になります。とこ
-
C/C++のダングリングポインタ・voidポインタ・NULLポインタ・ワイルドポインタを徹底解説
C/C++のポインタは強力な機能である一方、扱い方を誤ると深刻なバグの原因となります。本記事では、特によく問題になる4種類のポインタ——ダングリングポインタ(ぶら下がりポインタ)、voidポインタ、NULLポインタ、ワイルドポインタ——について、それぞれの特徴と発生原因をコード例とともに解説します。 ダングリングポインタ(ぶら下がりポインタ)とは ダングリングポインタとは、すでに解放(削除)されたメモリ領域を指し続けているポインタのことです。無効なメモリを参照するため、プログラムのクラッシュや予期しない動作を引き起こす危険があります。ダングリングポインタが発生する主なケースを以下に紹介します。
-
C++の値渡しと参照渡しの違いとは?使い分けのポイントを徹底解説
C++では、関数へ引数を渡す方法が複数用意されています。主な渡し方は以下の3つです。値渡し(Call by Value)参照渡し(Call by Reference)アドレス渡し(Call by Address)「アドレス渡し」は「参照渡し」と呼ばれることもありますが、C++においてはこの2つは厳密には異なる概念です。アドレス渡しではポインタ変数を使って変数のメモリアドレスそのものを渡します。一方、参照渡しでは参照変数(元の変数の別名=エイリアス)を渡します。C言語には参照という機能がないため、同様の効果を得るにはポインタを渡す必要があります。本記事では、値渡しと参照渡しの違いを具体的なコード
-
C++でインターフェイスを宣言する方法|抽象クラスと純粋仮想関数の基礎
インターフェイスとは、C++クラスの振る舞いや能力を、そのクラスの具体的な実装に縛られずに記述するための仕組みです。C++では、インターフェイスは抽象クラスを使って実装されます。ただし、抽象クラスは「実装の詳細をデータから分離する」という概念であるデータ抽象化とは別物なので、両者を混同しないように注意しましょう。 純粋仮想関数でクラスを抽象化する クラスを抽象クラスにするには、少なくとも1つのメンバ関数を純粋仮想関数として宣言します。純粋仮想関数は、宣言の末尾に「= 0」を付けることで指定できます。 class Box { public: // 純粋仮想関数 virtual
-
C++の*ptr++、*++ptr、++*ptrの違いを徹底解説
C++のポインタ操作では、*ptr++、*++ptr、++*ptr の3つの書き方がよく登場します。一見似ていますが、それぞれ動作が異なるため、混同するとバグの原因になります。この記事では、演算子の優先順位の観点から、これら3つの違いをサンプルコード付きで詳しく解説します。 演算子の優先順位を理解する まず、C/C++における後置インクリメントと前置インクリメントの優先順位を確認しましょう。 前置インクリメント(++)や前置デクリメント(--)は、間接参照演算子(*)よりも高い優先順位を持ちます。 後置インクリメント(++)や後置デクリメント(--)は、前置インクリメントと間接参照演算子(*
-
C++のダングリングポインタ・voidポインタ・NULLポインタ・ワイルドポインタの違いを徹底解説
はじめにC++では、ポインタの扱い方を誤ると予期しない動作やクラッシュの原因となります。本記事では、特に注意が必要な4種類のポインタ——「ダングリングポインタ」「voidポインタ」「NULLポインタ」「ワイルドポインタ」——について、それぞれの特徴と具体例を交えて詳しく解説します。 ダングリングポインタ(ぶら下がりポインタ) ダングリングポインタとは、すでに解放(削除)されたメモリ領域を指し続けているポインタのことです。以下のような状況で発生します。 1. 関数呼び出しによる発生 ローカル変数がstaticで宣言されていない場合、関数の終了とともにその変数は破棄されるため、ローカル変数への
-
#include <bits/stdc++.h>とは?C++での仕組みとメリット・デメリットを解説
#include <bits/stdc++.h>は、C++の標準ライブラリに含まれるヘッダーファイルをすべて一括で読み込むことができる特殊なヘッダーファイルです。競技プログラミングなど、とにかく素早くコードを書きたい場面では非常に便利な存在です。 bits/stdc++.h の仕組み このヘッダーファイルは、<iostream>、<vector>、<algorithm>など、標準ライブラリのほぼすべてのヘッダーを内部でインクルードしています。そのため、必要なヘッダーを個別に指定しなくても、標準ライブラリの各種機能をすぐに利用できます。 ソフトウェ
-
C++の基本入出力(cout・cin)をわかりやすく解説
C++の標準ライブラリは、非常に充実した入出力(I/O)機能を提供しており、その詳細については後続の章で扱います。この章では、C++プログラミングにおいて最も基本的かつ頻繁に使われるI/O操作について解説します。 C++の入出力は「ストリーム」と呼ばれるバイト列を通じて行われます。キーボード、ディスクドライブ、ネットワーク接続などのデバイスからメインメモリへ向かってバイトが流れる場合、これを入力操作と呼びます。逆に、メインメモリからディスプレイ画面、プリンター、ディスクドライブ、ネットワーク接続などのデバイスへバイトが流れる場合は、出力操作と呼ばれます。 標準出力ストリーム(cout) あら
-
C++プリプロセッサ入門:#defineマクロと条件付きコンパイルの基本をわかりやすく解説
プリプロセッサ(前処理器)とは、実際のコンパイルが始まる前に、コンパイラへ情報の前処理を指示するためのディレクティブ(指令)のことです。ソースコードをコンパイルする前に、テキストレベルでコードを書き換えたり調整したりする役割を担っています。すべてのプリプロセッサディレクティブは「#」で始まり、その行では「#」より前に空白文字(スペースやタブ)しか置けません。また、プリプロセッサディレクティブはC++の文ではないため、行末にセミコロン(;)を付けない点に注意しましょう。これまでの例でも「#include」ディレクティブを目にしたことがあるでしょう。これはヘッダファイルをソースファイルに取り込むた
-
C++における条件分岐の基礎:if-else文とswitch文の使い方を徹底解説
条件分岐(意思決定)構造では、プログラマーがプログラムに評価・判定させる1つ以上の条件を指定し、その条件が「真(true)」と判定された場合に実行する文、さらに必要に応じて、条件が「偽(false)」と判定された場合に実行する別の文を記述する必要があります。 以下は、多くのプログラミング言語に共通する、典型的な条件分岐構造の一般的な流れを示した図です。 if-else文とは if文の後には、オプションとしてelse文を続けることができます。else文は、ifのブール式が「偽」と判定された場合に実行されます。C++におけるif...else文の基本構文は以下の通りです。 if(boolean
-
C/C++でif文とelse文を同時に実行する方法
はじめにこの記事では、C言語やC++のコードにおいて、if文とelse文を同時に実行する方法を解説します。一見不可能に思えるこの動作も、少しトリッキーな手法を使えば実現できます。通常、if文とelse文は条件判定によってどちらか一方のみが実行されます。仮にif文とelse文が続けて実行されると、それはif-else構文が存在しないのと同じように、単に文を順番に実行している状態になります。しかし、ここではif-else構文が存在する状態で、両方のブロックを続けて実行する方法を見ていきましょう。サンプルコード#include <iostream> using namespace std
-
C++の参照(リファレンス)とは?ポインタとの違いと使い方を徹底解説
参照(リファレンス)変数とは、ある変数につけられた「別名(エイリアス)」のことです。すでに存在する変数に対して別の名前を与えるものであり、一度変数で参照を初期化すれば、元の変数名でも参照名でも、同じ変数を扱うことができます。 参照とポインタの違い 参照はよくポインタと混同されますが、両者には以下の3つの大きな違いがあります。 NULL参照は存在しない:参照は必ず有効なメモリ領域に接続されているものとして扱えます。一方、ポインタはNULLになり得ます。 参照先を後から変更できない:参照はオブジェクトに対して一度初期化されると、別のオブジェクトを指すように変更することはできません。ポインタなら、