質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

629閲覧

C言語 assert()を使うメリット

junnnnchan

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/06/03 06:37

assert()について調べたところ、デバッグの時に便利と記述されていました。ただ、その記事を読んでもいまいちassert()の使い方と使うメリットがわかりませんでした。
assert()の使い方を詳しくご教示お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

たとえば 整数での平方根を求める関数を作るとしましょうか:

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:04

編集2020/06/03 09:32
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junnnnchan

2020/06/03 07:18

なるほど!すごいわかりやすかったです! ありがとうございます。
guest

0

c言語 assert 使い方 - Google 検索

でてるのを一通り読んでみよう。
それでもわからないところがあるなら、そのページの提示とともに聞いてください

投稿2020/06/03 06:52

y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問