C++でゼロ除算(0除算)エラーをキャッチする方法【例外処理の基本】
C++では、例外処理(try-catch構文)を利用することで、ゼロ除算(0で割り算を行う)エラーを安全に捕捉できます。特に整数型の演算で0除算が発生すると未定義動作となり、プログラムが異常終了する恐れがあるため、割る数が0かどうかを事前にチェックし、例外を投げる仕組みを実装することが重要です。
以下に、ゼロ除算エラーをキャッチする基本的なサンプルコードを示します。
サンプルコード
#include <iostream>
using namespace std;
int display(int x, int y) {
if( y == 0 ) {
throw "Division by zero condition!";
}
return (x/y);
}
int main () {
int a = 50;
int b = 0;
int c = 0;
try {
c = display(a, b);
cout << c << endl;
} catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}
実行結果
Division by zero condition!
プログラムの解説
上記のプログラムでは、引数 x と y を受け取る display() 関数を定義しています。この関数は x を y で割った結果を返しますが、y が 0 の場合には「Division by zero condition!」というメッセージを持つ例外を送出(throw)します。
int display(int x, int y) {
if( y == 0 ) {
throw "Division by zero condition!";
}
return (x/y);
}
main() 関数内では、try-catchブロックによる例外処理を行っています。割り算の処理は try ブロック内で呼び出され、例外が発生した時点で残りの処理を中断し、catch ブロックへ制御が移ります。catch ブロックでは受け取ったメッセージを標準エラー出力(cerr)に表示しています。
try {
c = display(a, b);
cout << c << endl;
} catch (const char* msg) {
cerr << msg << endl;
}
補足:std::runtime_error を使ったより実践的な方法
文字列リテラルを直接 throw する方法はシンプルですが、実務では標準ライブラリの std::runtime_error などの例外クラスを使用するのが一般的です。これにより、型安全で柔軟なエラー処理が可能になります。
#include <iostream>
#include <stdexcept>
using namespace std;
int divide(int x, int y) {
if (y == 0) {
throw runtime_error("Division by zero condition!");
}
return x / y;
}
int main() {
try {
cout << divide(50, 0) << endl;
} catch (const runtime_error& e) {
cerr << e.what() << endl;
}
return 0;
}
なお、浮動小数点数(double や float)の場合、0で割ると例外ではなく inf(無限大)や nan が返されるため、注意が必要です。ゼロ除算チェックは、整数演算において特に重要な防御的プログラミングの基本テクニックと言えます。
-
OpenCVとC++を使った色追跡の実装方法:HSV変換から軌跡の描画まで
色追跡(カラートラッキング)は、色検出とよく似た画像処理です。追跡を実現するには、検出したオブジェクトの面積を計算し、その領域の現在位置を求める処理を数行追加します。最後に、OpenCVのline()関数を使って、オブジェクトが移動した軌跡を線として描画します。 この記事では、トラックバーでHSVのしきい値をリアルタイムに調整しながら、Webカメラの映像から特定色のオブジェクトを検出し、その動きを追跡する方法を解説します。 色追跡の基本的な流れ 映像の取得:VideoCaptureクラスでWebカメラからフレームを取得します。 HSVへの変換:cvtColor()関数でBGR画像をHSV形
-
C++のnew演算子を使って2次元配列を動的に宣言・生成する方法
動的な2次元配列とは、基本的に「配列へのポインタ」を要素とする配列(ポインタの配列)のことです。つまり、各行が独立した1次元配列としてヒープ上に確保され、それらの先頭アドレスを格納するポインタ配列によって全体が管理されます。下図は、3×4の2次元配列のイメージです。アルゴリズムC++のnew演算子で2次元配列を動的に確保する手順は以下の通りです。Begin 配列の寸法(行数・列数)を宣言する。 new を使って 2次元配列 a[][] を動的に確保する。 配列に要素を代入する。 配列の内容を出力する。 delete でメモリを解放する。 Endサンプルコ