バグのありか、わかりますか?
突然ですが、
ですが、
int gcm(int a, int b)
{
while (a !=b)
{
if (a > b)
{
a -= b;
}
else
{
b = a;
}
}
return a;
}
リスト1は、
本書の目的は、
『プログラミングのセオリー』
は、 筆者がプログラミングする際に常に心がけているセオリー (定石) をまとめたものです。 (中略) 本書で紹介しているのは、 これまでの20年間で見出した代表的なセオリーです。筆者が信じているセオリーの多くが、 皆さんのプログラミングに磨きをかける一助となれば幸いです。
思いどおりに動かない。そんなときは……
話を元に戻しましょう。gcm関数の引数に、
プログラムの動作が思いどおりにならないときに使えるセオリーが
#include <stdio.h>
int gcm(int a, int b)
{
printf("a = %d, b = %d\n", a, b); // DEBUG
while (a !=b)
{
if (a > b)
{
a -= b;
}
else
{
b = a;
}
printf("a = %d, b = %d\n", a, b); // DEBUG
}
return a;
}
リスト2の実行結果は次のようになります。
a = 30, b = 42
a = 30, b = 30
printfデバッグでプログラムを追う
printfデバッグの結果、
どうでしょう? バグが見つかったでしょうか? 不具合の原因は、
a = 30, b = 42
a = 30, b = 12
a = 18, b = 12
a = 6, b = 12
a = 6, b = 6
手元にデバッガがない環境でプログラミングするときや、