ページ 1 / 1
if文を楽に書く
Posted: 2009年1月13日(火) 17:17
by 涼太
if(A == 0 ||
B == 5 ||
C >= 4 ・・・) ;
みたいにいくつかの条件のうちあてはまってたら処理をする
と書くのが普通ですが
A == 0,B == 5,C >= 4 ・・・
等のように条件を書いてソースを見やすくはできないでしょうか?
このようなやり方でなくてもソースが短く見やすく書ければ助かります。
C++ VS2005 XP
Re:if文を楽に書く
Posted: 2009年1月13日(火) 18:15
by 御津凪
どこまで定型的な条件になるかによって変わりますが、短くするなら、
#define IF_OR2(b1,b2) if((b1)||(b2))
#define IF_OR3(b1,b2,b3) if((b1)||(b2)||(b3))
#define IF_OR4(b1,b2,b3,b4) if((b1)||(b2)||(b3)||(b4))
#define IF_OR5(b1,b2,b3,b4,b5) if((b1)||(b2)||(b3)||(b4)||(b5))
#define IF_OR6(b1,b2,b3,b4,b5,b6) if((b1)||(b2)||(b3)||(b4)||(b5)||(b6))
とマクロ定義(上記は6条件まで用意)して、
IF_OR3(A == 0,B == 5,C >= 4)
で出来ます。(ちょっと使いづらいと思いますが)
もし、
> A == 0,B == 5,C >= 4 ・・・
複数の箇所で同様の条件式があれば、その条件式をまとめてマクロにしてしまえば
とりあえずすっきりします。(ソースコードの解読がしにくくなりますが…)
Re:if文を楽に書く
Posted: 2009年1月13日(火) 21:09
by box
素直に書くのが得策でありましょう。
マクロなどを使った結果、ソースコードの可読性が
低くなったのでは何にもなりません。
Re:if文を楽に書く
Posted: 2009年1月13日(火) 22:21
by Libra
//条件---------------------------
bool A = ( a != 0 ) ;//aは0以外よ
bool B = ( b == 5 ) ;//bは5なんだ
bool C = ( c >= 4 ) ;//cは4以上じゃ
bool D = ・・・・・
if( A || B || C ・・・・){
・・・・・
・・・
}
こんなのはどうでしょうか?
Re:if文を楽に書く
Posted: 2009年1月14日(水) 00:22
by たいちう
> 等のように条件を書いてソースを見やすくはできないでしょうか?
> このようなやり方でなくてもソースが短く見やすく書ければ助かります。
何が見やすいかは好みにもよると思うけど、
私としては御津凪さんのマクロはありえない。
ご本人も同意してくれると思いますが。
Libraさんの方法は使うことがあります。
boolの変数名はもっと条件を直接表現する名前にすることが多いです。
また個々の条件によっては、次のことを考慮しないと、
元の式と違う実行結果になります。
http://okuyama.mt.tama.hosei.ac.jp/unix ... e27-1.html
> 論理積については,第1オペランドが 0 ならば,第2オペランドを評価しません。
> 論理和については,第1オペランドが 0 に等しくなければ,第2オペランドを評価しません。
涼太さんが冗長に思うif文を省略せずにそのまま載せてみてはいかがですか?
if (A == 0 || B == 5 || C >= 4)
;
については、これ以上楽には書けないと思いますが。
Re:if文を楽に書く
Posted: 2009年1月14日(水) 01:50
by 御津凪
> 私としては御津凪さんのマクロはありえない。
私自身、上記で書いたマクロの使い方はまずしません。
ではなぜ書いたのかというと、マクロでどう短く出来るかなと即席で考えたものでして、
よくよく考えると、ぜんっぜん短くなってませんしね…。
(もっと短くしようとすると逆に使えないし)
と、いうわけでアレは駄目な例としておいてください^^;
後者のマクロの方法でも、使い方によってはまずいので没。
(限定的に使うのであれば大丈夫かもしれないが)
結局長くても条件文は直接書いておいた方が一番です。
バグ防止にも見やすさ的にも。
Re:if文を楽に書く
Posted: 2009年1月18日(日) 13:17
by TOMORONI
汎用性を保ったまま組み込みの文を改良することは、ほぼ不可能で無意味です。
質問の意図もif文そのものを改良したい訳ではないと思います。
何か目的があって初めて最適な手段が発生します。
どんなことを実現したいのか教えてください。
きっと力になれると思います。
Re:if文を楽に書く
Posted: 2009年1月18日(日) 16:13
by SCI
> 涼太さん
たいちうさんも上で挙げていますが、論理積で書くと、例えば以下のようになりますか。
#include <stdio.h>
int main(void)
{
int n;
printf("数字を入力してねっ -> "), scanf("%d", &n);
/* 普通のif文 */
if (n < 0 || n == 5 || 8 < n)
{
printf("にゃんにゃん\n");
}
/* &&演算子の式評価に依存してみる */
(n < 0 || n == 5 || 8 < n) && printf("あぅあぅ\n");
return 0;
}
で、書いてみて思ったこと。大して見やすくならない(笑)
また、elseに相当する排他条件分岐ができないので、むしろ汎用性に欠けますね。
さらに、&&のあとに書けるのは式(式文ではない)のみなので、ますます限定的です。
逆に、コードのトリッキーさを競う場では使われそうです。
やっぱり普通に書くのが一番だと思いますよv
Re:if文を楽に書く
Posted: 2009年1月18日(日) 16:55
by たいちう
SCIさん
> たいちうさんも上で挙げていますが、論理積で書くと、例えば以下のようになりますか。
もしかして私の意図を誤解していませんか?
誤解でなければ別に構わないのですが。
int func();として、
if (x == 1 && func() == 1) {
...
}
これ↑と、これ↓は、
bool a = x == 1;
bool b = func() == 1;
if (a && b) {
...
}
結果が異なる場合がありますよ、という意図でしたが。
一応書くと、前者の場合、x == 1の場合のみfunc()が呼ばれますが、
後者の場合は常にfunc()が呼ばれます。
Re:if文を楽に書く
Posted: 2009年1月18日(日) 17:48
by lbfuvab
#define hoge(a,b,c,d) (((a)<8 && (a)>-1) && ((b)<8 && (b)>-1) && ((c)[(a)][(b)]==(d)))
if(hoge(a,b,c,d))
puts("あーだこーだ");
こんなんですかね
Re:if文を楽に書く
Posted: 2009年1月18日(日) 19:17
by SCI
たいちうさん
誤解してました(笑)
>また個々の条件によっては、次のことを考慮しないと、
>元の式と違う実行結果になります。
>
http://okuyama.mt.tama.hosei.ac.jp/unix ... e27-1.html
>> 論理積については,第1オペランドが 0 ならば,第2オペランドを評価しません。
>> 論理和については,第1オペランドが 0 に等しくなければ,第2オペランドを評価しません。
論理演算子の評価順を、ネガティブなイメージで述べていたのですね。
私はこの下の部分だけみて、評価順を利用して書くことを言っていると思っちゃいました(汗
Re:if文を楽に書く
Posted: 2009年1月19日(月) 00:06
by TOMORONI
なんとなく、自分も書いてみました。
カンマで区切るのが難点ですね。要素数が判らないのはつらいです。
可変長引数のプログラミングって納得のいくものが書けたことないです。
今回も書いてみたんですが、やっぱり載せられません。
しょうがないので発想を変えてboostのassignを使った有名なトリックを使ってみました。
添付しておきます。…ファイルの添付って1個ずつしかできませんよね?
添付ファイルは4つですが、内2つはboostなので持ってたらダウンロードしないで、
<boost/lambda/lambda.hpp>
<boost/assign.hpp>
をインクルードするように書き換えれば大丈夫です。
/**/使って書いてあるところは"今は書けないけどこんな意味の式なんかが入ります"
って意味です。後ろにtrueとか続いてますが、あくまで動かすためだけのものです。
(先ほど自分の名前を間違えて投稿してしまいました。すみません。チェック入れときます。)
Re:if文を楽に書く
Posted: 2009年1月19日(月) 00:08
by TOMORONI
main.cpp
Re:if文を楽に書く
Posted: 2009年1月19日(月) 00:10
by TOMORONI
assign.hpp
Re:if文を楽に書く
Posted: 2009年1月19日(月) 00:10
by TOMORONI
lambda.hpp
Re:if文を楽に書く
Posted: 2009年1月19日(月) 00:25
by TOMORONI
ってすみません。単体で貼り付けても参照元が無かったら意味ないですね。板を汚してしまいました。
本当にすみません。あの、もしboostを導入していたら使ってみて下さい。ってことで。
管理人さんもし気が付いたら上の2つの添付ファイル(main以外)を消していただけますか?
ご迷惑をおかけします。今度からちゃんとキーを設定します。
Re:if文を楽に書く
Posted: 2009年1月19日(月) 01:18
by tk-xleader
C++であれば、これでよいのでは?
#include<cstdio>
using namespace std;
class Bool_op{
bool b;
Bool_op():b(false){}
Bool_op& operator,(bool op){
b=b||op;
return *this;
}
operator bool(){bool temp=b;b=false;return temp;}
}bool_expr;
int main()
{
int a,b,c;
printf("適当に整数を3個入力してください:");
scanf("%d%d%d",&a,&b,&c);//適当に整数を入力させる。
if(bool_expr,a!=0,b==5,c>=4)puts("条件に合致しました");
else puts("残念ながら、条件に合致しませんでした。");
return 0;
}
カンマ演算子(呼び方合ってるかな?)はオーバーロードできるので、適当にクラスを用意して、それとboolに対してオーバーロードしています。
1:25 少し訂正。
Re:if文を楽に書く
Posted: 2009年1月19日(月) 16:51
by JT
フラグを一つ立ててそれに付随したCase文を書くのはどうでしょうか?