こんにちは。
大変基本的な質問になってしまうのですが、
「A~Mのどれでもなかったら」という条件を書きたいのですが、
if(Data!='A'||'B'||'C'||'D'||'E'||'F'||'G'||'H'||'J'||'K'||'L'||'M')
だと、もし「A」がきた場合にこの条件に入ってしまいます。
使い方を調べたのですが、どう間違っているのかよく分かりません。
どなたかご教示くださいませ。
初登場、第1位です。 <- 初登場のみホント
基本的に || ではなく && ですし、
if(Data!='A'&&Data!='B'&&Data!='C'&&....
と書かなければなりません。
面倒ならASCIIコードの特性を活かして
if(Data<'A'||Data>'M')
と表現できます。
if( 'A'< Data || Data > 'M' )
とかでいいんじゃないでしょうか?
演算子の優先順位をはっきりさせるためにも括弧でくくればいいでしょう。
if(Data!='A'||'B'||'C'||'D'||'E'||'F'||'G'||'H'||'J'||'K'||'L'||'M')
は,
int flag = 0;
if (Data != 'A') {
flag = 1;
} else if ('B') {
flag = 1;
} /* 以下省略 */
if (flag) {
...
}
という意味になります。
ここで,'B'は恐らく真ですから,常にif文が実行されます。
if (Dataが'A', 'B', …, 'M'でなければ)
は,
if (Dataが'A'でなく, かつDataが'B'でなく, …, かつDataが'M'でなければ)
となります。
これを表すと,Angelさんが書いた最初のif文になります。
if (!('A' <= Data && Data <= 'M'))
とこれの展開系は,常に正しく判断できることがC/C++で保証されて「いません」。
if (!(strchr(ABCDEFGHJIKLM, Data) != 0))
なら常に正しく判断されますが。もっとも,Windows上のコンパイラが
ISO 646非互換なコード系を使うことは皆無でしょうが。
こんな手もありますね。
int data;
...
if (strchr(ABCDEFGHIJKLM, data) == NULL) {
...
}
UNICODE対応にするなら、こうかな。
_TINT data;
...
if (_tcschr(_T(ABCDEFGHIJKLM), data) == NULL) {
...
}
かぶってしまいました。 ^^;
皆様、たくさんのアドバイスありがとうございました。
こんなに色々な暖かいアドバイスをいただけるなんてとても嬉しいです。
基本的に条件の書き方が間違っていたのですね。
まだまだ勉強不足です。
皆様のアドバイスを読み、Angel様の書いて下さったコードを
使わせていただき、実現に至りました。
コードの意味、使い方などこれから勉強していきたいと思います。
本当にありがとうございました。
また、レスが遅くなってしまい申し訳ありませんでした。