ページ 11

半角英字の判定をするマクロを作成する問題

Posted: 2015年3月09日(月) 15:11
by まちゃ
半角英字aからzを判定するマクロを作成。
aからzの場合は真の値を返し、違う場合は偽の値を返す。

という問題が有り、
#define hantei(charactor) ((charactor => 'a') || (charactor =< 'z') )? 1 : 0
という解答をしたところ、惜しいと返ってきました。
些細なミスと言われたのですが、そのミスがわかりません。
どこがおかしいのでしょうか?

Re: 半角英字の判定をするマクロを作成する問題

Posted: 2015年3月09日(月) 15:41
by みけCAT
言語が指定されていませんが、C言語と仮定します。
  • C言語に=>、=<という演算子はありません。それぞれ>=、<=と書くべきです。
  • ASCIIのようなaからzまでの英字が連続している文字コードでしかうまく動きません。例えばEBCDICでは英字の文字コードが連続していません。
  • マクロの式中にcharactorが2回出てきているので、例えばhantei(a++)などの使い方をすると意図しない挙動になることがあります(GCC拡張を用いないと修正は難しいので、あまり気にしなくてよい)。
  • マクロ全体がカッコで囲まれていないので、式の計算結果が意図しない物になることがあります(撃墜例1)。
  • characterがカッコで囲まれていないので、式の計算結果が意図しない物になることがあります(撃墜例2)。

コード:

#include <stdio.h>

/* #define hantei(charactor) ((charactor => 'a') || (charactor =< 'z') )? 1 : 0 */
#define hantei(charactor) ((charactor >= 'a') || (charactor <= 'z') )? 1 : 0

int main(void) {
	/* 撃墜例1 */
	if (hantei('a') && hantei('0')) {
		puts("NG");
	} else {
		puts("OK");
	}

	/* 撃墜例2 */
	if (hantei(300 | 0)) {
		puts("NG");
	} else {
		puts("OK");
	}

	return 0;
}

Re: 半角英字の判定をするマクロを作成する問題

Posted: 2015年3月09日(月) 15:43
by usao
(1)真になる条件を日本語で表現する
(2)その通りのコードになっているか確認する


(1)がわかるなら,(2)は単なる文法の問題なので,再確認すればいかがでしょうか.

Re: 半角英字の判定をするマクロを作成する問題

Posted: 2015年3月09日(月) 15:51
by まちゃ
ありがとうございます。
>=と<=についてはケアレスミスでした。

わかりやすい解説有難うございました。

Re: 半角英字の判定をするマクロを作成する問題

Posted: 2015年3月09日(月) 17:03
by usao
ん? ||はそのまま…?

Re: 半角英字の判定をするマクロを作成する問題

Posted: 2015年3月09日(月) 17:08
by みけCAT
usao さんが書きました:ん? ||はそのまま…?
しまった…一般的な落とし穴にばかり気を取られて見逃してしまった…

Re: 半角英字の判定をするマクロを作成する問題

Posted: 2015年3月09日(月) 18:09
by まちゃ
||はどう違うのでしょうか?

Re: 半角英字の判定をするマクロを作成する問題

Posted: 2015年3月09日(月) 18:30
by box
まちゃ さんが書きました:||はどう違うのでしょうか?
文字コードの値が
'a' 以上
「または」
'z' 以下
である場合、おそらくはすべての文字を半角英字であると判定してしまうような気がします。

整数の場合に置き換えてみましょう。例えば
5 以上
「または」
10 以下
であるような整数って、「すべての」整数ですよね。
5~10の範囲の整数だけを取り出したければ、「または」ではなくて、何でしょうか。

Re: 半角英字の判定をするマクロを作成する問題

Posted: 2015年3月09日(月) 18:34
by まちゃ
あーなるほどです。
ここは「または」ではダメですね。
初歩的なミスでした。