ページ 1 / 1
条件式の簡略化
Posted: 2010年12月30日(木) 16:14
by ライス
条件式について質問があります。
a が b にも c にも d にも等しくないという条件式を…
b != a && c != a && d != a
としたのですが、 != a が何度もありなんだかスッキリしないと思いました。
なのでスマートにまとめようと思いいろいろ試してみたのですが、どうしても上手くいきませんでした。
b != a && c != a && d != a
という条件式を、もっとスマートにまとめる方法はないのでしょうか?
ご教授宜しくお願いします。
ちなみに…
! ( b == a || c == a || d == a )
としたいのではなく、 != a または == a というのを1回だけ書いて…
b != a && c != a && d != a
と同じ意味を持つ式にしたいです。
Re: 条件式の簡略化
Posted: 2010年12月30日(木) 16:30
by bitter_fox
強引にやるとこんな感じでしょうか・・・
if (b - c + d != a)
{
// anything;
}
多分これでいけるはずですが、可読性には優れてませんね・・・
[hr]もしかしたら、それ用の構文が用意されてるのかも・・・
[hr][修正]
== --> !=
間違ってたので修正。
[hr][修正]
よく考えたら、これじゃダメだったorz、
この投稿は無視してください・・・
Re: 条件式の簡略化
Posted: 2010年12月30日(木) 18:29
by ライス
bitter_foxさん、ご返信ありがとうございます。
やはり他の方法はないんですかね?
一応正常に動作しないわけではないので、しばらくしても解決策が見つからなかった場合は最初にあげていた方法ですることにします。
もうしばらく解決はたてないので、もし他の方法が分かった方がいましたら教えていただけると嬉しいです。
宜しくお願いしますm(_ _)m
ー補足ー
最初にあげていた方法とは、
b != a && c != a && d != a
または、
! ( b == a || c == a || d == a )
の事です。(私は前者の方が好みですが)
説明不足で申し訳ありませんでしたm(_ _)m
Re: 条件式の簡略化
Posted: 2010年12月30日(木) 18:46
by bitter_fox
先ほどは素っ頓狂なことを書いて申し訳ありませんでした・・・
コード:
if ((a ^ b) + (b ^ c) + (c ^ d) != 0)
重複しそうだったり、もっと上手な書き方があるんじゃとも思ってしまいますが、とりあえずは、これで判断できます。。。
[hr]ちなみに、最初に挙げていた方法ってどんな方法ですか??
[hr]あれだと、if (b != a || c != a || d != a)になっちゃうのか・・・orz
Re: 条件式の簡略化
Posted: 2010年12月30日(木) 18:50
by たいちう
(1)
b != a && c != a && d != a
(2)
! ( b == a && c == a && d == a )
(3)
! ( b == a || c == a || d == a )
(4)
(b - a) * (c - a) * (d - a) != 0
(3)の書き間違いだと思いますが、(2)は(1)と等価ではないですよ。
何をもってスマートというかは人それぞれです。
おそらく(1)か(3)を選ぶ人が多数派でしょう。
Re: 条件式の簡略化
Posted: 2010年12月30日(木) 18:58
by a5ua
条件式が3つ程度なら、そのまま書きますね
無理にまとめようとすると、こんな感じかな
コード:
int judge(int a, const int cond[], int n)
{
int i;
for (i = 0; i < n; ++i) {
if (a == cond[i]) {
return 0;
}
}
return 1;
}
int main(void)
{
int a = 4;
int cond[] = {1, 3, 5};
if (judge(a, cond, 3)) {
// do something
}
return 0;
}
b, c, dに相当する値を配列に格納して、ループを使って判定しています。
Re: 条件式の簡略化
Posted: 2010年12月30日(木) 19:16
by ライス
bitter_foxさん、たいちうさんご返信ありがとうございます。
てっきり、
b != a && c != a && d != a
を…
b , c , d != a
のように簡単にできる方法があるかと思っていましたが、そのような方法は無いという解釈でよろしいのでしょうか?
(b , c , d != a というのは間違っていると思いますが、このような感じでという事です。)
>>(3)の書き間違いだと思いますが、(2)は(1)と等価ではないですよ。
ご指摘ありがとうございます。
トピック内の ! ( b == a && c == a && d == a ) を、 ! ( b == a || c == a || d == a ) に書き換えさせていただきました。
a5uaさんご返信ありがとうございます。
3つ程度なら私もそのまま書くのですが、それが3つ程度じゃないんですよね^^;(分かりやすいように3つにしていましたが…)
>>b, c, dに相当する値を配列に格納して、ループを使って判定しています。
このような方法もあるのですね。
さっそく試してみます。
Re: 条件式の簡略化
Posted: 2010年12月30日(木) 20:52
by ライス
皆さんありがとうございました!
おかげで大変勉強になりました。
今回はa5uaさんの方法がやりたいことにあっていたので、そちらの方法でやらさせていただきました。
おかげでソースが300行程短くなりました^^;
本当にありがとうございましたm(_ _)m