たとえば 整数での平方根を求める関数を作るとしましょうか:
int square_root(int x) { ... }
たとえきっちり実装し正しく動く自信があっても、
利用者側に間違った使い方されちゃ台無しです。
int r = square_root(-5); // -5の平方根は無理!
こんなとき、assert(真であらねばならぬ式); をコードに埋め込むと:
C++
1int square_root(int x) {
2 assert(x >= 0); // 事前条件
3
4 int s = 1;
5 int t = x;
6 if (t != 0) {
7 while (s < t) { s <<= 1; t >>= 1; }
8 do {
9 t = s;
10 s = (x / s + s) >> 1;
11 } while (s < t);
12 }
13
14 return t;
15}
そうすれば、使う側がおかしな引数渡したらassertに失敗し、
プログラムは(ファイル名と行番号を吐いて)停止します。
犯人捜しが圧倒的に楽になるってスンポーです。
他にも「このファイルオープンは絶対に成功するはず!」なら:
FILE* fp = fopen(...);
assert(fp != NULL);
とか書いておいて、"万が一のヤバいことが起こった"ことを検出できる、と。
※ assertに引っかかるのはバグ。なのでリリース時にはassertを無効化できます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/03 07:18